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

如何處理重覆按鍵?

尚未結案
mathewzhao
中階會員


發表:121
回覆:164
積分:67
註冊:2003-04-04

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-06-02 13:00:37 IP:202.100.xxx.xxx 未訂閱
各位先進好! Q:請問在程式運行時,由於不慎連續重覆按一個鍵多次,如何只做一次處理?
Justmade
版主


發表:94
回覆:1934
積分:2030
註冊:2003-03-12

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-06-02 13:11:46 IP:218.16.xxx.xxx 未訂閱
你甚麼定義那種情況是正常,那種情況是重覆? 你最好可先貼出你的程式碼給說明清楚問題所在。
turboted
版主


發表:95
回覆:754
積分:452
註冊:2002-07-23

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-06-02 13:39:58 IP:210.241.xxx.xxx 未訂閱
我也想請問 如何您判斷『重覆』這樣的動作 如果我按[A]經過10sec後再按[A] 這樣也算重覆嗎
mathewzhao
中階會員


發表:121
回覆:164
積分:67
註冊:2003-04-04

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-06-03 13:54:39 IP:61.150.xxx.xxx 未訂閱
感謝兩位前輩的熱心指點!     確實如兩位前輩所說,判斷是否是重覆按鍵,總要有一個判斷的標準,這樣才能綱舉目張。    如果根據時間判斷,設置成2sec,還是設置成10sec,是一個很難決定的問題。 針對我的程式,是希望程式運行後: 按
Justmade
版主


發表:94
回覆:1934
積分:2030
註冊:2003-03-12

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-06-03 14:07:30 IP:218.16.xxx.xxx 未訂閱
不用這麼煩喔 建議這樣 1. 建立一 Boolean 變數如叫 F6ing 放 private 處 2. 開始處理 F6 時先查 F6ing 是否 True, 若 True 不執行 3. 若 F6ing = False 則設成 True 並開始執行 4. 執行完成時設 F6ing 做 False 這樣應可以了
turboted
版主


發表:95
回覆:754
積分:452
註冊:2002-07-23

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-06-03 14:18:04 IP:210.241.xxx.xxx 未訂閱
我想,您應該可以在Form的OnKeyDown Event 底下 判斷F6這個KEY 我剛才試了一下..F6 傳進來的值Key = 116 您可以試看看
mathewzhao
中階會員


發表:121
回覆:164
積分:67
註冊:2003-04-04

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-06-03 15:24:40 IP:219.145.xxx.xxx 未訂閱
感謝兩位前輩及時回應! 如Justmade前輩所說,加一 Boolean 變數確實能解決重覆按鍵問題,但是帶來一個隱患,如果串埠操作沒有正常結束,則F6ing 一直為True, 再按F6將不發送指令。Code如下: ‧‧‧‧‧ if F6ing=false then begin F6ing:=true; //在此向串埠發送指令 end else exit; ‧‧‧‧‧‧ //下面的Code 說明: //回送數據放到buf中,如果接收到$4A ,表示收到回送數據。但是在串埠 //操作沒有正常結束時,程式不會收到任何回送數據,並被中止。原來碰到這 //種情況再按一次F6,重新發送指令。但現在程式被中止後, //F6ing:=false沒有execute,F6ing將一直為True,再按F6將不起作用; repeat ‧‧‧ TimeDelay(200); //在此接受串埠回送數據 until (pos(chr($4A),buf)>0); F6ing:=false; 如turboted前輩所說,其實F6可以用VK_F6表示,但是如何判斷按了幾次(OnKeyDown )F6呀? 再次感謝兩位前輩的熱心指點!
Justmade
版主


發表:94
回覆:1934
積分:2030
註冊:2003-03-12

發送簡訊給我
#8 引用回覆 回覆 發表時間:2003-06-03 15:41:04 IP:218.16.xxx.xxx 未訂閱
用 try finally 那 F6ing:=false; 便無論有否出錯也一定會執行    
try
  ....
  repeat 
  ‧‧‧ 
  TimeDelay(200);
  //在此接受串埠回送數據 
  until (pos(chr($4A),buf)>0);
finally 
  F6ing:=false; 
end;
mathewzhao
中階會員


發表:121
回覆:164
積分:67
註冊:2003-04-04

發送簡訊給我
#9 引用回覆 回覆 發表時間:2003-06-03 16:18:29 IP:219.145.xxx.xxx 未訂閱
感謝前輩Justmade悉心指點! 用Try‧‧‧Finally‧‧‧End 不能解決這個問題,原因可能是在第一次按F6串埠出現故障時,Repeat‧‧‧Until 一直還在LOOP,沒有機會執行到 Finally F6ing:=false; 請問在串埠出現故障沒有回送數據時,如何讓 Repeat‧‧‧Until退出 LOOP ?
mathewzhao
中階會員


發表:121
回覆:164
積分:67
註冊:2003-04-04

發送簡訊給我
#10 引用回覆 回覆 發表時間:2003-06-03 20:39:32 IP:219.145.xxx.xxx 未訂閱
抱歉!先前我說在串埠操作沒有正常結束時,程式不會收到任何回送是不正確的! 我後來用UltraEdit在Hex 方式下看到在這時回送的結果:02 15 03($15 :NAK)。因此在回送數據裏看是否有02 15 03就可以退出Repeat‧‧‧Until這個LOOP 。 但是,我不知道是否Sentence 1寫的有錯誤(可以通過 Compile),因為即使buf 有02 15 03,showmessge('1111');也沒有顯示出來。 repeat ‧‧‧ TimeDelay(200); //在此接受串埠回送 if Pos(#02 #15 #03,buf)>0 then //Sentence 1 begin showmessge('1111'); F6ing:=false; Exit; end; until (pos(chr($4A),buf)>0); F6ing:=false;
Justmade
版主


發表:94
回覆:1934
積分:2030
註冊:2003-03-12

發送簡訊給我
#11 引用回覆 回覆 發表時間:2003-06-03 22:18:30 IP:218.16.xxx.xxx 未訂閱
你的 buf 是定義成甚麼形態 ?
mathewzhao
中階會員


發表:121
回覆:164
積分:67
註冊:2003-04-04

發送簡訊給我
#12 引用回覆 回覆 發表時間:2003-06-04 09:07:43 IP:61.134.xxx.xxx 未訂閱
我將Buf定義為string‧ Buf:string;
Justmade
版主


發表:94
回覆:1934
積分:2030
註冊:2003-03-12

發送簡訊給我
#13 引用回覆 回覆 發表時間:2003-06-04 09:21:18 IP:218.16.xxx.xxx 未訂閱
哎,忘了你那 02 15 03 應是 hex 罷 所以你試試 : if Pos(#2#21#3,buf)>0 then //Sentence 1
系統時間:2024-04-28 12:23:08
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!