[Gelöst] - Eigene Komponente - Probleme mit KeyDown....
-
- 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....
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.
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
Michael Springwald
Re: Eigene Komponente - Probleme mit KeyDown....
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;
-
- 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....
Hat sie. Ich klicke einmal auf die Komponente drauf, dann müsste sie ausgewählt sein oder?Es wäre vllt. ganz praktisch, wenn deine Komponente den Eingabefokus hätte?
MFG
Michael Springwald
Michael Springwald
-
- 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....
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.
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
Michael Springwald
Re: Eigene Komponente - Probleme mit KeyDown....
Ich glaube das war immer so.pluto hat geschrieben:Aber ist das schon seit "immer" so, oder ist seit einigen Versionen?
Zuletzt geändert von theo am So 20. Mai 2012, 20:59, insgesamt 1-mal geändert.
-
- 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....
<Form1>.KeyPreview:=true und den Code nach <Form1>.OnKeyDown() verschieben, lösen das Problem.
-
- 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....
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.<Form1>.KeyPreview:=true und den Code nach <Form1>.OnKeyDown() verschieben, lösen das Problem.
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
Michael Springwald
-
- 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....
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.
Du kannst in deine Komponente Focus-Rechteckt zeichnen wie bei Edits und Buttons.
-
- 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....
Ja. Dafür muss ich die Komponente legndlich anklicken, schon hat sie den Fokus.Das ist schon normal. Du kannst auch nicht in Edit-Komponente schreiben solange die kein Focus hat.
Ja.Du kannst in deine Komponente Focus-Rechteckt zeichnen wie bei Edits und Buttons.
MFG
Michael Springwald
Michael Springwald