Welche uses braucht GetSubDirectories?

Rund um die LCL und andere Komponenten
Benutzeravatar
theo
Beiträge: 11204
Registriert: Mo 11. Sep 2006, 19:01

Re: Welche uses braucht GetSubDirectories?

Beitrag von theo »

Lion hat geschrieben: Sag mal und wie lade ich die TreeView während der Laufzeit immer wieder neu?
Wie meinst denn du das?
Ein neues Basisverzeichnis setzt du mit dem Root Property.

Lion
Beiträge: 199
Registriert: Mo 24. Mär 2014, 09:58

Re: Welche uses braucht GetSubDirectories?

Beitrag von Lion »

theo hat geschrieben:
Lion hat geschrieben: Sag mal und wie lade ich die TreeView während der Laufzeit immer wieder neu?
Wie meinst denn du das?
Ein neues Basisverzeichnis setzt du mit dem Root Property.
Habe schon gefunden:

Code: Alles auswählen

 
ShellTreeView1.BeginUpdate;
  ShellTreeView1.Root := '';
  ShellTreeView1.Root := gvDirectory;
  ShellTreeView1.EndUpdate; 
 
Deine Lösung funktioniert soweit, vielen vielen Dank! Muss noch die von ruewa testen.

ruewa
Beiträge: 153
Registriert: Sa 12. Apr 2014, 14:43

Re: Welche uses braucht GetSubDirectories?

Beitrag von ruewa »

Lion hat geschrieben:Deine Lösung funktioniert soweit, vielen vielen Dank! Muss noch die von ruewa testen.
Läuft inzwischen auf (fast) dasselbe hinaus. Zusammengenommen:

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;
Einhängen in ShellTreeView1.OnCoustomDrawItem und fertig.

