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