線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:2091
推到 Plurk!
推到 Facebook!

Application.Terminate 為何失效 ?

答題得分者是:P.D.
pcboy
版主


發表:177
回覆:1838
積分:1463
註冊:2004-01-13

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-06-23 21:21:36 IP:203.204.xxx.xxx 未訂閱
程式執行過程中, 按下 Button5 居然無法停止程式, 為什麼呢 ?
procedure TForm1.Button5Click(Sender: TObject);
begin
  Application.Terminate;
end;
全文請看: http://delphi.ktop.com.tw/topic.php?TOPIC_ID=73800
------
能力不足,求助於人;有能力時,幫幫別人;如果您滿意答覆,請適時結案!

子曰:問有三種,不懂則問,雖懂有疑則問,雖懂而想知更多則問!
bruce0211
版主


發表:157
回覆:668
積分:279
註冊:2002-06-13

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-06-23 23:13:30 IP:59.120.xxx.xxx 未訂閱
是否流程還在某一迴圈中 ?? 如果迴圈中有加 Application.ProcessMessages 你按了按鈕,雖會凹下去 但裡面的程式碼並不會執行 如果迴圈中沒有加 Application.ProcessMessages 整個 GUI 是被凍結住的 , 按按鈕也不會凹下去 AP 像是當機狀態 除非迴圈結束
pcboy
版主


發表:177
回覆:1838
積分:1463
註冊:2004-01-13

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-06-24 10:59:14 IP:210.69.xxx.xxx 未訂閱
是在迴圈中, 但迴圈沒有加 Application.ProcessMessages (請看全文)
------
能力不足,求助於人;有能力時,幫幫別人;如果您滿意答覆,請適時結案!

子曰:問有三種,不懂則問,雖懂有疑則問,雖懂而想知更多則問!
P.D.
版主


發表:603
回覆:4038
積分:3874
註冊:2006-10-31

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-06-24 12:00:43 IP:61.71.xxx.xxx 未訂閱
引言: 是在迴圈中, 但迴圈沒有加 Application.ProcessMessages (請看全文)
提供你我的做法, 一般我不會利用其他button來直接中斷
privae
  closeap: boolean;
....    procedure Tform1.button1click...
begin
   closeap:= False;
   repeat
      ......
      Application.ProcessMessage;
      if closeap then break;
   until ....       if closeap then Application.Terminate;
end;    procedrue TForm1.Button5click....
beign
   closeap:= True;
end;
pcboy
版主


發表:177
回覆:1838
積分:1463
註冊:2004-01-13

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-06-24 15:29:29 IP:210.69.xxx.xxx 未訂閱
Button2 按不下去, 程式跑不停    
var
  Form1: TForm1;
  closeap : boolean;
implementation    {$R *.dfm}    procedure TForm1.Button1Click(Sender: TObject);
begin
  closeap:= False;
  repeat
    Edit1.Text:='Testing...';
    Form1.Repaint;
    if closeap then break;
  until False;      if closeap then Application.Terminate;
end;    procedure TForm1.Button2Click(Sender: TObject);
begin
  closeap:= True;
end;    
------
能力不足,求助於人;有能力時,幫幫別人;如果您滿意答覆,請適時結案!

子曰:問有三種,不懂則問,雖懂有疑則問,雖懂而想知更多則問!
P.D.
版主


發表:603
回覆:4038
積分:3874
註冊:2006-10-31

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-06-24 16:04:33 IP:61.71.xxx.xxx 未訂閱
引言: Button2 按不下去, 程式跑不停
var
  Form1: TForm1;
  closeap : boolean;
implementation    {$R *.dfm}    procedure TForm1.Button1Click(Sender: TObject);
begin
  closeap:= False;
  repeat
    Edit1.Text:='Testing...';
    Form1.Repaint;
    Application.ProcessMessage;
    if closeap then break;
  until False;      if closeap then Application.Terminate;
end;    procedure TForm1.Button2Click(Sender: TObject);
begin
  closeap:= True;
end;    
當然囉, 你忘了加上紅色的部份, 所以無法跳脫迴圈去執行button2
pcboy
版主


發表:177
回覆:1838
積分:1463
註冊:2004-01-13

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-06-24 16:16:22 IP:210.69.xxx.xxx 未訂閱
成功了, 感謝 Application.ProcessMessages; 後面應該有個 s 請問一下, 如果程式中有多個獨立的迴圈 那便成每個迴圈都要這樣設定了, 有其他好方法嗎 ?
------
能力不足,求助於人;有能力時,幫幫別人;如果您滿意答覆,請適時結案!

子曰:問有三種,不懂則問,雖懂有疑則問,雖懂而想知更多則問!
P.D.
版主


發表:603
回覆:4038
積分:3874
註冊:2006-10-31

發送簡訊給我
#8 引用回覆 回覆 發表時間:2005-06-24 22:34:24 IP:61.71.xxx.xxx 未訂閱
引言: 成功了, 感謝 Application.ProcessMessages; 後面應該有個 s 請問一下, 如果程式中有多個獨立的迴圈 那便成每個迴圈都要這樣設定了, 有其他好方法嗎 ?
這種寫法是我個人比較常用的, 並非代表就只有這樣, 因為有時候意欲結束程式前可能還有其他必須要先執行的作業, 那就可以在 if closeap 下做, 而不寫在中斷的button上, 因為畢竟我們是透過Application.ProcessMessages來暫離執行其他, 這有點類似Thread的樣子, 所以要想在迴圈在執行中斷或關閉, 我的觀念是最好先真正用break中斷迴圈再來做其他事比較好, 但其實原本你的寫法也是可以的(以此例比較簡單來說), 只要加上 Application.ProcessMessages也可以跳脫迴圈去執行其他button的命令~ 以上為個人的想法, 僅提供參考, 至於您想要更好的方法, 這就得視您的程式是如何撰寫, 但我認為一定還有其他更好的, 可留待您來發掘了!
系統時間:2024-07-02 10:49:10
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!