2013-03-11 75 views

回答

4

下面是一些示例代碼,用於處理幀上的消息,以便能夠在按下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; 
+0

不錯的代碼,使我所需要的。 – 2013-03-12 22:48:49

+0

這很好,如果您的框架只出現在窗體上,唯一可以獲得焦點的控件是該窗體上的控件。如果你處於這種非常特殊的情況,那麼這個答案很好。在更普遍的情況下,您需要使用代碼來生活在表單上。那麼,你可以試着讓它在其他地方工作,但爲什麼?該表格是正確的地方。 – 2013-03-12 23:17:06

+0

這是一個奇怪的行爲。在框架上有TScrollBox,其中放置了一些TLabel和TEdit控件。我已經將建議的代碼附加到了框架中,並且,當我按下ENTER時,焦點從第一個TEdit變爲最後一個,然後消失了!只有在第一個TEdit中出現後,我才需要按下ENTER鍵四五次。問題是什麼?如果焦點移動到父母:TScrollBox,TFrame,TForm? – 2013-03-12 23:20:00

6

所有你需要的是修改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; 

嗯,這是非常明顯的是什麼,以及它是如何工作的。

你問如何在一個框架中做到這一點。無法在框架中處理對話框導航。這是由相當明顯的原因形式完成的。因此,您需要以某種方式將此代碼拼接到託管框架的表單中。

對於備忘錄控制,這將不起作用。他們會將按輸入作爲換行符的輸入。但我想這就是你想要發生的事情。否則,備忘錄控制將完全無法使用。

+0

@anondv我在這個答案中弄錯了什麼 – 2013-03-11 14:36:22

+0

在一個框架中它是不可能的。但我明白其中的原因,如果一個表單上有許多框架,就必須爲它們全部編寫一個事件處理程序。謝謝! – 2013-03-11 14:48:30

+1

原因是,如果焦點集中在一幀中的最後一個控件上,那麼TAB需要移動到下一幀中的第一個控件。由於每一幀都是孤立的,所以幀不能負責。只有表單才能看到關於它的所有控件的全貌。這就是爲什麼'CM_DIALOGKEY'被髮送到父窗體。 – 2013-03-11 15:00:02

0

我覺得有很多的「滴,忘記了」組件來做到這一點,例如在http://Torry.net

例如,這種成分是RxLib的一部分,後來在JediVCL inherted與TJvEnterAsTab名稱。

+0

我認爲使用一個組件來完成可以用某些代碼行編寫的任務是不合理的。 – 2013-03-12 19:02:09

+0

取決於POV。組件將代碼集中起來,並將維護的負擔放在別人身上。但選擇是你的,我只是注意到你有一個。 – 2013-03-13 06:01:13