執行我在Delphi編寫的2007年如何正常退出有代碼MDI形式德爾福
一個MDI應用程序。如果用戶退出內它的形式,而代碼執行導致異常,因爲代碼正在嘗試更新組件或使用與表單一起釋放的對象。
有無論如何我可以告訴代碼是否在退出事件中執行,或者是否有標準方法來處理這種情況?
更新與更多資料
異常通常在以下情況下發生的。
按下子mdi表單上的一個按鈕,這將激活表單中的函數,該函數將轉到數據庫並檢索數據,然後它將重新格式化並將其顯示在表單上的可視化組件中(可用一個TListView)。
如果代碼花費很長時間來執行(例如,如果有大量數據要處理),用戶將失去興趣並單擊關閉按鈕(代碼速度已嘗試避免這個)。
即使它所屬的表單已被釋放(代碼位於表單的專用部分),該函數內部的代碼仍在執行,現在當它試圖更新它們不再存在的可視化組件時他們被釋放的形式),它會拋出一個異常。
子窗體的代碼是可用地在一個循環時,這相應地發生,循環記錄和更新列表視圖中,循環包含的代碼看起來像這樣
inc(i);
if (i mod 25) = 0 then
begin
StatusPnl.Caption := 'Loading ' + intToStr(i) + ', Please wait';
application.ProcessMessages;
end;
其他代碼樣本
的fromClose事件看起來像這樣
//Snip
if (Not (Owner = nil)) then
with (Owner as IMainForm)do
begin
//Snip
DoFormFree(Self,Self.Name);
end
else
//Snip
DoFormFree是在主MDI母體形式的一個函數d看起來像這樣
//Snip
(G_FormList.Objects[x] as TBaseForm).Release;
G_FormList.Objects[i] := nil;
G_FormList.Delete(i);
//Snip
所有形式存儲在列表中,因爲種種原因,以及所有子窗體擴展TBaseForm類。
理想情況下,我想一個辦法判斷的形式執行代碼,並防止用戶關閉窗體或隱藏,直到代碼完成,因爲在某些情況下,可能生成報表和更新作爲狀態面板,當發生異常時,報告將不完整。
因爲所有的表單都是TbaseFrom的子類,所以這樣做的一些全局方式將是理想的,所以我可以將代碼添加到基本表單並使其適用於所有下降的表單。
謝謝,我還需要提供什麼? – Re0sless 2009-01-26 09:44:33