2011-10-20 52 views
3

我在dll中創建表單。沒有包。通過使用導出的過程調用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.ActiveForm)挖掘它,但我不知道它會工作。

調用TfrmAbout.Create(Application.MainForm)只是指定Application.MainForm負責窗體的銷燬,它應該與窗口層次結構無關,如果您在單獨的dll中創建窗體,我不確定您應該使用自動銷燬。

+0

是的,試過了。不幸的是,如果我添加form.ParentWindow:= parentHandle(作爲參數傳遞),表單會掛起並且不顯示。 – Lobuno

+0

這很奇怪,它應該工作。你可以更新你的問題,以顯示*何時設置ParentWindow屬性。另外,在你的代碼中有什麼'aHandle'?你應該只有一個應用程序句柄。 –

+0

ParentWindow是用來顯示一個窗體作爲另一個窗體的子窗口。這聽起來像這個問題是關於頂級窗口。 –

2

既然你不使用pacakges,你的EXE和你的DLL都有一個獨立的TApplication實例。您的DLL中沒有看到EXE中的TApplication.MainForm。更改TApplication.Handle不會使MainForm發生更改。查找其他方式來正確定位表單,但更好:使用包,如果不包含,則會遇到更多問題。

+1

有時您需要使用DLL。例如一個Office加載項。也就是說,如果包裝符合您的需求,包裝肯定會更乾淨。 –