Wie meinst denn du das?Lion hat geschrieben: Sag mal und wie lade ich die TreeView während der Laufzeit immer wieder neu?
Ein neues Basisverzeichnis setzt du mit dem Root Property.
Wie meinst denn du das?Lion hat geschrieben: Sag mal und wie lade ich die TreeView während der Laufzeit immer wieder neu?
Habe schon gefunden:theo hat geschrieben:Wie meinst denn du das?Lion hat geschrieben: Sag mal und wie lade ich die TreeView während der Laufzeit immer wieder neu?
Ein neues Basisverzeichnis setzt du mit dem Root Property.
Code: Alles auswählen
ShellTreeView1.BeginUpdate;
ShellTreeView1.Root := '';
ShellTreeView1.Root := gvDirectory;
ShellTreeView1.EndUpdate;
Läuft inzwischen auf (fast) dasselbe hinaus. Zusammengenommen:Lion hat geschrieben:Deine Lösung funktioniert soweit, vielen vielen Dank! Muss noch die von ruewa testen.
Code: Alles auswählen
procedure TForm1.ShellTreeView1CustomDrawItem(Sender : TCustomTreeView;
Node : TTreeNode; State : TCustomDrawState; var DefaultDraw : Boolean);
var
SL : TStringList;
begin
if Node.Expanded or (not Node.HasChildren) then exit;
SL := FindAllDirectories(TShellTreeView(Sender).GetPathFromNode(Node), false);
Node.HasChildren := SL.Count > 0;
SL.Free;
end;Code: Alles auswählen
if Node.Expanded or (not Node.HasChildren) then exit;Ok, verstehe. Ich bedanke mich noch ein mal ganz herzlich, ohne euch wäre ich schon in der Psychiatrie.ruewa hat geschrieben:Zeitersparnis. Wenn der Node ausgeklappt ist, hat er ja Subdirectories und das Icon ist richtig. Umgekehrt, wenn HasChildren = false, dann wurde der Node schon auf Subdirectories geprüft und das Icon ist verschwunden. In beiden Fällen kann man sich die Prüfung sparen.
Gruß Rüdiger
Durch die Eigenschaft Node.HasChildren.Lion hat geschrieben: P.S. Aber wie die [+]-Zeichen ausgeblendet werden verstehe ich immer noch nicht.
Keine Ahnung. Da müßte man jetzt tief in den Innereien graben. Irgendwo wird wohl im Draw-Mechanismus ein "If HasChildren then MaleIcon..." stecken. Aber das ist für das Verständnis des Problems nicht wirklich wichtig, denn die Icon-Anzeige ist ganz offenkundig an die Property HasChildren gekoppelt - was ja auch Sinn macht, und ansonsten würde ja auch unser Workaround überhaupt nicht funktionieren. Ändere die Property, und Du hast (beim nächsten Zeichnen) die Anzeige verändert, das reicht.Lion hat geschrieben:P.S. Aber wie die [+]-Zeichen ausgeblendet werden verstehe ich immer noch nicht.
Dein Screenshot hat doch ein Icon auf der Ebene "C:\" ? Willst Du das weghaben? Dann setz ShellTreeView1.ShowRoot auf false, wenn Dir das besser gefällt. Ansonsten würde ich sagen, jetzt laß es mal gut sein...Lion hat geschrieben:OK... da wäre aber noch eine kleine Sache, das erste Item, item[0] bekommt kein Icon, auch mit Node.HasChildren := gvSL.Count >= 0; nicht, siehe Screenshot.
Das meiste davon kannst Du Dir sparen. Begin- und EndUpdate setzt die View schon selber, wenn ein neues Verzeichnis eingelesen wird. Und erstmal auf leer (was immer das sein mag) setzen mußt Du sie auch nicht. Einfach nur:Lion hat geschrieben:Code: Alles auswählen
ShellTreeView1.BeginUpdate; ShellTreeView1.Root := ''; ShellTreeView1.Root := gvDirectory; ShellTreeView1.EndUpdate;
Code: Alles auswählen
ShellTreeView1.Root := NeuesVerzeichnis;Kann ich nicht reproduzieren, bei mir kommt das Icon (unter Wine).Lion hat geschrieben:Vor dem C:\ fehlt das gelbe Folder-Icon, meine ich.
Code: Alles auswählen
if Node.Expanded or (not Node.HasChildren) then Exit;Diese Lösung habe ich aus dem offiziellen Lazarus Forum. Und bevor ich ShellTreeView1.Root := ''; nicht setze wird bei mir die View nicht aktualisiert. Das mit den Begin- und EndUpdate kann ich natürlich lassen.Lion hat geschrieben:Lion hat geschrieben:Code: Alles auswählen
ShellTreeView1.BeginUpdate; ShellTreeView1.Root := ''; ShellTreeView1.Root := gvDirectory; ShellTreeView1.EndUpdate;ruewa hat geschrieben:Das meiste davon kannst Du Dir sparen. Begin- und EndUpdate setzt die View schon selber, wenn ein neues Verzeichnis eingelesen wird. Und erstmal auf leer (was immer das sein mag) setzen mußt Du sie auch nicht.