2010-06-22 60 views
0

假設我寫信button1click事件處理程序,其被調用時(即,當按鈕1點擊)不斷加1到可變計數器的事件處理程序交換消息(一個或多個):如何使與其他事件處理程序(一個或多個)

var 
i : counter; 
begin 
while 1 = 1 do 
inc(i); 
end; 

現在我想在我的表單上添加另一個按鈕並將其命名爲「stop」,它會突然退出 button1click(在其調用之後)或停止將它添加到計數器,我該怎麼做?

回答

3

希望這將提供一些想法,如何適應基於定時器的方式滿足您的需求:

type 
    TForm1 = class(TForm) 
    Button1: TButton; 
    Button2: TButton; 
    Timer1: TTimer; // with Interval = 1 (for example) and Enabled = FALSE 
    procedure Button1Click(Sender: TObject); 
    procedure Button2Click(Sender: TObject); 
    procedure Timer1Execute(Sender: TObject); 
    private 
    fCounter: Integer; 
    end; 



procedure TForm1.Button1Click(Sender: TObject); 
begin 
    Timer1.Enabled := TRUE; 
end; 


procedure TForm1.Button2Click(Sender: TObject); 
begin 
    Timer1.Enabled := FALSE; 
end; 


procedure TForm1.Timer1Execute(Sender: TObject); 
begin 
    Inc(fCounter); 
end; 

如果你的需求是更復雜的那麼一個基於TThread類方法可能更合適。但無論你做什麼,都不要求助於Application.ProcessMessages它只會令你痛苦!

+0

謝謝你的答案。 1. Application.ProcessMessages有什麼問題? 2.我真的不會使用一個while循環這僅僅是爲了詢問其實我試圖讓一個下載管理器暫停繼續支持的想法是,只要我按下暫停按鈕我的下載暫停 – 2010-06-23 06:04:22

+0

當你調用Application.ProcessMessage( APM),您可以在應用程序中有效地創建新的消息循環。直到沒有更多的消息需要處理,並且如果其中一條消息是應用程序中某個其他按鈕或窗口中的CLICK,則控制權直接從無辜的APM調用傳遞到該消息事件處理程序。在堅果殼中,您在應用程序中的VCL代碼中創建了潛在的重入問題(除非您在調用APM時儘量禁用您的UI以防止出現這種情況)。...繼續 – Deltics 2010-06-23 07:12:41

+0

絕大多數使用我遇到的APM是允許GUI更新在一些進程正在進行時發生,即處理畫圖消息。在VCL中,這是不必要的 - 您可以通過顯式調用Update來明確重新繪製所需的控件(通常是標籤,狀態欄等內容),從而在該處理期間根據需要更新UI。通常可以使用定時器(如本例中)或線程來避免APM被調用的其他場景。 – Deltics 2010-06-23 07:15:10

2
  1. Application.ProcessMessages裏面。這允許其他控件處理和響應事件。
  2. 創建一個全局變量「Stop」。
  3. 在停止按鈕事件處理程序中,將Stop設置爲true。
  4. 在你的時間內,檢查Stop的值,如果它爲真,則打斷它。

但是,這樣做並不是很好的做法。你在表單中做的所有事情都應該回應一些事件,所以如果你想做一些週期性的事情,你應該使用一個Timer或類似的東西。

+0

+1提到TTimer,這是正確的方式來做到這一點。 – 2010-06-22 12:04:37

+0

感謝您的答案FrantišekŽiačik。我不是真的要使用一個while循環這僅僅是爲了問我實際上我試圖讓一個下載經理暫停/恢復支持的想法是,每當我按下暫停按鈕我的下載暫停 – 2010-06-23 06:07:11

+0

對於這種情況下,你應該看看在線程或異步請求中,這對於這類工作來說是一個更好的方法。 – 2010-06-23 08:20:31

2

你可以把你的時間放在一個單獨的線程。簡單的TThread就足夠了,但也有特殊的線程庫,如AsyncCalls或OmniThreadLibrary。

+0

感謝您的答案torbins。這是更好的tthred,asyncccalls或omnithredlibrary和我不知道太多的線程,以便哪個這些你會更容易成爲一個開始 – 2010-06-23 05:56:42

+0

我認爲你可以從TThread開始。一些很好的文章可以在這裏找到:http://www.eonclash.com/Tutorials/Multithreading/MartinHarvey1.1/ToC.html – Torbins 2010-06-23 06:46:00

相關問題