德尔福 - 如何从XE8开始正确注册图形类?



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

我最初是用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 以来发生了一些变化。

以下是我的问题:

  • 我用于注册自定义图形类的方式是否正确?
  • 如果没有,正确的方法是什么?
  • 自 XE8 以来似乎有些不同,注册我的图形组件的新正确方式是什么?
  • 还有其他人遇到同样的问题吗?他是怎么解决的?
  • 这可能是一个新的 RAD Studio 错误,还是问题出在我这边?

这很可能是 IDE 应用于设计时包的智能加载的副作用。可以通过在包的注册过程中调用ForceDemandLoadState(dlDisable)来覆盖此行为。

有关此内容的更多信息,请参阅比 XE8 更新版本的 Delphi 的文档:显式禁用设计时包中组件的智能加载

最新更新