TEdit - Hotkeys Arrowkeys

Rund um die LCL und andere Komponenten
Antworten
hubblec4
Beiträge: 341
Registriert: Sa 25. Jan 2014, 17:50

TEdit - Hotkeys Arrowkeys

Beitrag von hubblec4 »

Hallo Lazarus-Gemeinde

Ich bräuchte wiedermal ein paar Infos.

Ich habe in meinem Programm ein TEdit und dort werden im "onKeyDown" Event Hotkeys verarbeitet.
Hotkey Arrowkey: up oder down scheint aber von dem TEdit vordefiniert zu sein, denn der Curor wandert nach vorn/hinten im eingegebenen Text.

Ziel des Hotkey Befehls ist es ein neues Item zu selektieren und am Ende wird wieder das TEdit focusiert, und dabei soll der ganze (neu geladene) Text selektiert werden. Das funktioniert nur mit einem anderen Hotkey, zum Beispiel "Page up oder down".

Ich frag mal ganz naiv: Kann man diese "vordefinierten" Hotkeys für das TEdit(oder auch andere Komponenten) deaktivieren?

Selbst wenn ich nach dem neu Fokusieren des TEdit "SelectAll" ausführe wird der neue Text nicht selektiert.

hubble

hubblec4
Beiträge: 341
Registriert: Sa 25. Jan 2014, 17:50

Re: TEdit - Hotkeys Arrowkeys

Beitrag von hubblec4 »

Sorry wegen des Doppelposts, der Browser hing und hat die seite zweimal geladen und dabei abgeschickt.

Ein Admin kann gern das Thema einmal löschen,

Danke.

hubble
Zuletzt geändert von hubblec4 am Mo 1. Mai 2017, 18:23, insgesamt 1-mal geändert.

Mathias
Beiträge: 6164
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: TEdit - Hotkeys Arrowkeys

Beitrag von Mathias »

Code: Alles auswählen

procedure TForm1.Edit1KeyDown(Sender: TObject; var Key: word; Shift: TShiftState);
begin
  Caption := IntToStr(Key);
end;

Folgender Code macht mit Up und Down das selbe, wie mit PageUp und PageDown. Ausser das die Key-Nummer anders ist.
Einzig, Left und Right, da wird der Cursor bewegt.

Oder habe ich dich falsch verstanden ?

Ich frag mal ganz naiv: Kann man diese "vordefinierten" Hotkeys für das TEdit(oder auch andere Komponenten) deaktivieren?

Wen du am Ende von KeyDown noch folgende machst

Code: Alles auswählen

Key := 0;

Dann wird nichts mehr weitergeleitet.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

hubblec4
Beiträge: 341
Registriert: Sa 25. Jan 2014, 17:50

Re: TEdit - Hotkeys Arrowkeys

Beitrag von hubblec4 »

Mathias hat geschrieben:

Code: Alles auswählen

procedure TForm1.Edit1KeyDown(Sender: TObject; var Key: word; Shift: TShiftState);
begin
  Caption := IntToStr(Key);
end;

Folgender Code macht mit Up und Down das selbe, wie mit PageUp und PageDown. Ausser das die Key-Nummer anders ist.
Einzig, Left und Right, da wird der Cursor bewegt.

Oder habe ich dich falsch verstanden ?

Hier liegst du falsch, das sind zwei verschiedene "Integer" Werte.

Mathias hat geschrieben:Wen du am Ende von KeyDown noch folgende machst

Code: Alles auswählen

Key := 0;

Dann wird nichts mehr weitergeleitet.


Das werde ich auf jeden fall probieren, danke für den Tipp.


EDIT:
Jupp, den Key am Ende wieder auf 0 setzen bringt es.
Danke schön.

hubblec4
Beiträge: 341
Registriert: Sa 25. Jan 2014, 17:50

Re: TEdit - Hotkeys Arrowkeys

Beitrag von hubblec4 »

mmh, also für Windows geht es wieder einmal sofort,
allerdings bei Linux klappt das nicht.
Dort wird, nachdem man den Key auf 0 gesetzt hat und die onKey-Procedur zu Ende ist, das Edit nicht voll selektiert, sondern der Curosr an erste Stelle gesetzt.

Michl
Beiträge: 2505
Registriert: Di 19. Jun 2012, 12:54

Re: TEdit - Hotkeys Arrowkeys

Beitrag von Michl »

Keine Ahnung, was du da genau machst. Es kann schon sein, wenn ein Control gerade selbst im Status ist, den selektierten Text zu setzen, daß es Probleme gibt, wenn die Queue dann weiter abgearbeitet wird.

Zeig doch mal etwas Code, noch besser mit einem beigefügten gezippten minimierten Testbeispiel hintermauert, dann kann man eher etwas empfehlen.

