TreeView Doppelclick
-
- Beiträge: 97
- Registriert: Sa 20. Jun 2009, 16:00
- OS, Lazarus, FPC: Win10 20H2, Laz 2.0.8 auch Linux Mint Mate 20, Laz 2.0.6
- CPU-Target: 64Bit
TreeView Doppelclick
Win10 20H2, Laz 2.0.8 auch Linux Mint 20, Laz 2.0.6
Ich speichere im TreeView Favoriten. Doppelclick soll die Datei laden. Funktioniert wunschgemäß.
Wenn ein Item aber selected ist, geht das Item durch den Doppelclick in den Editiermodus. Da wird wohl nur der erste Click ausgewertet?
Wie kommt man aus dem Dilemma?
Den möglichen Editiermodus durch Einfachclick auf ein selected Item möchte ich beibehalten.
Kann man z.B. den Editiermodus evtl. verbieten und bei Bedarf wieder zulassen?
oder...?
Danke für eure Hilfen.
Ich speichere im TreeView Favoriten. Doppelclick soll die Datei laden. Funktioniert wunschgemäß.
Wenn ein Item aber selected ist, geht das Item durch den Doppelclick in den Editiermodus. Da wird wohl nur der erste Click ausgewertet?
Wie kommt man aus dem Dilemma?
Den möglichen Editiermodus durch Einfachclick auf ein selected Item möchte ich beibehalten.
Kann man z.B. den Editiermodus evtl. verbieten und bei Bedarf wieder zulassen?
oder...?
Danke für eure Hilfen.
-
- Beiträge: 202
- Registriert: Mo 24. Aug 2020, 14:16
- OS, Lazarus, FPC: Ubuntu Xenial 32, Lazarus 2.2.0, FPC 3.2.2
- CPU-Target: i386
Re: TreeView Doppelclick
Property ReadOnly auf True setzen bzw tvoReadOnly in den Options setzen - ein (etwas unglücklich) gedoppelmoppeltes Property.
-
- Beiträge: 97
- Registriert: Sa 20. Jun 2009, 16:00
- OS, Lazarus, FPC: Win10 20H2, Laz 2.0.8 auch Linux Mint Mate 20, Laz 2.0.6
- CPU-Target: 64Bit
Re: TreeView Doppelclick
Danke für den Hinweis.
Ich hatte es schon probiert, aber mit ReadOnly beim TreeView kann man ein Item nicht mehr editieren.
Ich dachte, es sollte so funktionieren, wie im Win-Explorer:
Einzelclick: Item wird markiert
Noch ein Einzelclick: Item wird editiert
oder
Doppelclick: Datei wird geladen
Im TreeView funktioniert das DateiLaden dagegen nur, wenn ich einen Doppelclick auf ein nicht markiertes Item ausführe. Das ist das (kleine) Problem.
Ich hatte es schon probiert, aber mit ReadOnly beim TreeView kann man ein Item nicht mehr editieren.
Ich dachte, es sollte so funktionieren, wie im Win-Explorer:
Einzelclick: Item wird markiert
Noch ein Einzelclick: Item wird editiert
oder
Doppelclick: Datei wird geladen
Im TreeView funktioniert das DateiLaden dagegen nur, wenn ich einen Doppelclick auf ein nicht markiertes Item ausführe. Das ist das (kleine) Problem.
-
- Beiträge: 202
- Registriert: Mo 24. Aug 2020, 14:16
- OS, Lazarus, FPC: Ubuntu Xenial 32, Lazarus 2.2.0, FPC 3.2.2
- CPU-Target: i386
Re: TreeView Doppelclick
Du müsstest das Editieren dann zB über ein PopUp und die Methode
anstossen. Oder umgekehrt das Editieren auf automatisch belassen und das Laden über PopUp - kommt drauf an, welche Aktion häufiger und für den User einfacher sein sollte. Ansonsten habe ich 'von aussen' keine Möglichkeit gefunden, die ohne Nebenwirkungen wäre. Bug melden wäre evt auch eine Option.
Edit: am nähesten bin ich dem gewünschten Verhalten noch damit gekommen:
Wobei ReadOnly True und FSelectedNode eine private Variable des Forms ist. Das hat aber zumindest hier (Linux32/GTK2) die Nebenwirkung, dass der selektierte Node uU nicht richtig gezeichnet wird, dh so, als ob der Tree keinen Focus hätte.
Code: Alles auswählen
TreeView1.Selected.EditText;
Edit: am nähesten bin ich dem gewünschten Verhalten noch damit gekommen:
Code: Alles auswählen
procedure TCheckTest.TreeView1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
if (Button = mbLeft)
and not (ssDouble in Shift) then
begin
if Assigned(TreeView1.Selected)
and (FSelectedNode = TreeView1.Selected) then
TreeView1.Selected.EditText;
FSelectedNode := TreeView1.Selected;
end;
end;
-
- Beiträge: 202
- Registriert: Mo 24. Aug 2020, 14:16
- OS, Lazarus, FPC: Ubuntu Xenial 32, Lazarus 2.2.0, FPC 3.2.2
- CPU-Target: i386
Re: TreeView Doppelclick
Was sich auch noch einigermaßen 'richtig' anfühlt, ist ein Ctrl-Click in OnMouseUp, auch mit ReadOnly:
So richtig 'explorer-like' ist es aber natürlich auch nicht.
Code: Alles auswählen
procedure TCheckTest.TreeView1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
if (Button = mbLeft)
and (ssCtrl in Shift)
and Assigned(TreeView1.Selected) then
TreeView1.Selected.EditText;
end;
-
- Beiträge: 97
- Registriert: Sa 20. Jun 2009, 16:00
- OS, Lazarus, FPC: Win10 20H2, Laz 2.0.8 auch Linux Mint Mate 20, Laz 2.0.6
- CPU-Target: 64Bit
Re: TreeView Doppelclick
Vielen Dank für dein Engagement.
Zum Bug(?)-Melden fühle ich mich nicht berufen genug.
Deine Ansätzen liefern einige Gelegenheiten zum Testen.
Ein zusätzliches Popup geht natürlich auch, ich schau mal.
Zum Bug(?)-Melden fühle ich mich nicht berufen genug.
Deine Ansätzen liefern einige Gelegenheiten zum Testen.
Ein zusätzliches Popup geht natürlich auch, ich schau mal.
-
- Beiträge: 202
- Registriert: Mo 24. Aug 2020, 14:16
- OS, Lazarus, FPC: Ubuntu Xenial 32, Lazarus 2.2.0, FPC 3.2.2
- CPU-Target: i386
Re: TreeView Doppelclick
Noch'n Vorschlag, nachdem ich mir den Explorer noch mal angesehen habe, der offenbar auch mit einem Timer arbeitet:
ReadOnly := True und FSelectedNode wie weiter oben schon beschrieben, dazu ein TTimer, dessen Intervall etwas größer sein sollte als das eingestellte Doppelklick-Intervall (die voreingestellten 1000 dürften normalerweise dicke ausreichen).
Edit: kleines Demoprojekt angehängt. Das TEdit zum Testen von Fokuswechseln.
Nochmal Edit: Unter Windows kann man das auch abfragen mit GetDoubleClickTime, bietet sich also für zB FormCreate an:
Unter Linux/GTK2 'funktioniert' die Abfrage zwar auch, liefert aber immer nur die Windows Default-Einstellung. Für andere OS weiss ich's nicht.
Code: Alles auswählen
procedure TCheckTest.TreeViewClick(Sender: TObject);
begin
if Assigned(TreeView.Selected)
and (FSelectedNode = TreeView.Selected) then
TreeTimer.Enabled := True
else
TreeTimer.Enabled := False;
FSelectedNode := TreeView.Selected;
end;
procedure TCheckTest.TreeTimerTimer(Sender: TObject);
begin
if Assigned(TreeView.Selected) then
TreeView.Selected.EditText;
TreeTimer.Enabled := False;
end;
procedure TCheckTest.TreeViewDblClick(Sender: TObject);
begin
TreeTimer.Enabled := False;
// Datei laden
end;
procedure TCheckTest.TreeViewExit(Sender: TObject);
begin
FSelectedNode := nil;
end;
Edit: kleines Demoprojekt angehängt. Das TEdit zum Testen von Fokuswechseln.
Nochmal Edit: Unter Windows kann man das auch abfragen mit GetDoubleClickTime, bietet sich also für zB FormCreate an:
Code: Alles auswählen
TreeTimer.Interval := GetDoubleClickTime + 100;
- Dateianhänge
-
- TreeEditDemo.zip
- (125.77 KiB) 76-mal heruntergeladen
-
- Beiträge: 97
- Registriert: Sa 20. Jun 2009, 16:00
- OS, Lazarus, FPC: Win10 20H2, Laz 2.0.8 auch Linux Mint Mate 20, Laz 2.0.6
- CPU-Target: 64Bit
Re: TreeView Doppelclick
Mehr Unterstützung kann man gar nicht erwarten. Du hast dich ja richtig rein gekniet.
Das letzte Beispiel funktioniert so wie erwartet.
Jetzt geht es ans Integrieren. Vielen Dank nochmal.
Das letzte Beispiel funktioniert so wie erwartet.
Jetzt geht es ans Integrieren. Vielen Dank nochmal.
-
- Beiträge: 202
- Registriert: Mo 24. Aug 2020, 14:16
- OS, Lazarus, FPC: Ubuntu Xenial 32, Lazarus 2.2.0, FPC 3.2.2
- CPU-Target: i386
Re: TreeView Doppelclick
Das liegt daran, dass ich mich auch gerade bzw immer mal wieder mit dem Ding beschäftige. Deshalb habe ich das ganze auch noch in einen kleinen Ableger eingebaut, ich häng ihn mal hier an. ReadOnly wurde durch EditMode ersetzt, zusätzlich kann zur Laufzeit auch noch EditInterval gesetzt werden, default ist DoubleClickTime + 150. Außerdem noch F2 zum Editieren. Durch den Umweg über den Custom-Ableger kann man ihn auch als Basis für weitere Ableger benutzen, die vielleicht auch nicht alles publizieren sollen.
Zur Installation zuerst rktreeviewrun.lpk laden und kompilieren, dann rktreeviewdsgn.lpk laden, kompilieren und installieren. Durch die Zweiteilung wird verhindert, dass der ganze IDEIntf-Code in die Exe gezogen wird, noch mal besten Dank an wp für den Hinweis. Verzeichnisstruktur beibehalten und am besten ein eigenes Unterverzeichnis für das Package anlegen. Bei Bugs oder sonstigem Fehlverhalten in unberücksichtigten Situationen bitte gerne hier melden.
Zur Installation zuerst rktreeviewrun.lpk laden und kompilieren, dann rktreeviewdsgn.lpk laden, kompilieren und installieren. Durch die Zweiteilung wird verhindert, dass der ganze IDEIntf-Code in die Exe gezogen wird, noch mal besten Dank an wp für den Hinweis. Verzeichnisstruktur beibehalten und am besten ein eigenes Unterverzeichnis für das Package anlegen. Bei Bugs oder sonstigem Fehlverhalten in unberücksichtigten Situationen bitte gerne hier melden.
- Dateianhänge
-
- rkTreeView.zip
- (5.47 KiB) 83-mal heruntergeladen