[Gelöst] - Eigene Komponente - Probleme mit KeyDown....

Rund um die LCL und andere Komponenten
Antworten
pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

[Gelöst] - Eigene Komponente - Probleme mit KeyDown....

Beitrag von pluto »

Hallo

Ich habe eine eigene Komponente erstellt die ein ganz eigenartiges Verhalten zeigt, wenn es um die Tastertur "Methoden" geht. Die Klasse ist von TCustomControl abgeleitet.
Nun habe ich z.b. KeyDown überschrieben. Jetzt möchte ich Tastertur Code auswerten. KeyDown wird aber nur aufgerufen, wenn ich die Maustaste drücke.
Sobald das Fenster mehr als eine Komponente hat, geht es nicht mehr. Es reicht schon ein Panel.

Ich habe extra ein Beispiel Programm erstellt. SynEdit hat das Problem nicht. Warum habe ich bis jetzt nicht rausgefunden. Also muss es eine Lösung geben.
Habt ihr das Problem auch?

In meiner eigentlichen Komponente, die ich gerade erstelle mache ich das im Moment über ein From. Aber langfristig wäre eine andere Lösung nicht schlecht.

In Früheren Versionen von Lazarus hatte ich damit nie solche Probleme. ich verwende Lazarus 1.1 und FPC 2.6.
Vielleicht müsste ich die SVN Version mal updaten....

edit01: Anhang vergessen gehabt.
Dateianhänge
keydowntest.zip
(65.09 KiB) 99-mal heruntergeladen
Zuletzt geändert von pluto am Mo 21. Mai 2012, 15:51, insgesamt 1-mal geändert.
MFG
Michael Springwald

Benutzeravatar
theo
Beiträge: 10905
Registriert: Mo 11. Sep 2006, 19:01

Re: Eigene Komponente - Probleme mit KeyDown....

Beitrag von theo »

Es wäre vllt. ganz praktisch, wenn deine Komponente den Eingabefokus hätte?

Code: Alles auswählen

procedure TForm1.FormShow(Sender: TObject);
begin
    MyCompo.SetFocus;
end;

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: Eigene Komponente - Probleme mit KeyDown....

Beitrag von pluto »

Es wäre vllt. ganz praktisch, wenn deine Komponente den Eingabefokus hätte?
Hat sie. Ich klicke einmal auf die Komponente drauf, dann müsste sie ausgewählt sein oder?
MFG
Michael Springwald

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: Eigene Komponente - Probleme mit KeyDown....

Beitrag von pluto »

Neue Infos:
Wenn ich " ActiveControl:=MyCompo;" bei "TForm1.FormCreate" mache, geht es, auch ohne das ich eine Maus Taste drücke. Aber wehe, ich ändere den Focus z.b. ich klicke auf einen Button, den ich auf ein Panel platziert habe dann geht es nicht mehr.
Ich denke, du könntest recht haben, es liegt offenbar ein Problem mit dem Focus vor. Ich vermute wird der Focus warum auch immer nicht richtig gesetzt bei meiner Komponente wenn ich mit der Maus drauf klicke.

Edit01: Die Methode " function Focused: Boolean; override;" wird beim drauf klicken nicht aufgerufen. Aber warum nicht?

Edit02: Ich habe dein "SetFocus" mal in MouseDown gemacht und siehe da: es läuft. Aber ist das so vorgesehen?

Edit03: Anscheint macht das SynEdit genau so " LCLIntf.SetFocus(Handle);" also wird das richtig sein. Danke für dein Hinweis. Aber ist das schon seit "immer" so, oder ist seit einigen Versionen?
In dieser Form ist es mir erst gestern aufgefallen.
MFG
Michael Springwald

Benutzeravatar
theo
Beiträge: 10905
Registriert: Mo 11. Sep 2006, 19:01

Re: Eigene Komponente - Probleme mit KeyDown....

Beitrag von theo »

pluto hat geschrieben:Aber ist das schon seit "immer" so, oder ist seit einigen Versionen?
Ich glaube das war immer so.
Zuletzt geändert von theo am So 20. Mai 2012, 20:59, insgesamt 1-mal geändert.

Scotty
Beiträge: 768
Registriert: Mo 4. Mai 2009, 13:24
OS, Lazarus, FPC: Arch Linux, Lazarus 1.3 r44426M FPC 2.6.4
CPU-Target: x86_64-linux-qt/gtk2
Kontaktdaten:

Re: Eigene Komponente - Probleme mit KeyDown....

Beitrag von Scotty »

<Form1>.KeyPreview:=true und den Code nach <Form1>.OnKeyDown() verschieben, lösen das Problem.

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: Eigene Komponente - Probleme mit KeyDown....

Beitrag von pluto »

<Form1>.KeyPreview:=true und den Code nach <Form1>.OnKeyDown() verschieben, lösen das Problem.
So habe ich es auch gemacht. Aber das ist nicht Sinn der Übung... Und auch bestimmt nicht der richtige Weg. Aber schön, dass auch noch andere auf diese einfache Lösung kommt.

Wie schon gesagt: Ein einfaches SetFocus in MousDown bei der Komponente und schon läuft es wie es soll.
Aber wie kommt man auf solche Kleinen hinweise? Zufall? Glück?
MFG
Michael Springwald

Bora4d
Beiträge: 290
Registriert: Mo 24. Dez 2007, 13:14
OS, Lazarus, FPC: WinXP-Pro-Sp3, Xubuntu 12.04, (Laz 1.1-SVN Mai2012, FPC 2.6.1 / 2.6.0-Linux)
CPU-Target: AMD64X2

Re: Eigene Komponente - Probleme mit KeyDown....

Beitrag von Bora4d »

Das ist schon normal. Du kannst auch nicht in Edit-Komponente schreiben solange die kein Focus hat.
Du kannst in deine Komponente Focus-Rechteckt zeichnen wie bei Edits und Buttons.

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: Eigene Komponente - Probleme mit KeyDown....

Beitrag von pluto »

Das ist schon normal. Du kannst auch nicht in Edit-Komponente schreiben solange die kein Focus hat.
Ja. Dafür muss ich die Komponente legndlich anklicken, schon hat sie den Fokus.
Du kannst in deine Komponente Focus-Rechteckt zeichnen wie bei Edits und Buttons.
Ja.
MFG
Michael Springwald

Antworten