Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Verzeichniss abbilden... (https://www.delphipraxis.net/139370-verzeichniss-abbilden.html)

Teekeks 27. Aug 2009 15:32


Verzeichniss abbilden...
 
Hallo!
Ich Würde gerne in einem TreeView Ein Verzeichnis + alle Unterverzeichnisse + alle Files darin abbilden.
Dazu habe ich mir zuerst mal folgendes zusammengebastelt:
Delphi-Quellcode:
type
  TFileName=string[50];

  PTVDir=^TTVDir;

  TTVDir=record
    Dir:string[255];
    Files:array of TFileName;
    Dirs: array of PTVLDir;
  end;
Nun ist das Ding so ja nicht so einfach zu verwalten... Da habe ich mich gefragt: könnt ihr mir entweder erklären wie ich auf die einzelnen Elemente zugreife (ich habe fast keine Erfahrung mit Pointern...) oder mir eine einfachere Lösung bieten?

Das wäre auf jeden Fall nett.

Gruß Teekeks

himitsu 27. Aug 2009 15:44

Re: Verzeichniss abbilden...
 
Es kommt ja erstmal darauf an, was du willst.
Denn es gibt ja mehrere Wege :wink:

Wenn du eh nur eine normale TreeView hast und alle Daten immer darin enthalten sind (also nicht in OnExpand und OnCollapse füllen und leeren), dann kannst du diese Daten (ist ja nur der Name) direkt in die ListView einfügen und deinen Record weglassen ... doppelte Datenführung muß dann doch nicht sein.


Effektiv würde ich garkeine Arrays verwenden, sondern verkettete Listen.


in meinem SSF hab ich im Grunde diese Struktur zur Speicerhung verwendet
Delphi-Quellcode:
TRootDirRec = Record
  First, Last: PDirRec;
End;
PDirRec = ^TDirRec;
TDirRec = Record
  Prev, Next: PDirRec;
  Parent:    PDirRec;
  Childs:    TRootDirRec;

  FileName:  String;
  Attributes: LongWord;
End;

Var Root: TRootDirRec;
und dann sind von Root ausgehend alle Dateien/Verzeichnisse als doppelt verkettete Liste bei ihrem Parent eingetragen.

Also die Dateien/Ordner einer Ebene sind über Prev & Next miteinander verbunden
und in First & Last stehen Anfang und Ende der Liste (wobei man Prev & Last auch weglassen könnte, wenn man nicht vor hat, diese Liste nachträglich zu ändern, (abgesehn von Einträgen anzuhängen).

Insgesammt stellt dieses also eine mehrfach kreuz und quer verkette Liste dar, durch welche man via eines Pointers (PDirRec) sehr leicht navigieren kann.

Ob es nun eine Datei oder ein Verzeichnis ist, ist dabei erstmal egal,
denn durch den gleichen Datentyp kann man so auf alles gleich zugreifen.
Und was nun was ist, wird in Attributes festgelegt (dort gibt es eines für Verzeichnisse)

Hat den Vorteil, daß sich diese Struktur sehr schön Editieren läßt (hinzufügen, ändern und löschen von Einträgen),
denn wie man sieht, fülle ich diese Liste ja nicht einfach nur, sondern kann auch wärend des Füllens damit arbeiten und z.B. schon zu diesem Zeitpunkt diese Liste anzeigen und auch schon einige Sachen damit veranstalten.



PS: TFileName ist etwas mickrig definiert, hab hier Datei-/Verzeichnisnamen, welche wesendlich länger sind.

FileName = Array[0..MAX_PATH-1] wäre da schon angebrachter
Wobei wohl meistens String[255] auch ausreichen sollte, da MAX_PATH auch nur 260 ist, aber laut Spezifikation kann halt ein Name im FAT/NTFS-Dateisystem so lang sein, also MAX_PATH-1, da dort ja die abschließende #0 mit eingerechnet ist.

Teekeks 27. Aug 2009 15:51

Re: Verzeichniss abbilden...
 
Ich hatte mich nur entschlossen das ganze nochmal neben dem TreeView zu speichern weil ja immer gesagt wird das man nicht mit den Komponenten seine Daten Speichern soll (wegen Zugriffs Geschwindigkeit...).
Aber ich könnte mich ja auch einfach darüber hinwegsetzen... ^^

Gruß Teekeks

[roter Kasten] du hast Dateien die (ohne Verzeichnispfad)länger als 50 Zeichen sind? :shock:

himitsu 27. Aug 2009 16:06

Re: Verzeichniss abbilden...
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von Teekeks
Ich hatte mich nur entschlossen das ganze nochmal neben dem TreeView zu speichern weil ja immer gesagt wird das man nicht mit den Komponenten seine Daten Speichern soll (wegen Zugriffs Geschwindigkeit...).
Aber ich könnte mich ja auch einfach darüber hinwegsetzen... ^^

sagen wir es mal so, wenn du den ganzen Pfad eh im Tree hast,
dann wird es durch die Doppelte Haushaltsführung eher langsamer und du hast alle Daten doppelt im RAM :roll:

Ich hab meine Liste nur als Binärbaum rumliegen
und a) im VirtualTreeView nur die angezeigten Daten drin (zusammengeklappte Verzeichnisse werden aus dem TreeView gelöscht)
und b) im Tree sind nur Pointer auf dem Baum enthalten, also auch keine doppelten Daten (angezeigte Strings werden aus dem Baum geladen)

In der alten Version (SSF2) hatte ich aber auch alles im TreeView drin, falls dieses dich etwas beruhigt :oops:

Zitat:

Zitat von Teekeks
[roter Kasten] du hast Dateien die (ohne Verzeichnispfad)länger als 50 Zeichen sind? :shock:

joar?
wir leben doch nicht mehr in Zeiten von 8.3 :lol:

Teekeks 27. Aug 2009 16:35

Re: Verzeichniss abbilden...
 
OMG es stimmt ^^
Gut, Ich lebe momentan in der zeit wo ein Dateiname maximal 25 Zeichen haben darf (aus ethischen gründen ^^). Insofern war ich schon großzügig... :mrgreen:

himitsu 27. Aug 2009 16:51

Re: Verzeichniss abbilden...
 
nja, wo ich mein Programm auch auf andere/fremde Rechner loslasse, hab ich mich an die offiziellen Grenzen gehalten.

PS: die Zeiten wo ein kopletter Pfad nur 259 Zeichen enthalten darf
(256 Zeichen Pfad + 3 Zeichen Laufwerk ala "C:\")
sind auch schon lange vorbei ... offiziell sind es bei MS inzwischen schlappe 32768 :lol:

hoika 29. Aug 2009 10:35

Re: Verzeichniss abbilden...
 
Hallo,

wer benutzt denn heute noch Records ? ;)
Ich würde eine TList nehmen.


Heiko

p80286 29. Aug 2009 11:38

Re: Verzeichniss abbilden...
 
@Hoika

Records für alle die in tlist auch Inhalte haben ;-)

Gruß
K-H

hoika 29. Aug 2009 11:52

Re: Verzeichniss abbilden...
 
Hallo,

das habe ich nicht verstanden ...


Heiko

himitsu 29. Aug 2009 20:38

Re: Verzeichniss abbilden...
 
wie legst du denn mehrere Werte pro Eintrag in TList ab? :zwinker:
(in einem Record)


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:06 Uhr.
Seite 1 von 2  1 2      

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