模擬 KeyDown 事件 |
答題得分者是:ccchen
|
bruce0211
版主 發表:157 回覆:668 積分:279 註冊:2002-06-13 發送簡訊給我 |
請問各位長官
如果我要從 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 發送簡訊給我 |
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 發送簡訊給我 |
以前 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 發送簡訊給我 |
雖然做法有點怪, 不過你可以這樣寫
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 發送簡訊給我 |
原來問題是出在 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
|
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |