我正在编写一个Delphi包,该包提供了一个新的自定义TGraphic对象,从而允许在VCL组件(如TImage)中读取新的图像格式。
我最初使用RAD Studio XE7开发了此程序包,并且运行良好。但是,我最近迁移到了RAD Studio编译器的较新版本,尽管我的软件包在该新版本上仍能正常工作,但我注意到一个从未出现过的奇怪错误。
我有一个包含多个组件的表单,其中一些是TImage组件。打开IDE之后,我在设计时第一次打开项目时,所有包含我的自定义TGraphic组件的TImage组件都会立即释放其内容。如果我关闭然后重新打开项目,则图像会重新出现,并且在关闭并重新打开IDE之前不会再发生该错误。
我挖了我的代码以了解可能导致此问题的原因。要注册我的自定义TGraphic组件,我使用类初始化部分,在其中编写了以下代码:
initialization
begin
Vcl.Graphics.TPicture.RegisterFileFormat('svg', 'Scalable Vector Graphics', TWSVGGraphic);
end;
但是我发现,从XE8编译器版本开始,在初始化部分之前调用了TImage构造函数,因此显然引起了上述问题。自XE8以来的所有编译器版本均会受到影响,但是此错误从未在XE7或更早版本上发生。自XE8以来,情况发生了变化。
这是我的问题:
最佳答案
这很可能是IDE将智能加载应用于设计时程序包的副作用。您可以通过在包的“注册”过程中调用ForceDemandLoadState(dlDisable)
来覆盖此行为。
有关此问题的更多信息,请参见比XE8更新的Delphi版本的文档:Explicitly disabling smart loading of components in a design-time package
关于Delphi-自XE8起如何正确注册图形类?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56507846/