Hallo.
In meiner Demo bin ich aus Schusseligkeit nicht auf die Sache mit dem KeyPreview eingegangen. Hier eine erweiterte Demo, die etwas Licht auf dieses Problem wirft.
Dazu muss man wissen, dass Borland die ParentForm eines Controls für die Überprüfung der Eigenschaft KeyPreview ermittelt, indem es den Top-Level-Parent des Controls sucht. Dadurch arbeitet KeyPreview bei ChildForms nicht auf die übliche Weise. KeyPreview muss bei der ParentForm von ChildForm gesetzt werden und nur dort wird die Eigenschaft von den
VCL-Machern auch ausgewertet.
Es gibt jetzt zwei Strategien zum Umgang mit der Misere - neben dem Ansatz von Frank, den ich mangels Zeit jetzt nicht nachvollzogen habe: Man berücksichtigt die Designschwäche und gestaltet die event handler OnKeyDown() etc. entsprechend (siehe Demo) oder man verkettet die event handler im Ereignis OnCreate() der ChildForm.
Man beachte die von mir überschriebene Funktion GetParentForm():
Delphi-Quellcode:
function GetParentForm(Control: TControl): TCustomForm;
begin
Result := nil;
while Assigned(Control.Parent) do
begin
Control := Control.Parent;
if Control is TCustomForm then
begin
Result := TCustomForm(Control);
Break;
end;
end;
end;
So erkenne ich im event handler der DemoForm, ob ein Tastendruck auf einem eigenen Control oder einem Control der ChildForm ausgelöst wurde.
marabu