Ins Blaue geraten, könnte Application.QueueAsyncCall oder so hilfreich sein.

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection; 

hubblec4
Beiträge: 341
Registriert: Sa 25. Jan 2014, 17:50

Re: TEdit - Hotkeys Arrowkeys

Beitrag von hubblec4 »

Ich habe mich dann doch nochmal bissl mit beschäfftigt, und habe sogar ein test-tool geschrieben.

Dabei musste ich dann feststellen, das es an meinem Code liegt, denn im Test-tool läuft es soweit ganz gut.
Da das Edit(oder LableEdit) auf Visible:=false gesetzt wird und später wieder mit SetFocus ausgewählt wird, wird in Linux da irgendwie noch weiter "Operriert", so dass eben das Edit nicht voll selektiert wird.

Danke dennoch für die Tipps, das hilft mir immer weiter.
Vorrerst lasse ich alles so.

hubblec4
Beiträge: 341
Registriert: Sa 25. Jan 2014, 17:50

Re: TEdit - Hotkeys Arrowkeys

Beitrag von hubblec4 »

Ich hatte heute noch etwas Zeit und habe das Test-proggi noch etwas angepasst.

Es ist nun in etwa so wie in meinem Programm. Das LabelEdit wird unsichtbar und bekommt unter Linux zwar auch wieder den Focus aber der Text wird nicht komplett selektiert.
Dateianhänge
Hotkey-Edit-SelAll.7z
(143.86 KiB) 47-mal heruntergeladen

Michl
Beiträge: 2505
Registriert: Di 19. Jun 2012, 12:54

Re: TEdit - Hotkeys Arrowkeys

Beitrag von Michl »

Man man man, wollt erst schreiben, daß ich nur Bahnhof verstehe, habe mir den Thread dann doch noch mal durchgelesen und konnte erahnen, wo es kneift. Bin doch auch nicht der Hellste und benötige im Regelfall eine Anleitung, wie:
Vergleiche Prog auf Windows vs. Linux GTK2:
- starte Prog
- klicke auf VST
- gehe ins LabelEdit
- drücke Pfeil-Runter-Taste
--> Windows LabelEdit ist alles selektiert, --> Linux GTK2 nicht

Das hätte mir das Verstehen sehr erleichtert!

Wie auch immer, o.g. habe ich gemacht und Windows 7 mit OpenSuse Leap 42.2 GTK2 verglichen. Ja es gibt einen Unterschied. Da alle nativ unterstützen Systeme sich etwas unterscheiden ist dies an dieser Stelle auch nicht verwunderlich. Versuchs mal so:

Code: Alles auswählen

procedure TForm1.VSTFocusChanged(Sender: TBaseVirtualTree;
 Node: PVirtualNode; Column: TColumnIndex);
var
 aText: String;
 aTag: Integer;
begin
...
  LaE.Visible:=true;
  Application.ProcessMessages; // <-- diese
  LaE.SelectAll; // <-- und diese Zeile einfügen
  LaE.SetFocus;
end;

Unter OpenSuse Lazarus 1.9.0 r54809M FPC 3.0.2 x86_64-linux-gtk2 geht es damit, hoffe bei dir auch?!

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection; 

hubblec4
Beiträge: 341
Registriert: Sa 25. Jan 2014, 17:50

Re: TEdit - Hotkeys Arrowkeys

Beitrag von hubblec4 »

Danke fürs Testen Michl, ja das mit der kleinen Anleitung hatte ich mir dann auch noch überlegt...werde ich beim nächstenmal mit beachten.

Ich werde dann später alles testen und mich nochmal melden.


EDIT:
die Procedure SetFocus sollte doch bereits den gesammten Text in einem Edit/LableEdit auswählen, oder? (AutoSelect steht auf true)

hubblec4
Beiträge: 341
Registriert: Sa 25. Jan 2014, 17:50

Re: TEdit - Hotkeys Arrowkeys

Beitrag von hubblec4 »

Habe es soweit testen können und es funktioniert auch.
Ich nutze LinuxMint 18.1 in einer VM.

Recht vielen Dank Michl

Michl
Beiträge: 2505
Registriert: Di 19. Jun 2012, 12:54

Re: TEdit - Hotkeys Arrowkeys

Beitrag von Michl »

hubblec4 hat geschrieben:die Procedure SetFocus sollte doch bereits den gesammten Text in einem Edit/LableEdit auswählen, oder? (AutoSelect steht auf true)
Naja, es ist schon ein sehr spezieller Code, den du da geschrieben hast. Würde ich selber nicht so machen. Weiß aber auch nicht, wofür das Ganze gut sein soll, du hast dir da sicherlich was bei gedacht.

