2013-10-08 16 views
1

시스템의 일부 문제를 해결하려면 프레임 (TFrame)에 OnKeyDownOnKeyPress 이벤트를 구현해야합니다. 현재 완화 된 해결책을 찾았지만 매우 추악하고 문제가 있습니다.TFrame에서 OnKeyDown 이벤트 구현 방법

프로세스가 다소 다음

1)는 I TFrame에서 상속하는베이스 클래스 이벤트 OnKeyDownOnKeyPress을 만들었다.

2) TForm을 기반으로하는 표준 양식에서 실행 키를 가로 채는 컨트롤을 구현했습니다. 따라서이 프로세스는 프레임의 첫 번째 키 이벤트와 양식의 키 이벤트를 실행합니다.

OnKeyDown 이벤트가 프레임 전과 후에 폼에서 실행되기를 원했기 때문에해야했습니다. 구현 작업이지만 더 나은 코드로 생각할 것입니다.

누구나 더 나은 해결책을 제안 할 수 있습니까? 이 문제를 해결할 더 우아한 방법이 있습니까?

+0

확실하지,하지만 난 원래의 질문이 편집 필요하다고 생각 : 내 TFrame에 onKeyDown에와 때 onKeyPress : 1. 나는 두 개의 이벤트 핸들러를 만들었습니다. 2. TFrame을 사용하는 TForm에서 TForm의 OnKeyDown과 OnKeyPress에 연결된 두 개의 이벤트 처리기를 작성했습니다. 이러한 이벤트 핸들러는 먼저 동일한 이름의 TFrame 메소드를 호출합니다. 이러한 호출의 결과에 따라 TForm 이벤트 핸들러는 키 자체를 처리 할 수 ​​있습니다. – RobertFrank

답변

0

같은 형태의 onKeyDown에와 때 onKeyPress에서 호출 좀 더 많은 테스트를했다하고있어 이 원리는 문제없이 작동했다.

1) 재귀 함수를 통해 프레임의 기본 유형 객체를 가져옵니다.

2) 활성 컨트롤이 표준 프레임에 포함되어 있으면 OnKeyDown, OnKeyPress 이벤트 실행을 호출하십시오.

누군가가 뭔가를 필요로한다면, 아래는 내 응용 프로그램 테스트 코드입니다.

Unit UnFrameBase; 

Interface 

Uses 
    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, 
    Dialogs, ExtCtrls, ActnList; 

Type 
    TFrameBase = Class(TFrame) 
    PnlBase: TPanel; 
    Private 
    Public 
    Procedure EventFrameKeyDown(Sender: TObject; Var Key: Word; Shift: TShiftState); Virtual; 
    End; 

Implementation 


{$R *.dfm} 

{ TFrameBase } 

Procedure TFrameBase.EventFrameKeyDown(Sender: TObject; Var Key: Word; Shift: TShiftState); 
Begin 
    //nothing 
End; 

End. 


Unit UnControlsClassTest; 

interface 

uses Classes, Controls; 

Function ActiveControlAs(AControl: TWinControl; 
    AClass: TWinControlClass): TWinControl; 

    Function CheckControl(Var C: TWinControl; ControlClass: TWinControlClass): Boolean; 
    Var 
     Parent: TWinControl; 
    Begin 
     Result := (C Is ControlClass); 
     If (Result = False) And (C <> Nil) And (C.Parent <> Nil) Then 
     Begin 
     Parent := C.Parent; 
     Result := CheckControl(Parent, ControlClass); 
     If Result Then 
      C := Parent; 
     End; 
    End; 


Var 
    C: TWinControl; 

Begin 
    C := AControl; 
    If CheckControl(C, AClass) Then 
    Result := C 
    Else 
    Result := Nil; 

End; 


Unit UnMainFormTest; 

Interface 

Uses 
    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, 
    Dialogs, ComCtrls, UnFrameCustomer, UnFrameBase; 

Type 
    TFormMain = Class(TForm) 
    Procedure FormCreate(Sender: TObject); 
    Procedure BtnTestarClick(Sender: TObject); 
    Procedure FormKeyDown(Sender: TObject; Var Key: Word; Shift: TShiftState); 
    Private 
    Function GetInstanceActiveFrame(AActiveControl: TWinControl): TFrameBase; 
    Public 
    { Public declarations } 
    End; 

Implementation 

Uses UnControlsClassTest; 

{$R *.dfm} 


Function TFormMain.GetInstanceActiveFrame(AActiveControl: TWinControl): TFrameBase; 
Begin 
    Result := TFrameBase(ActiveControlAs(AActiveControl, TFrameBase)); 
End; 

Procedure TFormMain.FormKeyDown(Sender: TObject; Var Key: Word; Shift: TShiftState); 
Var 
    LActiveFrame: TFrameBase; 

Begin 
    LActiveFrame := GetInstanceActiveFrame(ActiveControl); 
    If Assigned(LActiveFrame) Then 
    LActiveFrame.EventoFrameKeyDown(Sender, Key, Shift); 

    If Key In [VK_DOWN, VK_RETURN] Then 
    Begin 
    Perform(WM_NEXTDLGCTL, 0, 0); 
    Key := 0; 
    End 
    Else If Key = VK_UP Then 
    Begin 
    Perform(WM_NEXTDLGCTL, 1, 0); 
    Key := 0; 
    End; 
End; 
1

시도해보십시오. 대신 TFrame의 후손을 만드는, 그런

procedure TFrame2.KeyDown(var Key: Word; Shift: TShiftState); 
begin 
    Memo1.Lines.Add('KeyDown: '+IntToStr(Key)); 
end; 

procedure TFrame2.KeyPress(var Key: Char); 
begin 
    Memo1.Lines.Add('KeyPress: '+IntToStr(ord(Key))); 
end; 

같은 프레임에서 KeyDown 키 누르기 절차를 만들

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; 
    Shift: TShiftState); 
begin 
    Frame21.KeyDown(Key,Shift); 
end; 

procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char); 
begin 
    Frame21.KeyPress(Key); 
end; 
+0

안녕하세요 @crefird. 현재 내가하는 일이 바로 이것입니다. 하지만 내 수업 TMyForm 때 어떤 프레임 유형 TMyFrame 가로 채기 내 일반적인 방식입니다. 내 아이디어는 조금 다른 해결책을 만드는 것이었지만, 다른 방법이 없다면, 나는 그것에 맡겨야 할 것입니다. – Delphiman