Delphi - 自 XE8 以来如何正确注册图形 class?

Delphi - How to correctly register a graphic class since XE8?

我正在编写一个 Delphi 包,它提供了一个新的自定义 TGraphic 对象,允许在 VCL 组件(如 TImage)中读取新的图像格式。

我最初是用 RAD Studio XE7 开发这个包的,效果很好。然而,我最近迁移到了更新的 RAD Studio 编译器版本,虽然我的包在那个新版本上继续正常工作,但我注意到一个以前从未出现过的奇怪错误。

我有一个包含多个组件的表单,其中一些是 TImage 组件。打开 IDE 后,我第一次在设计时打开我的项目时,所有包含我的自定义 TGraphic 组件的 TImage 组件都丢失了它们的内容。如果我关闭然后重新打开项目,图像会重新出现,并且在我关闭并重新打开我的 IDE.

之前错误不再发生

我深入研究了我的代码以了解可能导致问题的原因。为了注册我的自定义 TGraphic 组件,我使用 class 初始化部分,我在其中编写了以下代码:

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