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