TreeView Select Problem

Rund um die LCL und andere Komponenten
pluto
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)

TreeView Select Problem

Beitrag von pluto »

Hallo

Für ein Projekt habe ich eine einfache Funktion geschrieben, um den getippten Buchstaben in einer TreeView zu suchen.
Das Klappt auch Wunderbar. Problem ist nur: Der Vorherige Markierte Eintrag verschwindet nicht. Obwohl er gar nicht markiert ist:

Code: Alles auswählen

procedure TForm1.TreeView1KeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
var
  TV:TTreeView;
  TreeNode:TTreeNode;
begin
  TV:=(Sender as TTreeView);
  if not Assigned(TV.Selected) then
    TreeNode:=TV.Items.GetFirstNode
  else
    TreeNode:=TV.Selected;
 
  repeat
    if UpperCase(TreeNode.Text[1]) = char(Key) then begin
      TV.Selected:=TreeNode;
      break;
    end
    else begin
      TreeNode:=TreeNode.GetNextSibling;
    end;
  until not Assigned(TreeNode);
 
  repeat
    if TreeNode.Selected then
      writeln(TreeNode.text);
    TreeNode:=TreeNode.GetNextSibling;
  until not Assigned(TreeNode);
  TV.Invalidate;
end;
MFG
Michael Springwald

pluto
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: TreeView Select Problem

Beitrag von pluto »

Eine Frage zu stellen hilft immer sehr. Das Problem konnte ich lösen:
SelectOnlyThis
MFG
Michael Springwald

wp_xyz
Beiträge: 5153
Registriert: Fr 8. Apr 2011, 09:01

Re: TreeView Select Problem

Beitrag von wp_xyz »

Könnte es sein, dass du hier dem Unterschied zwischen "Selected" und "Focused" aufgesessen bist? Mehrere Nodes können "selected" sein, aber nur einer "focused". Daher meine ich, dass der gefundene Node als "focused" markiert werden sollte. Evtl. muss der gefundene Node auch zusätzlich noch "selected" sein (möglicherweise bringe ich da aber auch etwas mit dem VirtualTreeView durcheinander):

Code: Alles auswählen

 
  repeat
    if UpperCase(TreeNode.Text[1]) = char(Key) then begin
      TreeNode.Focused := true; //statt, oder zusätzlich zu: TV.Selected:=TreeNode;
      break;
    end
    else begin
      TreeNode:=TreeNode.GetNextSibling;
    end;
  until not Assigned(TreeNode);
 

pluto
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: TreeView Select Problem

Beitrag von pluto »

An sowas habe ich auch schon gedacht. Werde ich mal ausprobieren.

Es ist aber irritierend, wenn sich das Select so verhält.
MFG
Michael Springwald

pluto
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: TreeView Select Problem

Beitrag von pluto »

Das klappt leider nicht:

Code: Alles auswählen

procedure TForm1.TreeView1KeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
var
  TV:TTreeView;
  TreeNode:TTreeNode;
begin
  TV:=(Sender as TTreeView);
  if not Assigned(TV.Selected) then
    TreeNode:=TV.Items.GetFirstNode
  else
    TreeNode:=TV.Selected;
 
  repeat
    if UpperCase(TreeNode.Text[1]) = char(Key) then begin
      if tv.Selected <> TreeNode then begin
        TreeNode.Focused:=True;
        TreeNode.Selected:=True;
//        tv.Items.SelectOnlyThis(TreeNode);
        break;
      end
      else
        TreeNode:=TreeNode.GetNextSibling;
    end
    else
      TreeNode:=TreeNode.GetNextSibling;
  until not Assigned(TreeNode);
 
 
  repeat
    if Assigned(TreeNode) then begin
      if TreeNode.Selected then
        writeln(TreeNode.text);
      TreeNode:=TreeNode.GetNextSibling;
    end;
  until not Assigned(TreeNode);
 
end;
MFG
Michael Springwald

wp_xyz
Beiträge: 5153
Registriert: Fr 8. Apr 2011, 09:01

