2011-05-13 62 views
3

我有一個表單正在被另一個表單打開。Delphi Modal表單位置

我設定的位置上poOwnerFormCenter,使新的形式打開這裏原來是

然而,當我提出這個新的形式,然後再回到原來的,它顯示它在哪裏,當我首先打開新表格,而不是我關閉它

我該如何解決這個問題?

謝謝!

回答

2

我有點被你的問題困惑,所以我會澄清什麼,我試圖在這裏解決!...

我認爲你正在試圖做的是

當窗體2打開時,它位於Form1和Form1的中心位置隱藏。

當Form2關閉時,會顯示Form1(確切地說它隱藏在哪裏)。

我想你想要做的就是讓Form1顯示Form2被關閉的位置。

所以我猜你有一些這樣的代碼......

procedure TForm1.ButtonClick(Sender: TObject); 
begin 
    Form2.ShowModal; 
end; 

和您所期望的Form2,因爲你設置窗體2的位置poOwnerFormCenter

那麼,如果我猜的所有更新Form1的位置那正確的然後所有你需要做的更新Form1的位置時,Form2關閉是

procedure TForm1.ButtonClick(Sender: TObject); 
begin 
    Form2.ShowModal; 
    Left := Form2.Left; 
    Top := Form2.Top; 
end; 
+0

這就是它,並且完美的工作。非常感謝! – KingKong 2011-05-13 18:05:18

1

這是(我猜),因爲您每次顯示時都會重新創建表單。也就是說,你做

with TForm2.Create(nil) do 
    try 
    ShowModal; 
    finally 
    Free; 
    end; 

因爲你創建的每一個你展示它的時間TForm2類的新實例,並摧毀它,當窗體已經關閉,位置的變化;實際上,新的TForm2對象不可能記住任何以前的TForm2對象的位置。他們是兩個不同的對象(是的,同一班,但沒關係)!

最簡單的解決方案是將TForm2添加到項目選項中的「自動創建窗體」列表中。它在默認情況下是存在的,但如果您手動創建它(正如我認爲您所做的那樣,並且如上面的代碼片段所示),您應該從自動創建的表單列表中將其刪除...

IDE Screenshot http://privat.rejbrand.se/autocreateform.png

然後你確保Unit1使用Unit2,這樣就可以從Form1駐留在Unit1訪問Unit2全球Form2變量。在編輯Unit1時,按下Alt + F11即可。

然後,你可以通過做

Form2.ShowModal; 

第一次它顯示只是顯示Form2,它會尊重其Position參數,並超過其所有者形式擺正自己的位置。但它會記住它的位置,所以第二次顯示它時,它會在第一次關閉的位置。

+0

感謝您的偉大答案,但它不是我所期待的。當我第一次打開原始表單時,移動它並打開Form2,它會在正確的位置打開。但是,當我移動Form2並返回到Form1時,它不是放置在Form2關閉的位置,而是Form2首次打開的位置。我已經在Form1中訪問Form2並使用ShowModal,並將其添加到自動創建表單中,但問題仍然存在 – KingKong 2011-05-13 16:28:02

+0

@KingKong:因爲我的猜測是錯誤的,或者因爲您不希望每次使用相同的對象時間? – 2011-05-13 16:29:17

+0

@安德烈亞斯對不起,這個簡短的答案之前,我一直忘記,按輸入發佈評論 – KingKong 2011-05-13 16:32:34

1

問題是您正在重複使用模態窗體的相同實例。設置位置僅在您第一次顯示錶單時起作用。你必須選擇這裏:

選項1

你可以在每次關閉時破壞模式窗體。一個這樣做的方式正在對OnClose事件表格中的這一行:

Action = caFree; 

當然,這意味着你每次都重新從主叫模態形式爲好。

選項2

您必須手動設置模式窗體的上OnShow事件位置。

使用最適合您的選項。