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 -プラグインによって提供される実装が含まTBaseClassれています。TList<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 に答える