0

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

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

我的测试是在我的包中构建表单并从我的主机应用程序加载表单“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;
4

1 回答 1

0

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

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

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

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 中存在大量错误,请准备好调试它们。

于 2013-12-26T14:48:29.700 回答