4

私はこれをオンラインで投稿しました: ShowDLL からのフォームTScrollBox

私がやろうとしているのは、Delphi でフォームを呼び出して表示することTScrollBoxです。ShowまたはとしてではなくShowModal

例ですが、DLL を使用していません:

Form1.Parent:= ScrollBox;
 Form1.Show;

内部にフォームがある DLL からこの例を使用するにはどうすればよいですか

誰でも例を挙げてもらえますか?

よろしく、

4

3 に答える 3

6

DLL とホスト実行可能ファイルの間で Delphi オブジェクトを渡すことはできません。これは、オブジェクトが作成されたモジュールでのみオブジェクトを操作できるためです。ランタイム パッケージを使用していれば、この制限を回避できます。

フォームを作成して表示した DLL から関数をエクスポートできます。関数は次のようになります。

function ShowMyForm(ParentWindow: HWND): Pointer; stdcall;

上で説明したのとまったく同じ理由で、親を Delphi オブジェクトとして渡すことはできないことに注意してください。

また、フォームの親が実行可能ファイルのコントロールになるように指定することもできません。したがって、親のウィンドウ ハンドルを渡す必要があります。

実装は次のようになります。

function ShowMyForm(ParentWindow: HWND): Pointer; stdcall;
var
  Form: TMyForm;
begin
  Form := TMyForm.CreateParented(ParentWindow);
  Form.Show;
  Result := Pointer(Form);
end;

次のように呼び出します。

Form := ShowMyForm(ScrollBox.Handle);

完了時にフォームを破棄する関数も提供する必要があります。

procedure DestroyMyForm(Form: Pointer); stdcall;
begin
  TMyForm(Form).Free;
end;

また、ウィンドウの再作成に注意する必要があります。ホスト ウィンドウが再作成された場合は、子フォームを手動で再作成する必要があります。

要するに、あなたが試みていることはかなり脆弱です。私があなたなら、別のアプローチを探すでしょう。

于 2013-06-04T08:19:43.883 に答える
0

まず、コードのアイデアと構築は私のアイデアであり、dll ファイルに格納されたフォームを表示する簡単な方法として使用することを目的としていました。

主なアイデアは、必要なものをdllに入れ、呼び出してTscrollBoxに表示することでした。これは、実際には完全に機能するデータベースまたはプログラムの他のパスであり、実際にはパラメーターをやり取りしたくない場合があります。開始または終了しました。

私はオンラインで質問を投稿しましたが、多くの人は私が何を説明しようとしているのか、何をしたいのかを本当に理解していませんでした。 dll ファイルでは、スクロール ボックスはメイン プロジェクトの dll の外部にありました。

私がやりたかったのは、フォームを呼び出して、スクロールボックスにその親として表示することだけでした。

多くの人がアイデアを提示してくれたので、私はこのコードのパスを主張しません。すべての人に感謝します。

提示されたコードは、質問をオンラインで投稿するずっと前にすでに作成されていましたが、フォームがスクロールボックスの外側にしか表示されなかったため、意図したとおりに機能しませんでした。

次に、友人がコード行を変更する必要があると指摘したとき、Board4All を使用してプロジェクト全体をオンラインに投稿しました。

彼はニックネームしか持っておらず、私が使用したデルファイのバージョンによっては、それが機能するかどうかわからないと言いました.

次に、コード行を調整したところ、彼がすべてのクレジットに値するように機能するようになりました。次に、コードを投稿して、他の人がプロジェクトでコードを使用できるようにすることにしました。

于 2013-06-12T15:19:04.420 に答える