Форма keypreview не работает
У меня есть создание mainform (авто создание формы) и 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, чтобы быть правдой?
1 ответ
Решение
В 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;
......