Huhu
DP!
Ich schreibe mir gerade eine eigene Edit-Komponente mit FireMonkey, da mir bei der beiliegenden ein paar Dinge fehlen. Ich leite diese von TShape ab, welches seinerseits von TControl ableitet.
In meiner Komponente überschreibe ich die Methode "KeyDown", die in TControl als virtual deklariert ist. Und bis vor ca. 2h habe ich damit auch wunderbar Tastendrücke erhalten - jetzt aber auf ein Mal nicht mehr. Und ich komme seit dem nicht dahinter, wieso das so ist.
In der
VCL könnte ich es noch mit KeyPreview versuchen, aber dies scheint es in FMX überhaupt nicht zu geben. Meine Komponente hat ja auch, bisher, in einem frischen und leeren FMX Projekt wunderbar funktioniert.
Hier mal die relevanten Code-Teile:
Delphi-Quellcode:
type
TMyEdit = class(TShape)
private
FText: String;
FFont: TFont;
.
.
.
FIsClicked: Boolean;
procedure SetIsClicked(const Value: Boolean);
protected
procedure Click; override;
procedure KeyDown(var Key: Word; var KeyChar: WideChar; Shift: TShiftState); override;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
property IsClicked: Boolean read FIsClicked write SetIsClicked;
published
property OnKeyDown;
property OnKeyUp;
end;
implementation
procedure TMyEdit.Click;
begin
IsClicked := True;
inherited;
end;
procedure TMyEdit.KeyDown(var Key: Word; var KeyChar: WideChar; Shift: TShiftState);
begin
ShowMessage('Taste kommt');
if IsClicked then
begin
ShowMessage('is auch geclickt');
case Key of
vkReturn: IsClicked := False;
vkBack: ...
vkDelete: ...
vkLeft: ...
vkRight: ...
vkEnd: ...
vkHome: ...
else
FText := FText + KeyChar;
end;
Repaint;
end;
inherited;
end;
Vorher wurde brav alles neue an FText angehängt, jetzt kommen die (nur zum debuggen eingesetzten) ShowMessages erst gar nicht an. IsClicked wird allerdings korrekt gesetzt, also prinzipiell bekommt die Komponente noch etwas mit.
Auch nachher im eigentlichen Projekt angelegte Handler für die OnKeyDown/Up Events werden nicht mehr ausgeführt. Wie kann das passieren? (Ich möchte gern aus verschiedenen Gründen kein fokussierbares Control daraus machen, und es war bisher auch gar nicht nötig um Tastendrücke zu bekommen.)
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)