Ist aber halt immer noch nur ein Workaround. Sollte man das in TShellTreeView einbauen (eigentlich braucht's das pro Node nur einmal, wenn man es in dessen Erstellung einbaut) und daraus ein Feature Request / Patch machen?

Hat jemand Lust, sich dran zu versuchen? Machst Du, Theo, soll ich?

Gruß Rüdiger

Lion
Beiträge: 199
Registriert: Mo 24. Mär 2014, 09:58

Re: Welche uses braucht GetSubDirectories?

Beitrag von Lion »

Ok... aber was bewirkt noch mal diese Zeile?

Code: Alles auswählen

if Node.Expanded or (not Node.HasChildren) then exit;

ruewa
Beiträge: 153
Registriert: Sa 12. Apr 2014, 14:43

Re: Welche uses braucht GetSubDirectories?

Beitrag von ruewa »

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.

Der Knackpunkt ist: TTreeNode.HasChildren kann zweierlei bedeuten: Entweder wurde er schon geprüft und enthält ChildNodes, oder er wurde noch gar nicht geprüft und HasChildren ist, ob richtig oder falsch, bloß auf true initialisiert. Sobald HasChildren korrekt gesetzt wird, funktioniert auch die Anzeige im TreeView korrekt.

Gruß Rüdiger
Zuletzt geändert von ruewa am Mi 4. Feb 2015, 15:38, insgesamt 3-mal geändert.

Lion
Beiträge: 199
Registriert: Mo 24. Mär 2014, 09:58

Re: Welche uses braucht GetSubDirectories?

Beitrag von Lion »

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
Ok, verstehe. Ich bedanke mich noch ein mal ganz herzlich, ohne euch wäre ich schon in der Psychiatrie. :mrgreen:

P.S. Aber wie die [+]-Zeichen ausgeblendet werden verstehe ich immer noch nicht.

Benutzeravatar
theo
Beiträge: 11204
Registriert: Mo 11. Sep 2006, 19:01

Re: Welche uses braucht GetSubDirectories?

Beitrag von theo »

Lion hat geschrieben: P.S. Aber wie die [+]-Zeichen ausgeblendet werden verstehe ich immer noch nicht.
Durch die Eigenschaft Node.HasChildren.

ruewa
Beiträge: 153
Registriert: Sa 12. Apr 2014, 14:43

Re: Welche uses braucht GetSubDirectories?

Beitrag von ruewa »

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.

Gruß Rüdiger

Lion
Beiträge: 199
Registriert: Mo 24. Mär 2014, 09:58

Re: Welche uses braucht GetSubDirectories?

Beitrag von Lion »

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.
Dateianhänge
Screenshot.JPG
Screenshot.JPG (15.03 KiB) 3062 mal betrachtet

ruewa
Beiträge: 153
Registriert: Sa 12. Apr 2014, 14:43

Re: Welche uses braucht GetSubDirectories?

Beitrag von ruewa »

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.
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... :?

Aber da wäre noch was:
Lion hat geschrieben:

Code: Alles auswählen

 
ShellTreeView1.BeginUpdate;
  ShellTreeView1.Root := '';
  ShellTreeView1.Root := gvDirectory;
  ShellTreeView1.EndUpdate; 
 
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:

Code: Alles auswählen

  ShellTreeView1.Root := NeuesVerzeichnis;
reicht vollauf.

Gruß Rüdiger

Edit: Sorry, hab's mißverstanden, Du meintest das Folder-Icon, nicht das [+]-Icon bzw. Zeichen. Stimmt, ich hatte mir nicht die Mühe gemacht, da noch (m.E. nutzlose) Images reinzubasteln und mich einzig auf die "[+]"-Dinger konzentriert. Ja okay..., dann ist das halt so...

Lion
Beiträge: 199
Registriert: Mo 24. Mär 2014, 09:58

Re: Welche uses braucht GetSubDirectories?

Beitrag von Lion »

Vor dem C:\ fehlt das gelbe Folder-Icon, meine ich.

Benutzeravatar
theo
Beiträge: 11204
Registriert: Mo 11. Sep 2006, 19:01

Re: Welche uses braucht GetSubDirectories?

Beitrag von theo »

Lion hat geschrieben:Vor dem C:\ fehlt das gelbe Folder-Icon, meine ich.
Kann ich nicht reproduzieren, bei mir kommt das Icon (unter Wine).
Lazarus 1.5 r47580M FPC 3.1.1 x86_64-linux-gtk 2

Aber die Komponente ist sicher nicht das Gelbe von Ei.
An deiner Stelle wäre ich nicht so pingelig, da tauchen bestimmt noch andere Merkwürdigkeiten auf.
Sei froh, dass es überhaupt funktioniert. :wink:

Komoluna
Beiträge: 565
Registriert: So 26. Aug 2012, 09:03
OS, Lazarus, FPC: Windows(10), Linux(Arch)
CPU-Target: 64Bit

Re: Welche uses braucht GetSubDirectories?

Beitrag von Komoluna »

Genaugenommen müsste da doch ein Festplattenicon sein oder?
Wenn man per winexplorer auf Computer geht sieht man ja auch keine Ordner sondern Platten und USB-Geräte

MFG

Komoluna
Programmer: A device to convert coffee into software.

Rekursion: siehe Rekursion.

Lion
Beiträge: 199
Registriert: Mo 24. Mär 2014, 09:58

Re: Welche uses braucht GetSubDirectories?

Beitrag von Lion »

Stimmt, werde mir da manuel was hübsches setzen.

Edit: ich habe rausgefunden, dass es an dieser Zeile liegt ->

Code: Alles auswählen

if Node.Expanded or (not Node.HasChildren) then Exit;
auskommentiert wird auch dem Root ein Folder-Icon verpasst.

item[0] ist anscheinend beim zeichnen not expanded, aber erst später.

Lion
Beiträge: 199
Registriert: Mo 24. Mär 2014, 09:58

Re: Welche uses braucht GetSubDirectories?

Beitrag von Lion »

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

Antworten