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 以来发生了一些变化。
这是我的问题:
- 我用于注册自定义图形的方式 class 正确吗?
- 如果不是,正确的方法是什么?
- 自 XE8 以来似乎有所不同,注册我的图形组件的新正确方式是什么?
- 有没有其他人遇到同样的问题?他是怎么解决的?
- 这可能是 RAD Studio 的一个新错误,还是问题出在我这边?
这很可能是智能加载的副作用,IDE适用于设计时包。您可以通过在包的注册过程中调用 ForceDemandLoadState(dlDisable)
来覆盖此行为。
有关此内容的更多信息,请参阅比 XE8 更新的 Delphi 版本的文档:Explicitly disabling smart loading of components in a design-time package
我正在编写一个 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 以来发生了一些变化。
这是我的问题:
- 我用于注册自定义图形的方式 class 正确吗?
- 如果不是,正确的方法是什么?
- 自 XE8 以来似乎有所不同,注册我的图形组件的新正确方式是什么?
- 有没有其他人遇到同样的问题?他是怎么解决的?
- 这可能是 RAD Studio 的一个新错误,还是问题出在我这边?
这很可能是智能加载的副作用,IDE适用于设计时包。您可以通过在包的注册过程中调用 ForceDemandLoadState(dlDisable)
来覆盖此行为。
有关此内容的更多信息,请参阅比 XE8 更新的 Delphi 版本的文档:Explicitly disabling smart loading of components in a design-time package