我想将QC中的修复应用到Delphi 2009单元(DBClient,因为它发生).我知道我需要将设备复制到另一个目录并对副本进行更改.然后我如何让Delphi编译该单元并使用它来支持已经存在的DCU?
我需要在Classes.pas中修补一个方法
(TReader.ReadString - 我想强制它使用指定的代码页,而不是系统默认值).
如果我将Classes.pas复制到我的项目中,我最终将不得不重建整个VCL.有没有(简单)方法在运行时修补方法?
我熟悉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 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 ,将其从更改function为procedure添加两个参数:
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单元:
VCL单元编译,但是,当我编译我的应用程序时,我得到"内部错误:AV0047C6C7-R000004CC-0",无论目标目标(Win32/Win64;调试/发布),请参阅https://quality.embarcadero. com/browse/RSP-18455 - …
delphi ×4
delphi-2009 ×2
vcl ×2
compilation ×1
delphi-2007 ×1
delphi-units ×1
icons ×1
windows ×1