Delphi-自XE8起如何正确注册图形类?

Jea*_*ond 11 delphi components timage registration delphi-xe8

我正在编写一个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;
Run Code Online (Sandbox Code Playgroud)

但是我发现,从XE8编译器版本开始,在初始化部分之前就调用了TImage构造函数,因此显然引起了上述问题。自XE8以来的所有编译器版本均会受到影响,但是此错误从未在XE7或更早版本上发生。自XE8以来,情况发生了变化。

这是我的问题:

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

Uwe*_*abe 9

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

有关此问题的更多信息,请参见比XE8更新的Delphi最新版本的文档:显式禁用设计时程序包中的组件智能加载。