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

Posted

技术标签:

【中文标题】Delphi - 如何正确注册自 XE8 以来的图形类?【英文标题】:Delphi - How to correctly register a graphic class since XE8? 【发布时间】:2019-10-23 18:13:42 【问题描述】:

我正在编写一个 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 中? 是的。我编译并安装包,然后关闭并重新打开 IDE,一旦项目在设计时第一次打开,问题就会发生。 大概是在你之前的初始化部分中调用了 TImage 构造函数(?)。您是否尝试过在另一个 IDE 实例中调试一个实例来观察行为? 是的,我也这样做了,这实际上是我说在图形注册之前调用 TImage 构造函数的原因,因为我观察到了这种行为。该问题发生在一个演示项目中,该项目包含上述表格,其中包含几个 TImage,所有这些都放置在设计时。然而,图形注册初始化部分位于包端的一个类中。但我从未在任何初始化块中实例化任何 TImage,无论是在包中还是在演示代码中。 @Jean-MilostReymond 听起来绝对像是一个 IDE 错误。你的方法很好。您的项目所依赖的包应在加载任何表单之前完全加载。请与 Embarcadero 一起 file a bug report。 【参考方案1】:

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

有关此内容的更多信息,请参阅比 XE8 更新的 Delphi 版本的文档:Explicitly disabling smart loading of components in a design-time package

【讨论】:

这对我有用,非常感谢。但是,正如 Remy Lebeau 所提到的,我仍然会为 Embarcadero 填写错误报告,因为在我看来,图形过滤器应该始终能够在组件使用之前进行注册,无论选项如何,尤其是如果它是默认启用。完成后我会在此处发布链接。 当然你可以这样做,并且请在你这样做之后在评论中发布报告编号。另一方面,我的答案中链接的文档描述了与您类似的案例。注册样式与注册图形类没有太大区别。

以上是关于Delphi - 如何正确注册自 XE8 以来的图形类?的主要内容,如果未能解决你的问题,请参考以下文章

Delphi XE8 如何去掉默认的代码连接线

DELPHI XE8 远程调试

Delphi XE8 TStyleBook的使用

Delphi XE8帮助中的REST相关内容。

求救,这个delphi xe8要怎么破解

Delphi XE8,C++ Builder XE8,RAD Studio XE8 官方 ISO 文件下载,附激活工具