Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi ShellTreeView "expandieren" (https://www.delphipraxis.net/13624-shelltreeview-expandieren.html)

F.W. 22. Dez 2003 20:17


ShellTreeView "expandieren"
 
Wie kann ich einen kompletten TShellTreeView aufklappen, ich mache es mit einer While do Schleife:
Delphi-Quellcode:
While I <= ShellTreeView.Items.Count-1 do begin
      ShellTreeView.Items[I].Expanded := True;
      Inc(I);
end;
Aber das dauert so lange! Hat das schonmal jemand versucht, als er als Root den Arbeitsplatz eingestellt hatte? :kotz:

Danke schonmal!

mirage228 22. Dez 2003 20:19

Re: ShellTreeView "expandieren"
 
Das dauert halt lange, da ich mal annehme dass du mehr als 100 folder bzw. subfolder auf der festplatte hast.

alternativ könntest du das ganze in einem thread ausführen und das treeview mit synchronize() auf dem laufenden halten.

mfG
mirage228

toms 22. Dez 2003 20:39

Re: ShellTreeView "expandieren"
 
Zitat:

Aber das dauert so lange! Hat das schonmal jemand versucht, als er als Root den Arbeitsplatz eingestellt hatte
Mal ehrlich gesagt: was macht das für einen Sinn, den gesamten Arbeitsplatz aufzuklappen?
Der Baum wird ja dann riesengross!!

Zitat:

Wie kann ich einen kompletten TShellTreeView aufklappen,
So geht's schneller:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  i: Integer;
begin
  i := 0;
  ShellTreeView1.Items.BeginUpdate;
  try
    while I <= ShellTreeView1.Items.Count - 1 do begin
      ShellTreeView1.Items[I].Expanded := True;
      Inc(I);
    end;
  finally
    ShellTreeView1.Items.EndUpdate;
  end;
end;

F.W. 22. Dez 2003 20:48

Re: ShellTreeView "expandieren"
 
Zitat:

Mal ehrlich gesagt: was macht das für einen Sinn, den gesamten Arbeitsplatz aufzuklappen?
Naja, eigentlich hast du Recht, aber mein Programm soll mir eine Verzeichnisliste daraus erstellen und ich kann nur alle "Äste" abklappern, wenn er komplett ausgeklappt ist!

mirage228 22. Dez 2003 21:14

Re: ShellTreeView "expandieren"
 
Für Verzeichnislisten kannst auch die Funktion nehmen:

Delphi-Quellcode:
  procedure FileList(sPath, sExt: string; bRecurse: boolean; List: TStrings);
  var
    f,
    f2: TSearchRec;
  begin
    if FindFirst(sPath + '*.*', faAnyFile, f) = 0 then
    begin
     if FindFirst(sPath + sExt, faAnyFile, f2) = 0 then
     begin
       List.Add(sPath + f2.Name);
       while FindNext(f2) = 0 do
         if (f2.Name <> '.') and (f2.Name <> '..') then List.Add(sPath + f2.Name);
     end;
     while FindNext(f) = 0 do
       if ((f.Attr and faDirectory) = faDirectory) and (f.Name <> '.')
         and (f.Name <> '..') and (bRecurse) then
           FileList(sPath + f.Name + '\', sExt, bRecurse, List);
    end; {if}
    FindClose(f);
  end;
mfG
mirage228

F.W. 22. Dez 2003 22:17

Re: ShellTreeView "expandieren"
 
Das geht irgendwie schneller! Aber ich habe mir schon meinen Kopf zerbrochen, wie ich das ganze wieder in einen normalen TreeView bringe, denn ich wills mir ja mit Komfort angucken!

Allerdings zerbrach ich mir meinen Kopf über meine Methode. Es ist nett, dass du dir die Arbeit gemacht hast, vielleicht greife ich irgendwann darauf zurück, allerdings nicht jetzt gleich, da das Ding für den Zweg, für den es geproggt worden ist total ausreicht. Es soll mir nämlich nur das Verzeichnis von Half Life bei nem Kumpel auslesen, damit ich ihm sagen kann, wo er welche Dateien noch hinpacken muss, damits bei ihm richtig gut läuft!

Danke!!!!!!!!!

Sharky 23. Dez 2003 07:53

Re: ShellTreeView "expandieren"
 
Hai F.W.,

schneller wird es wohl nicht werden. Es müssen ja alle Verzeichnisse durchwühlt werden.

Du kannst nur deinen Code einfacher machen ;-)

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
  ShellTreeView1.Items.BeginUpdate;
  ShellTreeView1.Items[0].Expand(true);
  ShellTreeView1.Items.EndUpdate;
end;

F.W. 23. Dez 2003 13:19

Re: ShellTreeView "expandieren"
 
Gut, aber viel schneller geht's damit auch nicht. Aber wie gesagt, es ist ja eigentlich nur für diesen einen Zweck.

Eine Frage noch: Kann man bei mirage s function auch eine Anzeige für Fortschritt mit einbauen?

F.W. 3. Feb 2004 19:29

Re: ShellTreeView "expandieren"
 
Ich bin wieder auf diesen Thread zurückgekommen, weil ich das Programm nochmal für einen anderen Zweck brauche, dummerweise müssen nun ein paar mehr Verzeichnisse eingelesen werden.

Ich habe ein neues komplett überarbeitetes Programm geschrieben, welches die Funktion von mirage228 benutzt. Mein Problem ist es jetzt das ganze zurück in einen TTreeView zu bekommen. Ich versuche es jetzt schon 2 Tage lang, ohne Erfolg! :cry:

Das Hauptproblem ist, dass bei dieser Funktion nicht erst alle Ordner und dann alle Dateien, sondern alles durcheinander ausgelesen wird.

Habt ihr noch ne' Idee? Ich bin am verzweifeln! :wall: :cry: :wall:

mirage228 3. Feb 2004 19:32

Re: ShellTreeView "expandieren"
 
Hi,

du könntest versuchen die Liste irgendwie zu sortieren, (alles was faDirectory ist dorthin und der rest woanders hin).

Um das ganze in einen TreeView zu kriegen müsstest du das ganze mach "\" zerpflücken und dann Ebene für Ebene alles in die TreeView einfügen.

Sonst kannst du dir ja mal die Borland Sources zu "DirectoryListBox" anschauen.

mfG
mirage228

F.W. 3. Feb 2004 20:57

Re: ShellTreeView "expandieren"
 
Ich bin jetzt soweit, dass es geht, beim wiedereinlesen ist alles ungeordnet und alle Ordner, die Dateien beinhalten sind alle Doppelt.
Hier der Code:
Delphi-Quellcode:
//Zum Erstellen eines Abbilds
var
 AText, DirRead: String;
 L: TStringList;
 ANb, I: Integer;
begin
 if SelectDirectory('Verzeichnis zum durchleuchten wählen', 'MyComputer', DirRead) = False then Exit;
 InputQuery('Pfad ändern', 'Sie können den Pfad nun noch ändern', DirRead);

 DirRead := SetPfad(DirRead, True);

 L := TStringList.Create;
   try
 FileList(DirRead, '*.*', True, L);
 for I := 0 to L.Count-1 do begin
     AText := L[I];
     if Pos('\.', AText) = Length(AText)-1 then begin
        SetLength(AText, Length(AText)-2);
     end;
     ANb := ReadForm.CountSlashes(AText)-2;
     L[I] := IntToStr(ANb)+'*]'+ExtractFileName(AText);
 end;

 if SDIa.Execute then L.SaveToFile(SDIa.FileName);
   finally
 L.Free;
   end;
end;

//Und zum Wieder ansehen(Tree ist der TTreeView)
var
 Indes: Array of Integer;
 L: TStringList;

 ALevel, LGes, LNb, I: Integer;
 AItem, AText: String;
 Start, Ende: Cardinal;
begin
 if not ODia.Execute then Exit;
 L := TStringList.Create;
   try
 L.LoadFromFile(ODia.FileName);

 SetLength(Indes, L.Count+1);
 for I := 0 to L.Count-1 do begin
     AItem := L[I];
     LGes := Length(AItem);
     LNb := Pos('*]', AItem)-1;
     ALevel := StrToInt(Copy(AItem, 1, LNb));
     AText := Copy(AItem, LNb+3, LGes-LNb);

     Indes[ALevel] := I;

     if ALevel = 0 then Tree.Items.Add(NIL, AText) else
        Tree.Items.AddChild(Tree.Items[Indes[ALevel-1]], AText);
 end;
   finally
 L.Free;
   end;
end;
Das es ungeordnet ist, ist nicht so schlimm, das einzige was mich noch stört und ich mir bis eben gerade noch die Zähne ausgebissen habe (ich weiß noch nicht wie): Wie bekomme ich die doppelten Ordner weg?

PS: Danke mirage, dass du so schnell Rückantwort schreibst, denn es liegt ja doch schon etwas zurück!

[Edit: Wichtig ist beim löschen, dass NICHT die Zeile gelöscht wird, die ohne mein SetLength(..) beim Einlesen das '\.' dahinter hätte!]

mirage228 4. Feb 2004 13:02

Re: ShellTreeView "expandieren"
 
Wenn da noch sachen unsortiert sind ruf einfach mal die .Sort() Prozedur von TStringList auf.
Falls da noch was doppelt ist, kannst du Duplicates von TStringList vorher auf dupIgnore stellen.

Um dir das "komplizierte" Rückschreiben in die TreeView zu sparen könntest du das Schreiben in die TreeView direkt in der Prozedur FileList erledigen. Ich versuche gleich da nochmal was zu basteln.


mfG
mirage228

F.W. 5. Feb 2004 12:28

Re: ShellTreeView "expandieren"
 
Na da bin ich ja mal gespannt, denn meine oben genannte Methode funktioniert nicht ganz so gut.
Beim Einlesen hauen die Zahlen, die davor geschrieben werden nicht immer ganz hin!

Werde dran arbeiten, bin aber sehr neugierig, welche Methode du anwendest! :shock:


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:23 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz