我有一個框架和一些控件(編輯,按鈕等)。如何攔截在框架控件上的任意位置按下ENTER鍵並翻譯到TAB鍵(考慮到SHIFT狀態)?德爾福:如何使ENTER鍵作爲TAB鍵TAB鍵
回答
下面是一些示例代碼,用於處理幀上的消息,以便能夠在按下Enter時導航到下一個控件。請注意,此示例不修改輸入密鑰成爲選項卡密鑰。相反,它會選擇下一個控件並阻止按鍵消息的進一步處理。
另請注意,代碼可能需要進一步調整。一個用於,如果有任何控件實際需要處理輸入密鑰,例如TMemo
,則需要添加異常。其次,導航被包裹在框架中,即在最後一幀控制之後,第一幀控制被聚焦 - 而不是在窗體上而不是在幀上的控制。對於這些,如果您希望在某些條件下進行默認處理,只是調用繼承而不做任何其他事情,則可能需要爲消息返回添加條件。
type
TFrame2 = class(TFrame)
...
protected
procedure CMChildKey(var Message: TCMChildKey); message CM_CHILDKEY;
end;
..
procedure TFrame2.CMChildKey(var Message: TCMChildKey);
begin
if Message.CharCode = VK_RETURN then begin
SelectNext(Screen.ActiveControl, not Bool(GetKeyState(VK_SHIFT) and $80), True);
Message.Result := 1;
end else
inherited;
end;
所有你需要的是修改CM_DIALOGKEY
的處理。
type
TMyForm = class(TForm)
protected
procedure CMDialogKey(var Message: TCMDialogKey); message CM_DIALOGKEY;
end;
procedure TMyForm.CMDialogKey(var Message: TCMDialogKey);
begin
if Message.CharCode=VK_RETURN then
Message.CharCode := VK_TAB;
inherited;
end;
嗯,這是非常明顯的是什麼,以及它是如何工作的。
你問如何在一個框架中做到這一點。無法在框架中處理對話框導航。這是由相當明顯的原因形式完成的。因此,您需要以某種方式將此代碼拼接到託管框架的表單中。
對於備忘錄控制,這將不起作用。他們會將按輸入作爲換行符的輸入。但我想這就是你想要發生的事情。否則,備忘錄控制將完全無法使用。
@anondv我在這個答案中弄錯了什麼 – 2013-03-11 14:36:22
在一個框架中它是不可能的。但我明白其中的原因,如果一個表單上有許多框架,就必須爲它們全部編寫一個事件處理程序。謝謝! – 2013-03-11 14:48:30
原因是,如果焦點集中在一幀中的最後一個控件上,那麼TAB需要移動到下一幀中的第一個控件。由於每一幀都是孤立的,所以幀不能負責。只有表單才能看到關於它的所有控件的全貌。這就是爲什麼'CM_DIALOGKEY'被髮送到父窗體。 – 2013-03-11 15:00:02
我覺得有很多的「滴,忘記了」組件來做到這一點,例如在http://Torry.net
例如,這種成分是RxLib的一部分,後來在JediVCL inherted與TJvEnterAsTab
名稱。
我認爲使用一個組件來完成可以用某些代碼行編寫的任務是不合理的。 – 2013-03-12 19:02:09
取決於POV。組件將代碼集中起來,並將維護的負擔放在別人身上。但選擇是你的,我只是注意到你有一個。 – 2013-03-13 06:01:13
- 1. 如何使用Enter鍵作爲Tab鍵在DataGridView中
- 2. 將ENTER鍵重新定義爲TAB鍵
- 3. Excel VBA如何讓Enter鍵的行爲與Tab鍵相似
- 4. TAB鍵
- 5. TAB鍵
- 6. 爲什麼Enter鍵的行爲與Tab鍵相似?
- 7. DataGridViewTextBoxColumn Tab鍵行爲
- 8. ExtJs在ENTER按鍵上模擬TAB
- 9. 雷博爾Shift-Tab鍵副作用
- 10. 使用Tab鍵as3
- 11. Tab鍵索引
- 12. Livecode Block Tab鍵
- 13. TWebBrowser和Tab鍵
- 14. Tab鍵在
- 15. QCompleter和Tab鍵
- 16. 如何在ListView中分配「Tab」鍵而不是「Ctrl + Tab」鍵?
- 17. vim不讀取Tab鍵爲<Tab>
- 18. 託管VCL.Arrow鍵和Tab鍵
- 19. 處理關鍵事件Ctrl + Tab鍵和Ctrl + Shift + Tab鍵
- 20. Jquery - 如何從TABLE TD更改爲TAB或ENTER鍵
- 21. 按Tab鍵,然後在Selenium WebDriver中用ENTER鍵輸入Ruby
- 22. 在Silverlight窗體中更改Enter鍵到Tab鍵
- 23. Tab鍵不起作用
- 24. 「tab」鍵onkeyup()的Perfom動作
- 25. gvim tab鍵不起作用
- 26. 使用「Enter」鍵執行「Tab」鍵的操作單擊引導行內部
- 27. Eclipse的快捷鍵,使用Tab鍵盤
- 28. VB6捕獲Tab鍵
- 29. 輔助和TAB鍵
- 30. C#禁用TAB鍵
不錯的代碼,使我所需要的。 – 2013-03-12 22:48:49
這很好,如果您的框架只出現在窗體上,唯一可以獲得焦點的控件是該窗體上的控件。如果你處於這種非常特殊的情況,那麼這個答案很好。在更普遍的情況下,您需要使用代碼來生活在表單上。那麼,你可以試着讓它在其他地方工作,但爲什麼?該表格是正確的地方。 – 2013-03-12 23:17:06
這是一個奇怪的行爲。在框架上有TScrollBox,其中放置了一些TLabel和TEdit控件。我已經將建議的代碼附加到了框架中,並且,當我按下ENTER時,焦點從第一個TEdit變爲最後一個,然後消失了!只有在第一個TEdit中出現後,我才需要按下ENTER鍵四五次。問題是什麼?如果焦點移動到父母:TScrollBox,TFrame,TForm? – 2013-03-12 23:20:00