我正在编写一个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以来,情况发生了变化。

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

    这很可能是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/

    10-09 09:33