2011-10-20 15 views
3

私はdllでフォームを作成しています。パッケージはありません。Delphi:dllでフォームを配置する

procedure ShowAbout(const AppHandle: THandle); stdcall; 
    var 
    aHandle: THandle; 
    form: TfrmAbout;/my form in some other unit in the dll 
    begin 

    aHandle:= Application.Handle; 
    Application.Handle:= AppHandle; 

    form :=TfrmAbout.Create(Application); 
    form.ShowModal; 
    form.Free; 
    Application.Handle:= aHandle; 
    end; 

フォームが正しく表示され、問題はありません。今、私がしたいのは、poMainFormCenter(私はそれがメインフォーム(DLLを呼び出すフォーム)の上に常に表示したいということです)。

私はフォームを使ってみました:= TfrmAbout .Create(Application.MainForm);などが、ここで役立つだろう

どれトリック

+0

ウィンドウハンドルの代わりに 'Application'ポインタを渡す必要があります。それは粗末ですが、残念ながら他の方法では動作しません。 –

+3

絶対に 'Application'ポインタを渡さないでください。 VCLのあるインスタンスから別のインスタンスにオブジェクトを渡すことはできません。それにはランタイムパッケージを使用する必要があります。 –

答えて

7

VCL Positionのメカニズムは、アプリケーションの他のフォームがすべて同じバージョンのVCLで動作していることを前提としています。これは当然のことではないので、手動でフォームを配置する必要があります。

メインフォームのハンドルを渡してGetWindowRect()と呼んで、メインフォームの位置を確認します。次に、あなたのフォームがそのフォームの中心になる必要がある場所で作業する必要があります。ところで

procedure PositionForm(Form: TForm; MainWindow: HWND); 
var 
    MainBounds: TRect; 
    MainWidth, MainHeight: Integer; 
begin 
    if GetWindowRect(MainWindow, MainBounds) then 
    begin 
    MainWidth := MainBounds.Right-MainBounds.Left; 
    MainHeight := MainBounds.Bottom-MainBounds.Top; 
    Form.Left := MainBounds.Left + (MainWidth - Form.Width) div 2; 
    Form.Top := MainBounds.Top + (MainHeight - Form.Height) div 2 
    end; 

、あなたが渡しているハンドルがHWNDいうよりTHandleです。それに応じてコードを変更する必要があります。それは振る舞いを変えることはありませんが、論理的に正しいです。

+0

ありがとう!それは期待どおりに動作します。 – Lobuno

1

はあなたが親ウィンドウのハンドルにform.ParentWindow設定しようとしたことがありますが、PARAMとしてそれを渡す必要があり運。?? ShowAbout、またははApplicationオブジェクト(Application.ActiveFormのようなもの)からそれを掘り起こすことができますが、それが動作するかどうかはわかりません。

TfrmAbout.Create(Application.MainForm)を呼び出すと、Application.MainFormがフォームの破棄を担当しているだけで、ウィンドウ階層とは何も関係がありません。別のdllでフォームを作成した場合は自動破棄を使用する必要があります。

+0

はい、それを試みました。残念ながら、form.ParentWindow:= parentHandle(パラメータとして渡される)を追加すると、フォームがハングして表示されません。 – Lobuno

+0

それは奇妙です、それは動作するはずです。 *いつParentWindowプロパティを設定するかを表示するように質問を更新できますか?また、あなたのコードで 'aH​​andle'とは何ですか?あなたは1つのアプリハンドルしか持っていません。 –

+0

ParentWindowはあるフォームを別のフォームの子として表示するために使用します。この質問のように聞こえますトップレベルのウィンドウについてです。 –

2

pacakgesを使用しないので、EXEとDLLの両方に個別のTApplicationインスタンスがあります。あなたのEXEのTApplication.MainFormはあなたのDLLには見えません。 TApplication.Handleを変更しても、MainFormは変更されません。フォームを正しく配置するための他の方法を探しますが、より良い方法です:パッケージを使用すると、そうでない場合はさらに問題が発生します。

+1

DLLを使用する必要がある場合があります。たとえば、Officeアドインなど。それは、あなたのニーズに合っていれば、パッケージは確かにきれいだということです。 –

関連する問題