2

DLL 内にフォームを作成しており、そのフォームをホスト アプリケーション内に埋め込みたいと考えています。親コントロールを単純に DLL に渡すことはできません。しかし、この DLL フォームに EXE フォーム ( 内) の親を与える必要がありますTPanel

ホスト アプリケーション内に埋め込まれた DLL 内でこのフォームを作成し、パネル内でクライアントとして配置するにはどうすればよいですか?

私が構築しているのは、フォームの左半分のツリー ビューと、スナップイン コンソールのような右側の空のプレースホルダー パネルで構成されるセットアップ モジュールです。考えられる各モジュールは、ツリー ビューの各ノードに対応する DLL で表されます。


編集

前に言及しなかった重要な点の 1 つは、DLL を実装する理由は、各セットアップ モジュールが異なる言語で開発される可能性があるためです。ほとんどは Delphi ですが、これがベースとするソフトウェア パッケージは、Delphi 以外の言語 (C# など) で構築されたさまざまなアプリケーションで構成されています。それらの開発者は、統合される独自のセットアップ モジュールを設計します。

4

3 に答える 3

4

これがすべての問題に対処するかどうかはわかりません (フォームを解放することを保存します。関数を公開して、dll フォームを含む外部で何かを実行します)。

library testdll;

uses dllunit in 'dllunit.pas' {Form1}, windows;

procedure callform(ParentForm: HWnd);
// simple test, resource management is necessary on the form.
var
  dllform: TForm1;
begin
  dllform := TForm1.Create(nil);
  dllform.Show;
  Windows.SetParent(dllform.Handle, ParentForm);
end;

exports
  callform;

end.


program mainprogram;

procedure callform(ParentHandle: THandle); external 'testdll.dll';

procedure TForm1.Button1Click(Sender: TObject);
  begin
    callform(Panel1.Handle);
  end;

前述のように、dll フォームに機能を追加し始めると、他の問題が発生する可能性がありますが、(私にとって) dllunit.pas で設計されたフォームが、Panel1 を親としてメイン フォームのプロジェクトに配置され、期待どおりに動作しています。しかし、言われたように、これは単なるスタートとして意図されていました.

于 2013-09-03T01:35:00.933 に答える
4

親が別の Delphi プログラムである場合、DLL を BPL として作成するだけで、このような問題は発生しません。パッケージを使用して新しい機能をプログラムに簡単にプラグインする方法については、JVCL のプラグイン システムを参照してください。

于 2013-09-02T17:59:47.237 に答える