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

标签 delphi components registration delphi-xe8 timage

我正在编写一个 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/

相关文章:

delphi - “元素数(256)与声明(65536)不同”从D2007迁移到XE8

c# - 用 Pascal 编写与 C# 代码等效的代码

delphi - 从阻塞套接字更改为非阻塞套接字有什么好处?

mysql - PHP注册到MYSQL数据库

Facebook 注册验证 : Permission denied to access property 'Arbiter'

delphi - 如何删除MANICON exe文件

具有两个或多个当前值的 Delphi 进度条

angular - 如何使用事件发射器触发子组件和父组件中的函数?

delphi - 如何提高Delphi框架的使用

php - SilverStripe MultiForm 不工作