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

模擬 KeyDown 事件

答題得分者是:ccchen
bruce0211
版主


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

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-10-29 11:34:03 IP:211.21.xxx.xxx 未訂閱
請問各位長官 如果我要從 SpeedButton 送個 KeyDown 訊息給主 Form 在 BCB 中我可以在 SpeedButton OnClick 寫入 FormKeyDown(this,key,TShiftState()); 或 PostMessage(Handle,WM_KEYDOWN,key,0); 但在 Delphi 中 我試不出來下面 ??? 該填入什麼 ... (我試過 FormKeyDown(self,65,[]); 或 FormKeyDown(self,65,S); 仍然有錯) procedure TForm1.SpeedButton1Click(Sender: TObject); var S: TShiftState; begin S:=[ssShift]; FormKeyDown(self,65,???); //PostMessage(Handle,WM_KEYDOWN,65,0); end; 發表人 - bruce0211 於 2003/10/29 11:47:03
Jasonwong
版主


發表:49
回覆:931
積分:581
註冊:2006-10-27

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-10-29 11:52:13 IP:203.75.xxx.xxx 未訂閱
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); Sender = Self; Key = VK_RETURN // 如果你要送 ENTER 鍵的話 Shift = [ssCtrl] OR [ssALT] // 如沒有就直接給他空集合 [] 對了... SpeedButton 並沒有 FOUCS 要怎麼做 KEYDOWN 啊 -- 聰明的人,喜歡猜心;雖然每次都猜對了,卻失去了自己的心 傻氣的人,喜歡給心;雖然每次都被笑了,卻得到了別人的心 發表人 - Jasonwong 於 2003/10/29 11:54:01
------
聰明的人,喜歡猜心;雖然每次都猜對了,卻失去了自己的心
傻氣的人,喜歡給心;雖然每次都被笑了,卻得到了別人的心
bruce0211
版主


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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-10-29 13:25:13 IP:211.21.xxx.xxx 未訂閱
以前 DOS 畫面常有按鍵,套在 Windows 也適用 例如我在畫面上做一個 StringGrid , USER 可在上面"新增修改刪除查詢列印" 除了按鍵操作外,我還會放 5 個 SpeedButton 在底下 其Caption分別為 "[Ins]新增","[Enter]修改","[Del]刪除","[F5]查詢","[F7]列印" 所以 USER 要列印功能的話,除了按按鍵 F7 外,還可用滑鼠去點"[F7]列印"這個SpeedButton , 為了不用把列印程序寫在兩個地方(FormKeyDown & SpeedButton 的 Click),所以我讓 "[F7]列印"這個SpeedButton 的 Click 模擬送出 F7 的 kEY 值給 KeyDown 事件 ... 也就是說,不管我是真正去按 F7 這個鍵,或是用滑鼠點"[F7]列印"這個SpeedButton,都是呼叫 FormKeyDown 中的程序去處理列印功能 不知長官對以上的說明了解嗎 ? 另外,我用 SpeedButton 的原因還有顯示操作功能的用意,若沒有"[F7]列印"這個SpeedButton 指示 ,誰知道 F7 是列印功能 ??? User 又不會看我 OnKeyDown 中處理 F7 這個 Key 的程式碼 元件有沒有 FOUCS 跟能不能做 KEYDOWN ,一點互斥關係也沒有 , 我現在是要做模擬送出 KeyDown , 而不是"接收"KeyDown 發表人 - bruce0211 於 2003/10/29 13:28:32 發表人 - bruce0211 於 2003/10/29 13:33:21
ccchen
版主


發表:61
回覆:940
積分:1394
註冊:2002-04-15

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-10-29 13:52:03 IP:218.163.xxx.xxx 未訂閱
雖然做法有點怪, 不過你可以這樣寫
procedure TForm1.SpeedButton1Click(Sender: TObject);
var aKey:word;
begin
  akey=65;
  FormKeyDown(self,akey,[]); 
end;
NOTE: 注意FormKeyDown之原型 procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); 發表人 - ccchen 於 2003/10/29 13:54:18
bruce0211
版主


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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-10-29 14:16:35 IP:211.21.xxx.xxx 未訂閱
原來問題是出在 var Key ,而不是 Shift: TShiftState 這個參數的問題 因為前面說過...我試過 FormKeyDown(self,65,[]); ... 仍然有錯 但編譯器出錯在 [] 前面,所以一直以為 [] 要換成什麼 .... 3Q 另外,針對長官說我做法有點怪的問題,我提出說明 由於行業別的關係,USER 要我們寫的程式除了用滑鼠按 Button 外,還要所有的 Button 功能都有相對應的鍵盤可供操作(如鍵盤按鍵 F5 查詢, 鍵盤按鍵 F7 列印),如果USER不要求用鍵盤的話,我的 SpeedButton.Caption 就可直接寫成"列印"而不是"[F7]列印" , 這樣勢必造成 Keydown 要處理列印程序,SpeedButton 也要處理列印程序,所以要利用事件共用的技巧,我知反過來也可將列印程序寫在 SpeedButton 中,而由 Keydown 來共用呼叫 SpeedButton 的 OnClick 程序 不過為了除錯及流程的整體性,所以我將所有功能程式碼都放在KeyDown 中一目了然 發表人 - bruce0211 於 2003/10/29 14:30:58
系統時間:2024-05-10 16:01:14
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!