关于Button的一个怪问题 |
尚未結案
|
jasonyangpeng
一般會員 發表:2 回覆:6 積分:1 註冊:2005-07-26 發送簡訊給我 |
小弟程序如下:
Var
Cnt:integer; procedure TForm1.Button1Click(Sender: TObject);
var
n:integer;
begin
Memo1.Lines.Add(IntToStr(Cnt));
Button1.Enabled:=False;
Cnt:=Cnt 1;
for n:=0 to 10 do
sleep(500);
Button1.Enabled:=True;
end; 首先把Button.Enabled关掉,但是
如果我连续点击Button1很多次,程序也会进入很多次Button.
请问这个问题怎么解决.
我的意图是Button.Enabled关掉后执行中间的一些程序,然后执行完后再把Button.Enabled打开.在Button.Enabled关掉中不会记录Mouse点击的次数.
|
mine
中階會員 發表:28 回覆:129 積分:56 註冊:2004-03-31 發送簡訊給我 |
Hi 你好!!
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls; type TForm1 = class(TForm) Button1: TButton; Edit1: TEdit; Edit2: TEdit; procedure Button1Click(Sender: TObject); private procedure test; public function DelayTime(Delay:DWord):Boolean; end; var Form1: TForm1; Cnt:word; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); var n:integer; begin Edit2.Text:=IntToStr(Cnt); Button1.Enabled:=False; Cnt:=Cnt 1; for n:=0 to 10 do begin Edit1.Text:=IntToStr(n); Delaytime(500); end; Button1.Enabled:=True; end; procedure TForm1.test; begin end; function TForm1.DelayTime(Delay:Dword):Boolean; var dtime:DWORD; begin dtime:=GetTickCount();//取得震盪器的次數 while GetTickCount()-dtime |
Stallion
版主 發表:52 回覆:1600 積分:1995 註冊:2004-09-15 發送簡訊給我 |
|
mine
中階會員 發表:28 回覆:129 積分:56 註冊:2004-03-31 發送簡訊給我 |
|
Stallion
版主 發表:52 回覆:1600 積分:1995 註冊:2004-09-15 發送簡訊給我 |
|
jasonyangpeng
一般會員 發表:2 回覆:6 積分:1 註冊:2005-07-26 發送簡訊給我 |
謝謝 mine 和 Stallion的回復,但是在Stallion提到的問題中關於“迴圈進行得很快,而可能不覺得BUTTON已經ENABLE了”這一點我可以肯定,我的Check mouse 事件應該是在 BUTTON Enable之前。因爲我是在一開始時連續Check 了幾下mouse,之後就沒有再Check the mouse。而且這裡的延時也很長呀。
不過在程式執行完后加上你們所說的Application.ProcessMessages;問題也已經解決了,再次謝謝各位。不過關於討論我們可以繼續。 解決后的程式:
procedure TForm1.Button1Click(Sender: TObject);
var
n:integer;
begin Button1.Enabled:=False;
Memo1.Lines.Add(IntToStr(Cnt)); Cnt:=Cnt 1;
for n:=0 to 10 do
sleep(500); Application.ProcessMessages; //這一句必須在Button1.Enabled:=True;之前
Button1.Enabled:=True; //否則還是不行的 end;
|
jasonyangpeng
一般會員 發表:2 回覆:6 積分:1 註冊:2005-07-26 發送簡訊給我 |
|
mine
中階會員 發表:28 回覆:129 積分:56 註冊:2004-03-31 發送簡訊給我 |
|
jasonyangpeng
一般會員 發表:2 回覆:6 積分:1 註冊:2005-07-26 發送簡訊給我 |
|
Stallion
版主 發表:52 回覆:1600 積分:1995 註冊:2004-09-15 發送簡訊給我 |
|
jasonyangpeng
一般會員 發表:2 回覆:6 積分:1 註冊:2005-07-26 發送簡訊給我 |
|
mine
中階會員 發表:28 回覆:129 積分:56 註冊:2004-03-31 發送簡訊給我 |
var Form1: TForm1; t:word; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); var i:integer; begin t:=0; For i:=1 to 1000000 do begin if t=1 then exit; edit1.Text:=inttostr(i); application.ProcessMessages; end; end; procedure TForm1.Button2Click(Sender: TObject); var i:integer; begin t:=1; for i:=1 to 1000000 do begin if t=0 then exit; edit1.Text:=inttostr(i); application.ProcessMessages; end;是我誤會你的意思嗎? 你的意思 還要等b 作完還要再返回 a 繼續? 如果是這樣還是可以吧@@ procedure test; public { Public declarations } end; var Form1: TForm1; t:word; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); var i:integer; begin t:=0; For i:=1 to 1000000 do begin if t=1 then test; edit1.Text:=inttostr(i); application.ProcessMessages; end; end; procedure TForm1.Button2Click(Sender: TObject); var i:integer; begin t:=1; end; procedure TForm1.test; var i:integer; begin For i:=1 to 1000000 do begin if t=1 then test; edit1.Text:=inttostr(i); application.ProcessMessages; end; end;補充一下如果他本身不是個迴圈除了Thread 還可在程序a 的每個動作前去偵 測該旗標@@ 還是我又搞錯你的意思了@@ 搞不懂!搞不懂!永遠都搞不懂!! 發表人 - mine 於 2005/09/13 17:37:10 |
jasonyangpeng
一般會員 發表:2 回覆:6 積分:1 註冊:2005-07-26 發送簡訊給我 |
|
mine
中階會員 發表:28 回覆:129 積分:56 註冊:2004-03-31 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |