2013-03-11 3 views

답변

4

다음은 을 입력하면을 누르면 다음 컨트롤로 이동할 수있는 프레임의 메시지를 처리하는 몇 가지 예제 코드입니다. 이 샘플에서는 키를 수정하지 않으므로 키가됩니다. 대신 다음 제어를 선택하고 키 다운 메시지의 추가 처리를 방지합니다.

코드를 추가로 조정해야 할 수도 있습니다. 하나의 컨트롤에 실제로 키를 입력해야하는 경우 (예 : 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

내가 원하는 것을 만드는 좋은 코드. –

+0

포커스를받을 수있는 컨트롤이 해당 단일 프레임에있는 컨트롤 만있는 폼에만 프레임 만 나타나면 괜찮습니다. 매우 구체적인 상황에 있다면이 대답은 좋습니다. 보다 일반적인 상황에서는 양식에 살기위한 코드가 필요합니다.음, 다른 곳에서 작동하도록 할 수는 있지만 왜 그럴까요? 양식이 적합한 장소입니다. –

+0

이상한 행동이었습니다. 프레임에는 TLabel 및 TEdit 컨트롤이있는 TScrollBox가 있습니다. 제안 된 코드를 프레임에 첨부하고 Enter 키를 누를 때 포커스가 첫 번째 TEdit에서 마지막으로 변경된 다음 사라졌습니다. 첫 번째 TEdit에 다시 나타난 후 Enter 키를 4 ~ 5 번 눌러야합니다. 문제가 무엇입니까? 포커스가 부모에게 이동 된 위치 : TScrollBox, TFrame, TForm? –

6

CM_DIALOGKEY의 처리를 수정하면됩니다.

글쎄,이 기능과 작동 방식은 매우 분명합니다.

프레임에서이를 수행하는 방법을 문의하십시오. 프레임에서 대화 상자 탐색을 처리하는 것은 불가능합니다. 그것은 상당히 명백한 이유 때문에 양식에 의해 수행됩니다. 따라서 프레임을 호스팅하는 형식으로이 코드를 연결해야합니다.

메모 제어의 경우 이는 아무 효과가 없습니다. ENTER을 줄 바꿈 입력으로 처리합니다. 그러나 나는 그것이 당신이 원하는 것이라고 생각합니다. 그렇지 않으면 메모 컨트롤을 완전히 사용할 수 없게됩니다.

+0

@anondv이 대답에서 잘못된 것이 있습니까 –

+0

프레임에서 가능하지 않은 불만입니다. 그러나 폼에 프레임이 많은 경우 해당 이벤트에 대해 하나의 이벤트 핸들러 만 작성해야합니다. 고맙습니다! –

+1

포커스가 한 프레임의 마지막 컨트롤에있는 경우 TAB은 다음 프레임의 첫 번째 컨트롤로 이동해야합니다. 그리고 각 프레임이 분리되어 있기 때문에 프레임이 그 프레임을 담당 할 수 없습니다. 양식에만있는 모든 컨트롤의 큰 그림을 볼 수 있습니다. 그래서 'CM_DIALOGKEY'가 부모 폼으로 전송됩니다. –

0

내가 많이 있다고 생각 "드롭 잊지"구성 요소가 예를 들어 http://Torry.net

에 예를 들어, 그것을 할, 이러한 구성 요소는 RxLib의 일부 나중에 TJvEnterAsTab와 JediVCL에 inherted했다 이름.

+0

일부 코드 줄에 작성할 수있는 작업에 구성 요소를 사용하는 것이 불합리하다고 생각합니다. –

+0

은 POV에 따라 다릅니다. 구성 요소는 코드를 중앙 집중화하고 유지 보수의 부담을 다른 사람에게 위임합니다. 그러나 선택은 당신의 것입니다. 나는 당신이 가지고있는 것을 발견했습니다. –

관련 문제