相关疑难解决方法(0)

如何从VCL重新编译特定单元?

我想将QC中的修复应用到Delphi 2009单元(DBClient,因为它发生).我知道我需要将设备复制到另一个目录并对副本进行更改.然后我如何让Delphi编译该单元并使用它来支持已经存在的DCU?

delphi vcl compilation delphi-2009 delphi-units

9
推荐指数
1
解决办法
3395
查看次数

如何在Classes.pas中修补方法

我需要在Classes.pas中修补一个方法

(TReader.ReadString - 我想强制它使用指定的代码页,而不是系统默认值).

如果我将Classes.pas复制到我的项目中,我最终将不得不重建整个VCL.有没有(简单)方法在运行时修补方法?

delphi delphi-2009

7
推荐指数
2
解决办法
1985
查看次数

我可以重新编译Delphi IDE使用的.PAS文件吗?

我熟悉Jeff Atwood关于错误总是程序员错误的文章,但我相信我确实在Delphi .pas文件中发现了一个错误.

具体来说,我使用的是Delphi 2007,错误发生在DBCommon.pas文件的第955行,该文件位于我的机器上:

C:\ program files\codegear\rad studio\5.0\source\Win32\db\DBCommon.pas

代码是这样的:

...
  FieldIndex := StrToInt(Token);
  if DataSet.FieldCount >= FieldIndex then
    LastField := DataSet.Fields[FieldIndex-1].FieldName else
...
Run Code Online (Sandbox Code Playgroud)

如果"Token"的值为零,那么我们尝试访问DataSet.Fields的索引-1,从而导致列表索引超出边界错误.

这个错误不会引发给用户,因为它在它达到高位之前就被处理了,但是每次发生这种情况时调试器都会中断是非常恼人的.

我可以"忽略这个异常类型",但索引越界错误很常见,我不想普遍忽略它们.

导致FieldIndex为零的情况是当您有一个SELECT语句,其ORDER BY包含一个函数时,如:

ORDER BY
  CASE WHEN FIELD1 = FIELD3 THEN 1 ELSE 2 END
 ,CASE WHEN FIELD2 = FIELD4 THEN 1 ELSE 2 END
Run Code Online (Sandbox Code Playgroud)

我可以修复DBCommon.pas中的错误,但Delphi不会重新编译,我的更改不会生效.如果我重命名.DCU文件,那么它只是抱怨无法找到"DBCommon.dcu".

所以(最后)我的问题是:我可以用我的修复程序重新编译DBCommon.pas,如果是的话,怎么样?

delphi delphi-2007

5
推荐指数
1
解决办法
4132
查看次数

除了ICON_BIG之外,如何让Delphi 10.2 Tokyo尊重ICON_SMALL(窗口标题栏图标)?

如何在Delphi 10.2中实现以下目标:我需要Delphi自动设置大图标,而不是每个窗口的大小图标.我需要有机会,对于某些表单,以及TApplication,在运行时更改图标.我想要在不修改VCL.Forms.pas的情况下完成(小图标是在窗口标题栏中显示的图标,从窗口标题向左).

有一个功能TCustomForm:

function GetIconHandle: HICON;
Run Code Online (Sandbox Code Playgroud)

不幸的是,Delphi只设置了大图标句柄,例如,这里有一个引用来自VCL.Forms.pas:

  SendMessage(Handle, WM_SETICON, ICON_BIG, GetIconHandle);
Run Code Online (Sandbox Code Playgroud)

如您所见,上面的代码只设置了大图标句柄,但我还需要设置小图标句柄,因为我使用的.ICO文件包含大小图标的不同图像.

让我总结一下大图标和小图标之间的区别,因为即使是微软的文档也几乎没有说明它.以下是主要区别:

  • 窗口标题栏上显示小图标图像.

  • 如果任务栏很粗,则在Windows任务栏中显示大图标图像(通常位于屏幕的底部); 按Alt + Tab时,也会显示大图标图像.

有关大图标和小图标的更多信息,请参阅https://blog.barthe.ph/2009/07/17/wmseticon/.

Delphi通过仅设置大窗口句柄,有效地逐步取出替代图像,以获得窗口标题上显示的较小图标.如果只给出大图标而不是小图标,则Windows会将图像从较大的图标重新采样到较小的图标,质量会恶化,并且会丢失更小,更简单图像的主要概念.

请参阅示例图片courtesy sanyok.标有v7.4.16的左栏是一个程序的截图,该程序使用设置ICON_BIG和的代码编译ICON_SMALL.标题为v7.4.16.22的右栏是来自同一程序的截图,它没有明确设置小图标和大图标,只是分配TIcon给一个表单,然后Delphi使用其标准代码只分配大图标,所以Windows标题栏中的图像由Windows从大图标调整大小.您可能会看到标准Delphi行为导致质量变差.

大与小图标

过去,我正在更改VCL.Forms.pas从静态到虚拟的接口部分中的GetIconHandle ,将其从更改functionprocedure添加两个参数:

procedure GetIconHandle(var Big, Small: HICON); virtual;
Run Code Online (Sandbox Code Playgroud)

所以VCL.Forms.pas中的后续代码如下所示:

var
  Big, Small: HICON;
begin    
  [...]
  GetIconHandle(Big, Small);
  SendMessage(Handle, WM_SETICON, ICON_BIG, LParam(Big));
  SendMessage(Handle, WM_SETICON, ICON_SMALL, LParam(Small));
  [...]
Run Code Online (Sandbox Code Playgroud)

是否有可能在不修改VCL.Forms.pas?的情况下轻松完成此操作?

我通过修改VCL单元解决了Delphi 2007中的问题,但由于以下原因,我无法再修改Delphi 10.20 Tokyo中的VCL单元:

  1. VCL单元编译,但是,当我编译我的应用程序时,我得到"内部错误:AV0047C6C7-R000004CC-0",无论目标目标(Win32/Win64;调试/发布),请参阅https://quality.embarcadero. com/browse/RSP-18455 - …

windows delphi icons vcl delphi-10.2-tokyo

3
推荐指数
1
解决办法
1064
查看次数