TreeView Doppelclick

Rund um die LCL und andere Komponenten
Antworten
lzuser
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

Beitrag von lzuser »

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.

Sieben
Beiträge: 95
Registriert: Mo 24. Aug 2020, 14:16
OS, Lazarus, FPC: Ubuntu Xenial 32, Lazarus 2.0.10, FPC 3.2.0
CPU-Target: i386

Re: TreeView Doppelclick

Beitrag von Sieben »

Property ReadOnly auf True setzen bzw tvoReadOnly in den Options setzen - ein (etwas unglücklich) gedoppelmoppeltes Property.

lzuser
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

Beitrag von lzuser »

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.

Sieben
Beiträge: 95
Registriert: Mo 24. Aug 2020, 14:16
OS, Lazarus, FPC: Ubuntu Xenial 32, Lazarus 2.0.10, FPC 3.2.0
CPU-Target: i386

Re: TreeView Doppelclick

Beitrag von Sieben »

Du müsstest das Editieren dann zB über ein PopUp und die Methode

Code: Alles auswählen

TreeView1.Selected.EditText; 
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:

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;
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.

Sieben
Beiträge: 95
Registriert: Mo 24. Aug 2020, 14:16
OS, Lazarus, FPC: Ubuntu Xenial 32, Lazarus 2.0.10, FPC 3.2.0
CPU-Target: i386

Re: TreeView Doppelclick

Beitrag von Sieben »

Was sich auch noch einigermaßen 'richtig' anfühlt, ist ein Ctrl-Click in OnMouseUp, auch mit ReadOnly:

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;
So richtig 'explorer-like' ist es aber natürlich auch nicht.

lzuser
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

Beitrag von lzuser »

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.

Sieben
Beiträge: 95
Registriert: Mo 24. Aug 2020, 14:16
OS, Lazarus, FPC: Ubuntu Xenial 32, Lazarus 2.0.10, FPC 3.2.0
CPU-Target: i386

Re: TreeView Doppelclick

Beitrag von Sieben »

Noch'n Vorschlag, nachdem ich mir den Explorer noch mal angesehen habe, der offenbar auch mit einem Timer arbeitet:

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;
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:

Code: Alles auswählen

  TreeTimer.Interval := GetDoubleClickTime + 100;
Unter Linux/GTK2 'funktioniert' die Abfrage zwar auch, liefert aber immer nur die Windows Default-Einstellung. Für andere OS weiss ich's nicht.
Dateianhänge
TreeEditDemo.zip
(125.77 KiB) 14-mal heruntergeladen

lzuser
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

Beitrag von lzuser »

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.

Sieben
Beiträge: 95
Registriert: Mo 24. Aug 2020, 14:16
OS, Lazarus, FPC: Ubuntu Xenial 32, Lazarus 2.0.10, FPC 3.2.0
CPU-Target: i386

Re: TreeView Doppelclick

Beitrag von Sieben »

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.
Dateianhänge
rkTreeView.zip
(5.47 KiB) 12-mal heruntergeladen

Antworten