Was passiert:
- du bist im fokusierten TLabelEdit
- der Pfeil-Tastendruck wird im Eventhandler vom TLabelEdit ausgewertet und im VirtualStringTree ein neues Item ausgewählt (das TLabelEdit ist weiter fokusiert, OnKeyDown ist noch nicht abgearbeitet)
- es wird OnFocusChanged vom VirtualStringTree ausgelöst, wobei der Text vom TLabelEdit geändert wird (das TLabelEdit ist weiter fokusiert, OnKeyDown ist noch nicht abgearbeitet)
- nachdem der Text vom TLabelEdit geändert wurde, wird jetzt glücklich das Event OnKeyDown vom fokusierten TLabelEdit abgearbeitet

Wenn man ein Control sich nicht ordentlich abarbeiten lässt, ist es nicht verwunderlich, wenn nicht alles rund läuft (da hilft auch kein AutoSelect = True, würde übrigens gehen, wenn du zwischenzeitlich noch ein anderes Control fokusieren würdest). Daher auch meine obige Info mit der Application.QueueAsynccall. Nativ arbeitende Controls feuern mitunter gänzlich verschiedene Messages und funktionieren somit plattformübergreifend nicht hundert prozentig identisch. Dies ist kein Bug sondern ein Feature.

PS: Die Application.Processmessage ist evtl. an der falschen Stelle. Möglichweise ist diese im OnKeyDown vom LabelEdit oder bei einem anderen Zwischenschritt besser aufgehoben. Evtl. würde dann auch das AutoSelect = True ordentlich funktionieren. Ich hatte das gestern nur kurz getestet und wollte dir nur mitteilen, warum es klemmt.

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection; 

hubblec4
Beiträge: 341
Registriert: Sa 25. Jan 2014, 17:50

Re: TEdit - Hotkeys Arrowkeys

Beitrag von hubblec4 »

Michl hat geschrieben:Naja, es ist schon ein sehr spezieller Code, den du da geschrieben hast. Würde ich selber nicht so machen. Weiß aber auch nicht, wofür das Ganze gut sein soll, du hast dir da sicherlich was bei gedacht.

Ja, etwas dabei habe ich mir gedacht, aber ob das immer so das Richtige ich weis ich leider nie, hatte ja keine Ausbildung oder sowas.
Daher freue ich mich schon immer riesig wenn es funktioniert was ich mir so ausgedacht habe.

Michl hat geschrieben:Was passiert:
- du bist im fokusierten TLabelEdit
- der Pfeil-Tastendruck wird im Eventhandler vom TLabelEdit ausgewertet und im VirtualStringTree ein neues Item ausgewählt (das TLabelEdit ist weiter fokusiert, OnKeyDown ist noch nicht abgearbeitet)

Jupp bis hierher richtig

Michl hat geschrieben:- es wird OnFocusChanged vom VirtualStringTree ausgelöst, wobei der Text vom TLabelEdit geändert wird (das TLabelEdit ist weiter fokusiert, OnKeyDown ist noch nicht abgearbeitet)

Nich ganz richtig. Durch das onFocusChanged im VST wird eigentlich NICHT das TLabelEdit(LaE) unsichtbar sondern das TabSheet(TaS) auf dem das LaE liegt.
Es gibt mehrere TaS in einem TPageControl(PgC) und es gehören zu den Nodes im VST unterschiedliche TaS. Daher verliert das LaE auch immer seinen Focus.
Wird ein anderes TaS aufgerufen und dort ein neues LaE fokusiert, klappt ja auch alles. Der ganze Text ist dann markiert.

Michl hat geschrieben:- nachdem der Text vom TLabelEdit geändert wurde, wird jetzt glücklich das Event OnKeyDown vom fokusierten TLabelEdit abgearbeitet

Fokusiert ist das LaE nicht mehr, aber dank deiner Hilfe (Application.ProcessMessage) wird dann das LaE neu fokusiert und alles markiert.

Michl hat geschrieben:PS: Die Application.Processmessage ist evtl. an der falschen Stelle. Möglichweise ist diese im OnKeyDown vom LabelEdit oder bei einem anderen Zwischenschritt besser aufgehoben. Evtl. würde dann auch das AutoSelect = True ordentlich funktionieren. Ich hatte das gestern nur kurz getestet und wollte dir nur mitteilen, warum es klemmt.

Jupp, nachdem der Hotkey ausgewertet ist und dessen Prozeduren abgearbeitet sind, kommt als letztes Application.Processmessage und ich kann das LaE neu fokusieren. Klappt bestens.

Übrigens hat mir das auch bei dem ComboBoxEx problem geholfen, damit ich dort die AuswahlListe gleich wieder öffnen kann nach dem sie geschlossen wurde.
Werde ich mir wohl merken müssen, das bei Linux öfter mal ein Application.Processmessage verwendet werden sollte.

Antworten