Re: TreeView Select Problem

Beitrag von wp_xyz »

Also bei mir geht's, auch ohne das Focused (Win7).

TBug
Beiträge: 179
Registriert: Mi 2. Sep 2015, 11:09
OS, Lazarus, FPC: Lazaurus 2.2.4 FPC 3.2.2
CPU-Target: Windows 32/64bit

Re: TreeView Select Problem

Beitrag von TBug »

pluto hat geschrieben:An sowas habe ich auch schon gedacht. Werde ich mal ausprobieren.

Es ist aber irritierend, wenn sich das Select so verhält.
Property MultiSelect = true ???


.

pluto
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: TreeView Select Problem

Beitrag von pluto »

Property MultiSelect = true ???
Nein, ist auf False. Komischerweise ist die Prüfung bei allen Items auf Select ja auch False bis auf den, der True ist.
MFG
Michael Springwald

wp_xyz
Beiträge: 5153
Registriert: Fr 8. Apr 2011, 09:01

Re: TreeView Select Problem

Beitrag von wp_xyz »

Was ist dein Betriebssystem? Arduino?

pluto
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: TreeView Select Problem

Beitrag von pluto »

Was ist dein Betriebssystem? Arduino?
Linux Mint 17. Arduino ist kein Betriebssystem. Dort würde auch die LCL gar nicht laufen.
MFG
Michael Springwald

TBug
Beiträge: 179
Registriert: Mi 2. Sep 2015, 11:09
OS, Lazarus, FPC: Lazaurus 2.2.4 FPC 3.2.2
CPU-Target: Windows 32/64bit

Re: TreeView Select Problem

Beitrag von TBug »

pluto hat geschrieben:
Property MultiSelect = true ???
Nein, ist auf False. Komischerweise ist die Prüfung bei allen Items auf Select ja auch False bis auf den, der True ist.
Probiere statt

Code: Alles auswählen

TreeNode.Selected:=True;
einmal

Code: Alles auswählen

 
TV.Select(TreeNode);
 

.

wp_xyz
Beiträge: 5153
Registriert: Fr 8. Apr 2011, 09:01

Re: TreeView Select Problem

Beitrag von wp_xyz »

Mit Mint 17.1 auch ok, genauso wie weiter oben mit Win7. Vielleicht postest du mal ein Miniprojekt, in dem man das nachvollziehen kann.

pluto
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: TreeView Select Problem

Beitrag von pluto »

ja "TV.Select(TreeNode);" geht auch.

Das mit den Miniprojekt werde ich machen. Ich lese im Prinzip nur ein Verzeichnis ein und der User Wählt ein Verzeichnis aus und verschiebt dieses per Draq&Dropt in einer andere TreeView.

Das Projekt habe ich geschrieben, für ein Arduino Projekt. Es konvertiert die Ausgewählten Verzeichnis/Datei Namen in ein bestimmtes Dateiformat: 8.3 Also sie die Struktur so aus: ALBUM001/TRACK001.OGG z.b. Außerdem wird noch per FFMPEG die Zeit ermittelt.

Wie gesagt, ich habe jetzt zwei Lösungen, aber mich wundert dieses Verhalten halt.
MFG
Michael Springwald

wp_xyz
Beiträge: 5153
Registriert: Fr 8. Apr 2011, 09:01

Re: TreeView Select Problem

Beitrag von wp_xyz »

wp_xyz hat geschrieben:Vielleicht postest du mal ein Miniprojekt, in dem man das nachvollziehen kann.
Oder umgekehrt: Ich füge mein Test-Projekt an, das bei mir einwandfrei läuft. Verhält sich dieses bei dir auch fehlerhaft?
Dateianhänge
tree-select.zip
(2.08 KiB) 58-mal heruntergeladen

pluto
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: TreeView Select Problem

Beitrag von pluto »

Interessant, dass geht auch bei mir. Ich werde nachher mal die gesetzten Eigenschaften Vergleichen....
MFG
Michael Springwald

Antworten