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

关于Button的一个怪问题

尚未結案
jasonyangpeng
一般會員


發表:2
回覆:6
積分:1
註冊:2005-07-26

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-09-12 15:45:13 IP:219.137.xxx.xxx 未訂閱
小弟程序如下: 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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-09-12 18:30:27 IP:61.221.xxx.xxx 未訂閱
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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-09-12 19:06:34 IP:211.22.xxx.xxx 未訂閱
需求很奇怪 既然是執行一個程序( > ----------------------------------------------
mine
中階會員


發表:28
回覆:129
積分:56
註冊:2004-03-31

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-09-12 21:32:59 IP:61.221.xxx.xxx 未訂閱
我想他搞不懂的地方是在button1 按下以後... 在呼叫別的程序時 button 呈現 Disable 的狀態下 在被呼叫的程序裡如果使用Sleep() button 仍會被觸發...在button 呈現 Disable下 多次連點的程序仍會被多次呼叫..... 在disable的狀態下...為何程序還會被呼叫?(倘若使用了sleep) 我也說不上原理...還請大大解釋了 搞不懂!搞不懂!永遠都搞不懂!! 發表人 - mine 於 2005/09/12 21:39:01
Stallion
版主


發表:52
回覆:1600
積分:1995
註冊:2004-09-15

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-09-12 22:21:08 IP:211.22.xxx.xxx 未訂閱
windows訊息佇列分為系統佇列與應用程式佇列,應用程式大多接受與處理來自應用程式佇列的訊息(各詳細佇列訊息,請參看WIN32系統程式設計書籍)。 以本例而言,button在disable狀態下,是會忽視某些訊息的,但會不會將之丟棄呢?我也不知道。參看下列>> 而這個程式之所以會繼續接受 > ----------------------------------------------
jasonyangpeng
一般會員


發表:2
回覆:6
積分:1
註冊:2005-07-26

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-09-13 09:31:26 IP:219.137.xxx.xxx 未訂閱
謝謝 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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-09-13 10:14:09 IP:219.137.xxx.xxx 未訂閱
再請教大家一個問題,就是我首先點擊了一個ButtonA,在這個ButtonA内執行的程式很長,黨還在執行ButtonA内部的程式時如果我再點擊ButtonB,我要怎樣做才可以在ButtonA還沒有執行完時,立刻去響應ButtonB的事件?
mine
中階會員


發表:28
回覆:129
積分:56
註冊:2004-03-31

發送簡訊給我
#8 引用回覆 回覆 發表時間:2005-09-13 13:14:08 IP:61.221.xxx.xxx 未訂閱
在迴圈的中加入一個全域變數 當旗標 當b button click 時改變旗標 在a 需要被中止點去判斷旗標 應該就可以達成了吧 搞不懂!搞不懂!永遠都搞不懂!!
jasonyangpeng
一般會員


發表:2
回覆:6
積分:1
註冊:2005-07-26

發送簡訊給我
#9 引用回覆 回覆 發表時間:2005-09-13 14:59:48 IP:219.137.xxx.xxx 未訂閱
mine說的方法好像不行吧,因爲黨程式在ButtonA内執行的時候是不會去響應ButtonB的。直到ButtonA執行完了才會再響應ButtonB内的程式,不知道對嗎?望各位大大解答
Stallion
版主


發表:52
回覆:1600
積分:1995
註冊:2004-09-15

發送簡訊給我
#10 引用回覆 回覆 發表時間:2005-09-13 16:35:05 IP:211.22.xxx.xxx 未訂閱
答案是當然不行的。 在 > ----------------------------------------------
jasonyangpeng
一般會員


發表:2
回覆:6
積分:1
註冊:2005-07-26

發送簡訊給我
#11 引用回覆 回覆 發表時間:2005-09-13 16:57:02 IP:219.137.xxx.xxx 未訂閱
謝謝Stallion的回復,我也覺得這樣應該可以,你能否貼個例子上來供我參考?非常感謝。
mine
中階會員


發表:28
回覆:129
積分:56
註冊:2004-03-31

發送簡訊給我
#12 引用回覆 回覆 發表時間:2005-09-13 17:32:56 IP:61.221.xxx.xxx 未訂閱
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

發送簡訊給我
#13 引用回覆 回覆 發表時間:2005-09-15 15:21:00 IP:219.137.xxx.xxx 未訂閱
問題算解決了,這句代碼很關鍵: Application.ProcessMessage,这句代码使程序的其他控件也能获取消息; 只要在ButtonA很長的循環中加入Application.ProcessMessage也能響應ButtonB的Check 事件
mine
中階會員


發表:28
回覆:129
積分:56
註冊:2004-03-31

發送簡訊給我
#14 引用回覆 回覆 發表時間:2005-09-19 15:58:04 IP:61.221.xxx.xxx 未訂閱
還有個application.HandleMessage 你可以看一下delphi的說明 跟application.processmessage 有什不同之處!! 搞不懂!搞不懂!永遠都搞不懂!!
系統時間:2024-11-25 14:41:32
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!