當主窗體關閉時,應用程序終止,釋放主窗體,然後釋放主窗體擁有的窗體。所擁有的表單沒有關閉,只是被釋放,因此他們的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;
謝謝,這似乎工作。 以前我使用FormClose過程,但相應地更改了「Action」(TCloseAction)參數。顯然這並不總是工作,否則我不明白如何正確使用它! – Rusty 2010-01-21 16:23:56
代碼中必須有其他東西,因爲只需關閉主窗體,就不會自動爲擁有的窗體調用OnClose和OnCloseQuery。 – 2010-01-21 16:38:02
正確 - 在mainform.formclose過程中,我明確說OwnedForm.Close觸發它的FormClose ...更具體地說,我做類似如下: for i:= 0 to ComponentCount-1 do 如果Components [i]是TForm然後 (作爲TForm的組件[i])。關; – Rusty 2010-01-21 17:18:02