Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   [FMX] OnKeyDown kommt plötzlich nicht mehr durch (https://www.delphipraxis.net/197949-%5Bfmx%5D-onkeydown-kommt-ploetzlich-nicht-mehr-durch.html)

Medium 20. Sep 2018 15:34

[FMX] OnKeyDown kommt plötzlich nicht mehr durch
 
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.)

EWeiss 20. Sep 2018 16:57

AW: [FMX] OnKeyDown kommt plötzlich nicht mehr durch
 
Müsste das nicht auch in FMX (Bin kein FMX writer daher als Frage in den Raum gestellt)
Delphi-Quellcode:
procedure TMyEdit.OnKeyDown(var Key: Word; var KeyChar: WideChar; Shift: TShiftState);


lauten?

gruss

Medium 20. Sep 2018 18:08

AW: [FMX] OnKeyDown kommt plötzlich nicht mehr durch
 
Nee, so heißt das Event. Die dadurch aufgerufene Methode heißt tatsächlich "KeyDown()". Habe ich 1:1 aus den Quellen von TControl kopiert.

Edit: Und auch schon von Anfang an so gehabt, auch als alles noch klappte.

KodeZwerg 20. Sep 2018 18:40

AW: [FMX] OnKeyDown kommt plötzlich nicht mehr durch
 
Und im History Ordner kein Backup der alten lauffähigen mehr drinnen?

Medium 21. Sep 2018 08:06

AW: [FMX] OnKeyDown kommt plötzlich nicht mehr durch
 
Gerade geschaut: Leider nein. Hab wohl schon zu viel herumprobiert. Echt mysteriös das ganze :?

Medium 21. Sep 2018 13:58

AW: [FMX] OnKeyDown kommt plötzlich nicht mehr durch
 
Hm, scheint es keine Erklärung für zu geben, und auch sonst im Netz werde ich komplett 0 fündig. Scheint noch nie jemand so gemacht zu haben.

Ich habe mir jetzt aber beholfen, indem ich dann doch den Fokus zulasse, und ein paar Dinge anstelle die dennoch sicherstellen, dass das daraus resultierende (schwer so zu erklärende) problematische Verhalten nicht eintritt. Mit Fokus bekomme ich brav alle Eingaben, wie es auch eigentlich zu erwarten war. Es hatte mich nämlich schon gewundert warum es auch ohne geklappt hat - aber Delphi hats wohl nach ein paar Stunden gemerkt und selbst repariert :stupid:

KodeZwerg 21. Sep 2018 14:08

AW: [FMX] OnKeyDown kommt plötzlich nicht mehr durch
 
Ich habe keine Ahnung von FMX, für mich liegt hier der Fehler/nicht Fehler begraben.
Delphi-Quellcode:
procedure TMyEdit.Click;
begin
  IsClicked := True;
  inherited;
end;
Da habe ich keine Vorstellung wann das wie getriggert wird damit es True ergibt bzw wie es wieder False wird.

Ps:
vielleicht ist es auch das
Delphi-Quellcode:
inherited
im OnKeyDown Event?

Medium 21. Sep 2018 14:31

AW: [FMX] OnKeyDown kommt plötzlich nicht mehr durch
 
Das ist die virtuelle Methode, die in TControl deklariert ist und beim OnClick ausgelöst wird. Diese überschreibe ich dort. Der Klick kommt auch an, und IsClicked wird definitiv gesetzt (sehe ich daran, dass ich dann andersfarbig zeichne). IsClicked wird durch Drücken von Enter wieder zurückgenommen, wie in der KeyDown-Methode zu sehen ist.

Das inherited muss da schon bleiben, weil sonst die Implementierung von TControl übergangen wird, welche dafür verantwortlich ist den via OnKeyDown zugewiesenen Handler aufzurufen. (Ich möchte ja weiterhin auch im Formular nachher die Möglichkeit haben auf diese Ereignisse zu reagieren.) (Außerdem ist es verflucht schlechter Stil die inherited-Kette von virtuellen Methoden zu brechen.)
Ich hatte das inherited aber spaßeshalbar bei meinen Tests schon ans Ende gesetzt, aber auch ohne erkennbare Wirkung.

Ich bin mir deshalb so sicher, dass es auch ohne Fokus ging, weil ich 3 dieser Edits auf einem Formular hatte zum testen, und gleichzeitig in alle 3 schreiben konnte. Und Fokus kann ja immer nur einer sein. Diesen Zustand konnte ich nie wieder herstellen. Wie verhext.


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:35 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz