Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi-如何正确注册XE8之后的图形类?_Delphi_Components_Registration_Delphi Xe8_Timage - Fatal编程技术网

Delphi-如何正确注册XE8之后的图形类?

Delphi-如何正确注册XE8之后的图形类?,delphi,components,registration,delphi-xe8,timage,Delphi,Components,Registration,Delphi Xe8,Timage,我正在编写一个Delphi包,它提供了一个新的自定义TGraphic对象,允许读取VCL组件(如TImage)中的新图像格式 我最初是用RAD Studio XE7开发这个包的,它工作得很好。然而,我最近迁移到了一个较新的RAD Studio编译器版本,尽管我的包在这个新版本上继续正常工作,但我注意到了一个以前从未出现过的奇怪错误 我有一个包含多个组件的表单,其中一些是TImage组件。打开IDE后,即我在设计时第一次打开项目时,所有包含自定义TGraphic组件的TImage组件都会释放其内容

我正在编写一个Delphi包,它提供了一个新的自定义TGraphic对象,允许读取VCL组件(如TImage)中的新图像格式

我最初是用RAD Studio XE7开发这个包的,它工作得很好。然而,我最近迁移到了一个较新的RAD Studio编译器版本,尽管我的包在这个新版本上继续正常工作,但我注意到了一个以前从未出现过的奇怪错误

我有一个包含多个组件的表单,其中一些是TImage组件。打开IDE后,即我在设计时第一次打开项目时,所有包含自定义TGraphic组件的TImage组件都会释放其内容。如果我关闭然后重新打开项目,图像会重新出现,直到我关闭并重新打开IDE,错误才会发生

我深入研究了我的代码,以了解可能导致问题的原因。为了注册自定义TGraphic组件,我使用类初始化部分,在该部分中我编写了以下代码:

初始化
开始
Vcl.Graphics.TPicture.RegisterFileFormat('svg','Scalable Vector Graphics',TWSVGGraphic);
结束;
然而,我发现,由于XE8编译器版本,TImage构造函数在初始化部分之前被调用,因此显然导致了上述问题。自XE8以来的所有编译器版本都会受到影响,但此错误从未在XE7或更早版本上发生过。因此,XE8之后发生了一些变化

以下是我的问题:

  • 我注册自定义图形类的方式正确吗
  • 如果没有,正确的方法是什么
  • 由于XE8之后似乎有所不同,注册图形组件的新的正确方式是什么
  • 还有其他人面临同样的问题吗?他是如何解决的
  • 这可能是一个新的RAD Studio bug,还是问题在我这边

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


      有关这方面的更多信息,请参阅Delphi比XE8更新版本的文档:

      在打开带有图像的表单之前,您的包是否已注册到IDE中?是的。我编译并安装软件包,然后关闭并重新打开IDE,当项目第一次在设计阶段打开时,问题就发生了。大概,TImage构造函数是在您之前的初始化部分被调用的(?)。您是否尝试过通过调试IDE的一个实例来观察行为?是的,我也这样做了,事实上这就是为什么我说在图形注册之前调用TImage构造函数的原因,因为我观察到了这种行为。这个问题发生在一个演示项目中,该项目包含上述表单,它本身包含几个TImages,都放在设计时。然而,图形注册初始化部分位于包端的一个类中。但我从来没有在任何初始化块中实例化过任何TImage,无论是在包中还是在演示代码中。@Jean MilostReymond听起来绝对像一个IDE bug。你的方法很好。项目所依赖的包应在加载任何表单之前完全加载。请和Embarcadero谈谈。这对我很有效,非常感谢。然而,正如Remy Lebeau所提到的那样,我仍然会为Embarcadero填写一份bug报告,因为在我看来,图形过滤器在被组件使用之前应该始终能够注册,无论选项是什么,尤其是在默认情况下启用的情况下。完成后我会在这里发布链接。当然,你可以这样做,并请在评论中发布报告编号。另一方面,我的回答中链接的文档描述了一个类似于您的案例。注册样式与注册图形类没有太大区别。