Form.Keypreview vs. Memo
Form.Keypreview vs. Memo
Hallo, in einigen meiner Forms nutze ich keypreview, um Tasteneingaben (für Textscrollen und sonstige Hotkeys) abzufangen. Wenn nun das Form zusätzlich noch ein Memo enthält und ich Form.KeyPreview=true setze, werden die Tasten zwar wie gewünscht abgefangen, doch landen sie anschließend auch im Memo (was dann quasi ungewünscht alle Tasten 'mitprotokolliert'). Ich hätte es nun gerne so, dass das Memo Eingaben nur dann aufnimmt, wenn es auch im Fokus liegt (weil es angeklickt wurde o.ä.). Wie mache ich das?
Vielen Dank schonmal
Vielen Dank schonmal
- m.fuchs
- Lazarusforum e. V.
- Beiträge: 2808
- Registriert: Fr 22. Sep 2006, 19:32
- OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
- CPU-Target: x86, x64, arm
- Wohnort: Berlin
- Kontaktdaten:
Re: Form.Keypreview vs. Memo
Mal davon ausgehend, dass du TForm.OnKeyDown benutzt: Der Parameter Key ist ein var-Parameter. Das heißt, du kannst ihn im Inneren deiner Methode verändern.
Wenn du nun also eine Taste erwischt hast, die nicht ans Memo gehen soll, führst du in der OnKeyDown-Methode einfach folgendes aus:
Damit wird der ursprüngliche Inhalt der Key-Variable mit dem NUL-Zeichen überschreiben und darauf reagiert das Memo nicht.
Wenn du nun also eine Taste erwischt hast, die nicht ans Memo gehen soll, führst du in der OnKeyDown-Methode einfach folgendes aus:
Code: Alles auswählen
Key := #0;
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de
Re: Form.Keypreview vs. Memo
das bewirkt leider nicht, was ich möchte, denn jetzt gehen die Tasten überhaupt nicht mehr ans Memo.
mein Ausgangsproblem hat auch zwei Seiten (zur Erklärung: ich habe auf meiner Form eine Paintbox, die ich mit keys scrolle, und zusätzlich eine paar Memos);
a) wenn ich eine der Steuertasten (wasd und co.) drücke, gehen die gleich ins Memo, obwohl ich in dem Moment wirklich nur die Paintbox steuern möchte, spricht das Memo nicht angeklickt oder dort den cursor gesetzt habe...
b) wenn ich im Memo einen Text eingebe und dabei eine der Steuertasten fällt, werden sie dank keypreview auch vom Form verarbeitet, obwohl in diesem Moment wirklich nur eine Texteingabe erfolgen soll
ich möchte aber a) und b) ausschließen. Ich bin mir auch recht sicher, dass das gut geht. Denn bei mehr als einem Memo pro Form landet die eingabe ja auch nicht in jedem Memo, sondern nur in dem, das aktuell im Fokus liegt...
[edit]: ich habe noch etwas rumprobiert; ein Teil des Problems ist anscheinend, dass mein Memo beim Erstellen der Form automatisch den Fokus hat, obwohl ich es noch nicht angeklickt habe, das erklärt zumindest Punkt a) ... mein Problem könnte daher auch so geschildert werden, dass ich es nicht schaffe, den Fokus zur Laufzeit wieder auf die Paintbox zu legen - ich kann ihn nur an Buttons oder andere Eingabefelder und Memos 'abgeben', was zu Problem b) führt ...
mein Ausgangsproblem hat auch zwei Seiten (zur Erklärung: ich habe auf meiner Form eine Paintbox, die ich mit keys scrolle, und zusätzlich eine paar Memos);
a) wenn ich eine der Steuertasten (wasd und co.) drücke, gehen die gleich ins Memo, obwohl ich in dem Moment wirklich nur die Paintbox steuern möchte, spricht das Memo nicht angeklickt oder dort den cursor gesetzt habe...
b) wenn ich im Memo einen Text eingebe und dabei eine der Steuertasten fällt, werden sie dank keypreview auch vom Form verarbeitet, obwohl in diesem Moment wirklich nur eine Texteingabe erfolgen soll
ich möchte aber a) und b) ausschließen. Ich bin mir auch recht sicher, dass das gut geht. Denn bei mehr als einem Memo pro Form landet die eingabe ja auch nicht in jedem Memo, sondern nur in dem, das aktuell im Fokus liegt...
[edit]: ich habe noch etwas rumprobiert; ein Teil des Problems ist anscheinend, dass mein Memo beim Erstellen der Form automatisch den Fokus hat, obwohl ich es noch nicht angeklickt habe, das erklärt zumindest Punkt a) ... mein Problem könnte daher auch so geschildert werden, dass ich es nicht schaffe, den Fokus zur Laufzeit wieder auf die Paintbox zu legen - ich kann ihn nur an Buttons oder andere Eingabefelder und Memos 'abgeben', was zu Problem b) führt ...
Re: Form.Keypreview vs. Memo
Nur kurz dazu: Eine Paintbox kann keinen Fokus erhalten, da sie von TGraphicControl abgeleitet ist.
Du könntest dir eine Komponente von TCustomControl ableiten.
Du könntest dir eine Komponente von TCustomControl ableiten.
Re: Form.Keypreview vs. Memo
Evtl. hilft Dir ja auch die Überlegung wirklich die Steuerungstaste zu verwenden, sprich <Ctrl> + <Taste> für ein Steuern der PaintBox?!mulcheo hat geschrieben:wenn ich eine der Steuertasten (wasd und co.) drücke
Code: Alles auswählen
type
TLiveSelection = (lsMoney, lsChilds, lsTime);
TLive = Array[0..1] of TLiveSelection;
Re: Form.Keypreview vs. Memo
leider nicht wirklich - es sind ja nicht nur die Tasten für 'auf' und 'ab', sondern auch noch Tasten für das Einblenden von Masken, Listenwechsel usw. ... ich kann mein Programm jetzt zwar so ändern, dass das Memo nur dann den Fokus erhält, wenn ich auch wirklich etwas eingeben möchte, aber dann muss ich den Fokus auf ein anderes Objekt schieben. Irgendwie verhagelt's mir damit gesamte Steuerung; hat niemand eine Idee, wie ich das lösen könnte? Bzw. gibt es eine Möglichkeit, präzise festzulegen, wann welche Komponente die Eingabe aufnimmt (ich würde dann versuchen, eine Variable setzen, die das zur Laufzeit regelt und die Tasten wahlweise zur Paintbox, zum Edit, zum Memo oder zur Combobox etc. sendet)Michl hat geschrieben:Evtl. hilft Dir ja auch die Überlegung wirklich die Steuerungstaste zu verwenden, sprich <Ctrl> + <Taste> für ein Steuern der PaintBox?!mulcheo hat geschrieben:wenn ich eine der Steuertasten (wasd und co.) drücke
höchst ärgerlich das ganze

[edit]:

Code: Alles auswählen
procedure TForm2.Memo1Enter(Sender: TObject);
begin
Form2.KeyPreview:=false;
end;
procedure TForm2.Memo1Exit(Sender: TObject);
begin
Form2.Keypreview:=true;
end;
Re: Form.Keypreview vs. Memo
Du könntest einem unverfänglichen Button den Focus geben:mulcheo hat geschrieben:Bleibt noch zu klären, wie ich den Fokus vom Memo nehmen kann, indem ich beispielsweise auf einen anderen Punkt irgendwo in Form2 klicke
Code: Alles auswählen
procedure TForm1.FormClick(Sender: TObject);
begin
Button1.SetFocus;
end;
Du könntest auch die PaintBox (mit den Scrollbars) in ein TFrame (oder in eine separate Form) stecken und diesem den Focus geben?!
Code: Alles auswählen
type
TLiveSelection = (lsMoney, lsChilds, lsTime);
TLive = Array[0..1] of TLiveSelection;