Application.Terminate的使用時機 |
答題得分者是:wyndog
|
P.D.
版主 ![]() ![]() ![]() ![]() ![]() ![]() 發表:603 回覆:4038 積分:3874 註冊:2006-10-31 發送簡訊給我 |
請問各位! 我有一支DATAMODULES是20支FORM共用, 但其中有一個判斷成立的話(此判斷是寫在DATAMODULES上, 就必須關閉程式, 但我無法在程式上這樣寫 {$IFDEF FORM1}
if
|
wyndog
資深會員 ![]() ![]() ![]() ![]() ![]() 發表:7 回覆:362 積分:348 註冊:2004-10-12 發送簡訊給我 |
|
wameng
版主 ![]() ![]() ![]() ![]() ![]() ![]() 發表:31 回覆:1336 積分:1188 註冊:2004-09-16 發送簡訊給我 |
事實上視窗本身就是一個消息機制
procedure TApplication.Terminate;
begin
if CallTerminateProcs then PostQuitMessage(0);
end;
從這一點可以看出其並非強制性終止程式。 但是否有無正確的釋放物件。嗯!是有待商榷的。 一般而言,個人所開發軟體。
推出前,我都會利用類似 Memproof 的工具檢測程式
進行檢測是否有無正確釋放指針或是物件等等。 提供給你做為參考。 ~~~~~~~~~~~
難得聰明,常常糊塗。
~~~~~~~~~~~
|
pcplayer99
尊榮會員 ![]() ![]() ![]() ![]() ![]() ![]() 發表:146 回覆:790 積分:632 註冊:2003-01-21 發送簡訊給我 |
|
P.D.
版主 ![]() ![]() ![]() ![]() ![]() ![]() 發表:603 回覆:4038 積分:3874 註冊:2006-10-31 發送簡訊給我 |
引言: 基本上,每个FORM里需要在关闭FORM前释放的东西,大概你都会写在 OnFormClose里面吧。 那么,你可以在FormClose里写一段代码,当Form Close的时候,由这段代码写log到file里去。 然后,你做 Application.Terminate,然后,看看log file,有没有执行到form close. 如果有,那么,和正常的一个一个的Form的关闭,就没区别了。我想這是無庸置疑的, 即已Application.Terminate 程式到此會結束這支系統, 並不會去run其他東東, 所以我會說它是強制性的中斷, 也因此才想知道close與terminate的內涵有何差異性, help中說得好少! |
wyndog
資深會員 ![]() ![]() ![]() ![]() ![]() 發表:7 回覆:362 積分:348 註冊:2004-10-12 發送簡訊給我 |
我查了一下 Delphi Help 在 TApplication.Terminate 裡有一段話是這樣寫的
Terminate calls the Windows API PostQuitMessage function to perform an orderly shutdown of the application. Terminate is not immediate.
Terminate is called automatically on a WM_QUIT message and when the main form closes.
所以可以推定,Terminate 其實只是送 WM_QUIT 給 Application 而已,並不是強制性地結束
事實上,我實驗了一下,跑個無窮迴圈就讓 Terminate 破功了 那麼再來的問題就是,Terminate 有沒有釋放掉該釋放掉的物件?
根據翻 Source 的結果,發現 Terminate 會呼叫 MainForm.Close
所以,可以確定 MainForm 是會結束的,另外一點比較奇怪的是,為什麼
MainForm 的 OnClose 沒辦法攔下 Terminate 這點我還沒研究出來
另外,實驗了一下,也確定 DataModule 會隨著 Terminate 而釋放的 Terminate 時,DataModule 的 OnDestory 會正常作用
至於 MainForm 的 OnClose 就不知為何無法作用
所以,若是真的有東西要在 MainForm 的 OnClose 裡釋放的話
就自己寫一個釋放函數
function MyTerminateProc: boolean; begin // 釋放你的物件 return true; // 這個 True 是釋放作業正常時,規定要傳回 True 的 end; // 在程式的適當地方加上 AddTerminateProc(MyTerminateProc);這樣,你只要呼叫 Terminate,Delphi 都會幫你呼叫 MyTerminateProc |
P.D.
版主 ![]() ![]() ![]() ![]() ![]() ![]() 發表:603 回覆:4038 積分:3874 註冊:2006-10-31 發送簡訊給我 |
|
change.jian
版主 ![]() ![]() ![]() ![]() ![]() 發表:29 回覆:620 積分:439 註冊:2003-06-02 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |