5

単純なフォーム内にあるBPLをロードするアプリケーションがあります。

このフォームは、メインアプリケーションのオプションオプションです。

BPLは正しく読み込まれ、フォームは正しく表示されますが、bpl内のフォームのパブリックメソッドとプロパティにアクセスする方法がわかりません。

誰かが簡単な例を提供できますか?

私のコード:

// Load the BPL on aplication Load
LoadPackage( 'About.bpl' );

// CAll for TForm1 inside the About.BPL
var
  AClass: TClass;
  AForm: TForm;
begin

    AClass := GetClass('TForm1');
    if AClass <> nil then
  begin
        Application.CreateForm(TComponentClass(AClass), AForm);
        AForm.Show;
    end;

// The unit TForm1 inside the BPL package
unit Unit1;

interface

uses
    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
    Dialogs, StdCtrls;

type
    TForm1 = class(TForm)
        Button1: TButton;
        Label1: TLabel;
        procedure Button1Click(Sender: TObject);
    private
        { Private declarations }
    public
        { Public declarations }
        PublicMthd;
    end;

var
    Form1: TForm1;

implementation

{$R *.dfm}

Procedure TForm1.PublicMthd;
Begin
    ShowMessage('Inside call');
End;

initialization
    RegisterClass(TForm1);

finalization
    UnRegisterClass(TForm1);

end.

Tform1の「PublicMthd」にアクセスするにはどうすればよいですか?

4

2 に答える 2

10

動的にロードされる bpl に TOptionalForm を含めることの利点の 1 つは (「オプション」ビットからこれを想定))、アプリケーションが TOptionalForm クラスの定義を具体的に保持することを回避することです (それはパッケージに含まれるユニットにあり、そこにのみあります)。 )。

つまり、次
のいずれ かを使用しない限り、アプリケーションはそれについて何も 知ることができませ
ん。およびメソッド (D2010 以降を使用している場合) - 内部で TOptionalForm として型キャストする基本クラス パラメータ (または TObject/ポインタ) を受け入れる bpl からのいくつかの外部ルーチン。


これは非常に曖昧で一般的なものであり、コードを改良するにはより正確にする必要があります...

于 2011-12-19T08:04:08.040 に答える
2

BPL を動的にロードする必要がある場合は、- を使用する必要があります。

  • 抽象クラス(より Delphi に似ているか)
  • インターフェイス(私はよりクリーンで、より良い経験を持っていると考えています)

メイン アプリケーションとフォーム BPL の両方で使用されるインターフェイスのみのユニットに配置されます。

メイン アプリケーションと動的にロードされるアプリケーションの両方で静的に使用される、中間の「コントラクト/インターフェイス」BPL を使用します。

インターフェイスを使用する場合は$WEAKPACKAGEUNIT、アプリケーションから BPL をさらに分離するためのディレクティブも確認できます。

コメントにコメントするには、DLL エクスポートまたは RTTI を使用することで、基本的に、型と名前空間の共有である BPL のポイント全体をバイパスします。

于 2011-12-27T12:24:42.857 に答える