Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi ListBox-/View mit Dateien und Verzeichnissen anzeigen (https://www.delphipraxis.net/190376-listbox-view-mit-dateien-und-verzeichnissen-anzeigen.html)

Jim Carrey 28. Sep 2016 20:17

ListBox-/View mit Dateien und Verzeichnissen anzeigen
 
Das ist mein erster Beitrag also seid nicht böse mit mir, wenn ich irgendwelche Regeln nicht beachte.
Ich habe eine TForm mit einer Komponente namens TGtroCheckShellTreeView drauf. Das ist eine ListView mit allen Dateien und Verzeichnissen eines Root-Verzeichnisses XYZ.
Ich kann alle Verzeichnisse und Dateien checken und unchecken.
Die Komponente ist aber sau langsam wenn man das Programm startet! Außerdem weiß ich nicht wie ich gecheckte Einträge erneut checken kann, wenn ich sie vorher in einer Liste gespeichert habe.

Kann ich die Komponente TGtroCheckShellTreeView durch etwas Besseres ersetzen wo ich auch Einträge anchecken kann?

Luckie 28. Sep 2016 20:32

AW: ListBox-/View mit Dateien und Verzeichnissen anzeigen
 
Anchecken?

Du hast doch gesagt, dass die Auswahl per Checkbox möglich ist. Wo ist das Problem?

Jim Carrey 28. Sep 2016 20:38

AW: ListBox-/View mit Dateien und Verzeichnissen anzeigen
 
Genau, anchecken funktioniert.
Aber ich schaffe es nicht das nachher wieder auszulesen und erneut anzuchecken.
Eine Textdatei mit den angecheckten relativen Pfaden existiert.

Ich dachte halt, es gibt etwas Besseres, schnelleres, schöneres. Wenn nicht, ist das auch OK und ich muss nur wissen, wie ich die Items wieder anchecke die in der Textdatei mit relativem Pfad stehen.

Durch die erste Ebene schaffe ich es aber weiter schaffe ich es nicht
Delphi-Quellcode:
procedure TForm11.Button3Click(Sender: TObject);
var
 i: Integer;
begin
 for i := 0 to GtroCheckShellTreeView1.Items.Count - 1 do
  begin
   ShowMessage(GtroCheckShellTreeView1.Items[i].Text); // Nur zum Anzeigen/Test
  end;
end;

Luckie 28. Sep 2016 20:41

AW: ListBox-/View mit Dateien und Verzeichnissen anzeigen
 
Einträge in einer Schleife durchgehen. Die Komponente wird sie ja irgendwie in einer Liste zur Verfügung stellen. Gucken, ob der Eintrag gecheckt ist, es sollte eine entsprechende Eigenschaft geben, und dann eben die Auswahl aufheben.

Delphi-Quellcode:
if Item[i].Checked then Item[i].checked := false;

Jim Carrey 28. Sep 2016 20:51

AW: ListBox-/View mit Dateien und Verzeichnissen anzeigen
 
Ich meinte eher, wie ich generell durch die Liste gehe.
Ich bin jetzt soweit, dass ich durch alle Items gehen kann:

Delphi-Quellcode:
procedure TForm11.Button3Click(Sender: TObject);
var
 i: Integer;
 Node: TTreeNode;
begin
 // ... Liste mit Dateinamen in StringList laden ...

 Node := GtroCheckShellTreeView1.Items[0].getFirstChild;

 while Assigned(Node) do
  begin
   ShowMessage(Node.Parent.Text + '\' + Node.Text);

   // Hier würde ich jetzt gucken, ob Node.Parent.Text + '\' + Node.Text in der StringList ist. Wenn ja => anchecken

   Node := Node.GetNext;
  end;
Das würde eigentlich perfekt passen.
Ist das OK so oder totaler Mumpitz?

Luckie 28. Sep 2016 20:59

AW: ListBox-/View mit Dateien und Verzeichnissen anzeigen
 
Warum probierst du es nicht aus, ob es funktioniert?

Jim Carrey 28. Sep 2016 21:17

AW: ListBox-/View mit Dateien und Verzeichnissen anzeigen
 
Es funktioniert natürlich, genau wie ich wollte. Ich dachte nur, es gibt da eine schönere Lösung.

Jim Carrey 28. Sep 2016 21:47

AW: ListBox-/View mit Dateien und Verzeichnissen anzeigen
 
Es funktioniert doch nicht so wie ich erhofft habe :(

Die Ordnberstruktur ist
- test
-- test\1
--- test\2
---- test\2\3.dll
--- test\2\2.dll
-- test\1.dll

Verzeichnis test beinhaltet Ordner 1 und Datei 1.
Verzeichnis 1 beinhaltet Ordner 2 und Datei 2.
Verzeichnis 2 beinhaltet Datei 3.

Meine oben geschriebene while-Schleife guckt leider nur in test nach und geht nicht in die Unterverzeichnisse.
Jetzt bin ich mit meinem Latein leider am Ende.

Luckie 28. Sep 2016 21:58

AW: ListBox-/View mit Dateien und Verzeichnissen anzeigen
 
Stichwort Rekursion.

Jim Carrey 28. Sep 2016 22:00

AW: ListBox-/View mit Dateien und Verzeichnissen anzeigen
 
Genau das habe ich befürchtet. Seitdem der erste Beitrag existiert suche ich nach Lösungen aber ich scheine zu dumm dafür zu sein.
Denkst du, du kannst mir helfen?

Luckie 28. Sep 2016 22:05

AW: ListBox-/View mit Dateien und Verzeichnissen anzeigen
 
Zur Rekursion gibt es genug Beispiel und Tutorials. Das sollte eigentlich reichen. Und wen du konkreten Code hast, kann man immer noch mal nachfragen.

Jim Carrey 28. Sep 2016 22:36

AW: ListBox-/View mit Dateien und Verzeichnissen anzeigen
 
Ich habe mittlerweile alles durch. Mein letzter Code war dieser hier https://www.devexpress.com/Support/C...n/Details/A973
Keiner funktioniert. Es ist ja nicht so, dass ich nicht suche, so einer bin ich nicht, aber es funktioniert halt absolut nichts.

Luckie 28. Sep 2016 22:42

AW: ListBox-/View mit Dateien und Verzeichnissen anzeigen
 
Und wie sollen wir dir jetzt helfen? Kein Code von dir und nur die Aussage das irgendeinanderer Code nicht "funktioniert".

Jim Carrey 28. Sep 2016 22:44

AW: ListBox-/View mit Dateien und Verzeichnissen anzeigen
 
Ich weiß einfach nicht, wie man durch alle Nodes geht das ist alles.

Luckie 28. Sep 2016 22:45

AW: ListBox-/View mit Dateien und Verzeichnissen anzeigen
 
Dann zeig doch mal deinen bisherigen rekursiven Code, was du bisher hast und was wo nicht funktioniert. Wie sollen wir dir sonst helfen?:roll:

Jim Carrey 28. Sep 2016 22:50

AW: ListBox-/View mit Dateien und Verzeichnissen anzeigen
 
Mein aktueller Code ist

Delphi-Quellcode:
Node := GtroCheckShellTreeView1.Items[0].getFirstChild;
while Node <> nil do
 begin
  // Pruefen, ob aktueller Node im Memo steht. Wenn ja, Node anchecken
  if Memo1.Lines.IndexOf(Node.Parent.Text + '\' + Node.Text) > -1 then
   GtroCheckShellTreeView1.SetNodeChecked(Node, True);
 
  Node := Node.GetNext;
 end;

Luckie 28. Sep 2016 22:51

AW: ListBox-/View mit Dateien und Verzeichnissen anzeigen
 
Du hast doch gerade einen Link zu einem rekursiven Code gepostet, um einen Treeview durchzugehen und gesagt, der funktioniert nicht. Jetzt zeig den doch mal wie der bei dir aussieht und was wo nicht funktioniert.

Jim Carrey 28. Sep 2016 22:54

AW: ListBox-/View mit Dateien und Verzeichnissen anzeigen
 
Den hab ich schon längst wieder gelöscht.
Aber da wo jetzt Node := Node.GetNext; steht stand vorher ein Check, ob der aktuelle Node Children hat und wenn ja, wurde ProcessChildren aufgerufen.

Es fängt schon damit an, dass IrgendeinNode.Count immer 0 ist. Es funktionierte vorne und hinten nicht.

Luckie 28. Sep 2016 22:58

AW: ListBox-/View mit Dateien und Verzeichnissen anzeigen
 
Also ohne konkreten Code von dir, ist keine Hilfe möglich. Wir können auch nur den schon verlinkten Code posten.

Jim Carrey 29. Sep 2016 10:52

AW: ListBox-/View mit Dateien und Verzeichnissen anzeigen
 
Ich habe das jetzt noch einmal neu gemacht und es sieht jetzt so aus

Delphi-Quellcode:
function GetNodePath(aNode: TTreeNode; aDelimiter: String = ''): String;
begin
 Result := '';

 while Assigned(aNode) do
  begin
   Result := aDelimiter + aNode.Text + Result;
   aNode := aNode.Parent;
  end;

 if Result[1] = '\' then
  Delete(Result, 1, 1);

 if Result = '' then
  Delete(Result, 1, 1);
end;

procedure TForm11.Button4Click(Sender: TObject);
 procedure ProcessChildren(aNode: TTreeNode; Recurse: Boolean);
 var
  i: Integer;
  s: String;
 begin
  for i := 0 to aNode.Count - 1 do
   begin
    s := GetNodePath(aNode, '\') + '\';
    s := aSharedProcs.StringReplaceEx(s + aNode[i].Text, GtroCheckShellTreeView1.Items[0].Text, '');

    if Form11.Memo1.Lines.IndexOf(s) > -1 then
     begin
      GtroCheckShellTreeView1.Items[i].Expand(True); // PROBLEM

      GtroCheckShellTreeView1.SetNodeChecked(aNode[i], True);
     end;

    if Recurse and aNode[i].HasChildren then
     ProcessChildren(aNode[i], Recurse);
   end;
 end;

var
 i, j: Integer;
 s: String;
 Node: TTreeNode;
begin

  for j := 0 to GtroCheckShellTreeView1.Items[0].Count do
   begin
    Node := GtroCheckShellTreeView1.Items[j];

    s := aSharedProcs.StringReplaceEx(Node.Text, GtroCheckShellTreeView1.Items[0].Text, '');
   
    if Form11.Memo1.Lines.IndexOf(s) > -1 then
     begin
      Node.Expand(True);
      GtroCheckShellTreeView1.SetNodeChecked(Node, True);
     end;

    ProcessChildren(Node, True);
  end;
end;
Er geht jetzt tatsächlich durch alle Knoten und checkt auch genau die Knoten, die im Memo1 drin stehen.

Es gibt jetzt nur noch ein Problem an der Stelle // PROBLEM.
Es sollen nur die Knoten expandiert werden, wo auch Unterknoten checked sind.
Das bekomme ich leider nicht hin :(

Sowei ich weiß muss erst einmal alles expandiert werden, damit überhaupt etwas angecheckt werden kann. Denn was nicht sichtbar ist, kann nicht angecheckt werden.


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:30 Uhr.

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