2010-01-21 20 views
2

我的Delphi 2010應用程序有許多由模板創建和擁有的非模態窗體。其中一種形式有一個formclose過程,彈出一個詢問用戶是否想保存更改的對話框。如果用戶關閉了主窗體,則調用「擁有」窗體的FormClose過程,但是該對話框不顯示,並且用戶沒有機會保存。Delphi窗體所有者跳過組件FormClose中的ShowMessage/Dialog調用

有什麼建議嗎?我可以看到調試器中正在調用該過程,但似乎只是跳過對話框。 showmessage也會發生同樣的事情。所有者是否以某種方式覆蓋這些對話框的實際顯示?

感謝

生鏽

回答

2

這種事情應該在OnCloseQuery事件。在處理程序中設置CanClose爲false來中止關閉(這或多或少是標準的:在這些情況下,Yes,No和Cancel是通常的答案,Cancel取消關閉過程)。

+0

謝謝,這似乎工作。 以前我使用FormClose過程,但相應地更改了「Action」(TCloseAction)參數。顯然這並不總是工作,否則我不明白如何正確使用它! – Rusty 2010-01-21 16:23:56

+0

代碼中必須有其他東西,因爲只需關閉主窗體,就不會自動爲擁有的窗體調用OnClose和OnCloseQuery。 – 2010-01-21 16:38:02

+0

正確 - 在mainform.formclose過程中,我明確說OwnedForm.Close觸發它的FormClose ...更具體地說,我做類似如下: for i:= 0 to ComponentCount-1 do 如果Components [i]是TForm然後 (作爲TForm的組件[i])。關; – Rusty 2010-01-21 17:18:02

2

當主窗體關閉時,應用程序終止,釋放主窗體,然後釋放主窗體擁有的窗體。所擁有的表單沒有關閉,只是被釋放,因此他們的OnClose事件通常不會被觸發。

如果您看到ShowMessage被從擁有的窗體的OnClose事件中調用,但對話框沒有顯示出來,這可能是因爲應用程序已經終止並且不再處理消息。這意味着擁有的表單的OnClose事件由您自己的代碼中的某處觸發,但時間太晚。

重現此行爲的一種方法是將WM_CLOSE消息發佈到主窗體的OnClose事件中擁有的窗體。然後,在應用程序已經終止的任何嘗試調用ShowMessage的任何嘗試或任何模態窗體不再有效時,該消息隨後由擁有的窗體進行處理。

我同意Michael的觀點,OnCloseQuery更適合向用戶顯示提示。不幸的是,由於所擁有的表格正在被釋放而沒有關閉,所以這並沒有幫助。你必須手動調用他們的OnCloseQuery事件,例如:

procedure TFormMain.FormCloseQuery(Sender: TObject; var CanClose: Boolean); 
var 
    I: Integer; 
begin 
    CanClose := False; 
    for I := 0 to ComponentCount - 1 do 
    if Components[I] is TCustomForm then 
     if not TCustomForm(Components[I]).CloseQuery then 
     Exit; 
    CanClose := True; // or another check if the main form can be closed, too 
end; 
+0

這實際上就是我在第一次獲得ownedform.formclose時所要做的。我猜應用程序將允許從FormCloseQuery而不是FormClose調用的消息。 – Rusty 2010-01-21 17:25:19

+0

關閉任何表單時,首先調用OnCloseQuery,然後(如果OnCloseQuery允許關閉)OnClose,然後(如果它是主窗體並且OnClose返回caNone以外的任何內容),則應用程序終止(請參閱TCustomForm.Close)。無論您使用主窗體的OnCloseQuery還是OnClose,應用程序仍然應該在此處處理消息。代碼中一定有其他東西;無論是您使用其他事件還是其他技術在應用程序終止後關閉擁有的表單。 – 2010-01-21 18:04:05

0

我最近碰到了東西沿着這些路線。我發現只需添加代碼:

if not Visible then 
    Show; 
BringToFront; 

就在顯示保存更改對話框之前結束所有混淆。如果父窗體不可見,則會顯示父窗體,然後在zorder上向前移動到堆的前面,然後在窗體頂部顯示對話框。

相關問題