我有一个在定义部分中定义TBla和以下代码的单元:

initialization
  RegisterClass(TBla);
  showMessage('registered');


本机位于包装内。好。

在一个按钮上,单击我的应用程序,我有以下代码:

  LoadPackage('C:\temp\testes_packs\pack1\Package1.bpl');
  pc := GetClass('TBla');
  if pc = nil then
    ShowMessage('didnt work');


当我单击按钮时,将显示“已注册”消息。但是,“辛勤工作”也显示出来。这表明初始化被调用,但是由于某种原因,寄存器类不起作用。

好的,为了证明LoadPackage是问题,我将我的单元(包含TBla类)直接包含到我的项目中,并删除了loadPackage行,然后显示了“已注册”消息,并且getClass起作用了。

有任何想法吗?

最佳答案

您的软件包需要在其“需要”列表中包括“ rtl”和“ vcl”。这样,类注册列表将成为共享包中的列表,而不是您自己的包私有的。

另外,您的应用程序需要编译为使用运行时程序包。特别是,“ rtl”和“ vcl”软件包必须位于其运行时软件包列表中。

如果不同时执行这两项操作,则一个模块使用的类注册列表将与另一模块使用的列表不同。它们都必须使用相同的模块,并且这样做的方法是确保两个模块都共享RTL公开的列表。

10-02 23:27