1

メインフォームの作成(フォームの自動作成)とForm1(使用可能なフォーム)があります。form1を呼び出すために使用するメソッドは次のようになります

procedure Tmainform.Button2Click(Sender: TObject);
var
f : Tform1;
begin
f:=Tform1.create(self);
f.parent:=Tabsheet1;
f.visible:=true;
f.align:=alClient;
end;

問題は、彼のKeyPreviewをアクティブにしたのに、Form1のKeyPreviewが機能しないのはなぜですか?

4

1 に答える 1

2

呼び出しでfunction TWinControl.DoKeyDown(var Message: TWMKey): Boolean;は、存在する場合は親に委任されます。

手順

procedure TWinControl.KeyDown(var Key: Word; Shift: TShiftState);
begin
  if Assigned(FOnKeyDown) then FOnKeyDown(Self, Key, Shift);
end;

フォームがペアレント化されている場合は呼び出されません

function TWinControl.DoKeyDown(var Message: TWMKey): Boolean;
var
  ShiftState: TShiftState;
  Form, FormParent: TCustomForm;
  LCharCode: Word;
begin
  Result := True;
  { First give the immediate parent form a try at the Message }
  Form := GetParentForm(Self, False);
  if (Form <> nil) and (Form <> Self) then 
  begin
    //  >> -- the DoKeyDown of the parent (not of your form) will be called 
    if Form.KeyPreview and TWinControl(Form).DoKeyDown(Message) then
      Exit;
    { If that didn't work, see if that Form has a parent (ie: it is docked) }
    if Form.Parent <> nil then 
    begin
      FormParent := GetParentForm(Form);
      if (FormParent <> nil) and (FormParent <> Form) and FormParent.KeyPreview and
          TWinControl(FormParent).DoKeyDown(Message) then
        Exit;
    end;
  end;
......
于 2012-12-09T16:28:39.063 に答える