【问题标题】:Delphi 2010 - Modular application, how to get class properties in the host app?Delphi 2010 - 模块化应用程序,如何在主机应用程序中获取类属性?
【发布时间】:2013-12-26 11:59:58
【问题描述】:

我对模块化应用程序机制做了一些测试。

我尝试的基本方法是在运行时加载包并使用其中的类。

我的测试是在我的包中构建表单并从我的主机应用程序加载表单“TCustOrder”,测试非常成功。

问题是:

我的 TCustOrder 具有名为“Client:TObject”的属性,我如何从主机应用程序访问此属性。

代码:

var x : HRESULT ;
    AClass : TPersistentClass ;
    FormOrder : TForm ;

begin

x := LoadPackage('Cutorder.bpl') ;

if x <> 0 then
begin

      AClass := GetClass('TCustOrder');


      if AClass <> nil then
        FormOrder := TComponentClass(AClass).Create(Application) as TForm;



          if Assigned(FormOrder) then
             begin

              FormOrder.Show
             end;

end;

【问题讨论】:

  • 需要在宿主编译的单元中声明类型。

标签: delphi plugins module delphi-2010 bpl


【解决方案1】:

应用程序应该知道要使用它的类的基础。接口、协议、规范,随便你说。特定的包提供了它的某种专门的实现。

所以基于 BPL 和常规对象的整体结构应该是您可以在 VCL 本身中观察到的结构。

Base.BPL - 包含插件提供的实现的TBaseClassTList&lt;TBaseClass&gt;。它还包含主程序使用它所需的所有虚拟方法和属性。很方便有

class constructor TBaseClass.CreateClass;
begin
  MyList := TList<TBaseClass>.Create;
end;

class destructor TBaseClass.DestroyClass;
begin
  FreeAndNil(MyList);
end;

class procedure TBaseClass.RegisterClass;
Begin
  MyList.Add(Self);
end;

class procedure TBaseClass.UnRegisterClass;
Begin
  MyList.Remove(Self);
end;

App.Exe 会在其运行时包中列出 Base.BPL(在项目选项中),并将 Base.BPL 用作与插件的“交汇点”。

Plugin.BPL 会将 Base.Bpl 列为必需的运行时包,并将其用作集合点。

TMyClass1 = class (TBaseClass);

...

initialization
   TMyClass1.RegisterClass;
finalization
   TMyClass1.UnRegisterClass;
end.  

我的 TCustOrder 具有名为“Client:TObject”的属性,我如何从主机应用程序访问此属性。

type  (** Base.BPL **)
  TBaseClass = class ...
    protected function GetClient: TObject; virtual; abstract;
    public property Client read GetClient;
  ...
  end;

type  (** Plugin.BPL **)
  TMyClass1 = class(TBaseClass) ...
    protected function GetClient: TObject; override;
  ...
  end;

注意,至少 Delphi XE2 在卸载动态包时倾向于破坏字符串数组常量。不知道它是否适用于 D2010。在 XE4 中已修复。所以“龙可能在这里”。在现代 Delphi 中,RTL/VCL 中存在大量错误,请准备好调试它们。

【讨论】:

  • 只需“使用源代码”和“学习历史”。我只是重述了 VCL 的组织方式以及 Delphi 1/2/Lazarus 与 v.3 之后的所有 Delphi 版本有什么区别
猜你喜欢
  • 2016-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-21
  • 1970-01-01
相关资源
最近更新 更多