Autor |
Beitrag |
20:30
Beiträge: 27
|
Verfasst: Mo 21.05.12 20:42
Hallo erstmals, da ich neu im Board bin komme ich schon mit meiner ersten Frage.
Ich wollte einen Dateibaum, ähnlich dem Befehl "TREE /F C:\..." eines Batch, in ein Memofeld schreiben.
Jedoch komme ich dies bezüglich nicht weiter. Bis jetzt schreibt er mir nur die Verzeichnisse und Dateien untereinander.
Wahrscheinlich brauche ich ähnlich einem Treenode "Eltern" und "Kinder", hab aber keiner blassen schimmer wie ich das reinbringe und wie ich die Striche (├, ─, └, etc.) darin einordne.
Beim Quelltext bisher:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46:
| if FindFirst(Directory + Mask, faAnyFile and not faDirectory, SR) = 0 then try repeat if not ShowExt then SR.Name := ChangeFileExt(SR.Name, ''); if ShowDir then begin List.Add(Directory + SR.Name); end else begin List.Add(SR.Name); end; until FindNext(SR) <> 0; finally FindClose(SR); end;
if WithSubDirs then begin if FindFirst(Directory + '*.*', faAnyFile, SR) = 0 then try repeat if ((SR.attr and faDirectory) = faDirectory) and (SR.Name <> '.') and (SR.Name <> '..') then ScanDir(Directory + SR.Name + '\'); until FindNext(SR) <> 0; finally FindClose(SR); end; end; end;
begin List.BeginUpdate; try if ClearList then List.Clear; if Directory = '' then Exit; if Directory[Length(Directory)] <> '\' then Directory := Directory + '\'; ScanDir(Directory); finally List.EndUpdate; end; end; |
Danke für jede Hilfe.
Moderiert von Narses: Topic aus Algorithmen, Optimierung und Assembler verschoben am Mo 21.05.2012 um 22:29
Zuletzt bearbeitet von 20:30 am Di 22.05.12 18:22, insgesamt 1-mal bearbeitet
|
|
mandras
Beiträge: 429
Erhaltene Danke: 107
Win 10
Delphi 6 Prof, Delphi 10.4 Prof
|
Verfasst: Di 22.05.12 09:02
Für diesen Beitrag haben gedankt: 20:30
|
|
20:30
Beiträge: 27
|
Verfasst: Di 22.05.12 14:19
Jein... Nur wie ordne ich diese dann richtig in ein Memofeld an?
|
|
mandras
Beiträge: 429
Erhaltene Danke: 107
Win 10
Delphi 6 Prof, Delphi 10.4 Prof
|
Verfasst: Di 22.05.12 14:39
20:30 hat folgendes geschrieben : | Jein... Nur wie ordne ich diese dann richtig in ein Memofeld an? |
Ich würde sagen gar nicht. Dafür bräuchtest Du als erstes eine Schriftart mit fester Laufweite und den entsprechenden Zeichen die Deinen Baum darstellen sollen. Wenn ich richtig informiert bin gehört so ein Font schon länger nicht mehr zu Windows.
Natürlich könntet Du mit +,-,\ etc arbeiten. Aber das sieht dann ja übel aus.
Falls Du das dennoch möchtest wäre meine erste Idee am Zeilenanfang immer so viele Leerzeichen einzufügen wie die Verschachtelungstiefe des jeweiligen Baumelements ist.
Für diesen Beitrag haben gedankt: 20:30
|
|
20:30
Beiträge: 27
|
Verfasst: Di 22.05.12 15:27
|
|
Sinspin
Beiträge: 1321
Erhaltene Danke: 117
Win 10
RIO, CE, Lazarus
|
Verfasst: Di 22.05.12 17:41
Hi und in der EE.
Muss es unbedingt eine Liste sein? Du kannst doch auch gleich einen Tree (TTreeView, etc.) nehmen. Da brauchst Du Dir keinen Kopf mehr um die Gestaltung zu machen.
Um die Verzeichnisse und Dateien erfassen zu können brauchst Du eine Procedure die Du rekursive aufrufst.
Und zwar erfolgt der erste Aufruf mit dem Verzeichnis in dem es losgehen soll und für jedes Unterverzeichnis das Du beim Durchsuchen des Verzeichnisses findest rufst Du die Procedure erneut auf nur halt dann mit dem angepassten Verzeichnisnamen. Das ganze kann man auch ohne Rekursion lösen, ist aber deutlich aufwändiger.
_________________ Wir zerstören die Natur und Wälder der Erde. Wir töten wilde Tiere für Trophäen. Wir produzieren Lebewesen als Massenware um sie nach wenigen Monaten zu töten. Warum sollte unser aller Mutter, die Natur, nicht die gleichen Rechte haben?
Für diesen Beitrag haben gedankt: 20:30
|
|
20:30
Beiträge: 27
|
Verfasst: Di 22.05.12 18:20
Nun, ich wollte halt die Ausgabe wie beim DOS-Befehl " Tree /F 'Pfad' " in ein Memofeld. Einfach ShellExecute oder ähnliches (habs noch nicht ausprobiert) zu nehmen wäre etwas unsauber programmiert oder?
|
|
Sinspin
Beiträge: 1321
Erhaltene Danke: 117
Win 10
RIO, CE, Lazarus
|
Verfasst: Di 22.05.12 19:06
Kommt drauf an was Du damit vorhast. Selber programmiert ist der Lerneffekt natürlich größer.
Ein anderer Zeichensatz der noch aus DOS Zeiten über ist, ist Fixedsys. Den nehme ich an Stellen wo es ruhig ein bisschen fetter sein darf.
Ein kleiner Tip noch fürs umsetzen, beim Aufruf der rekursiven Procedure übergibst Du außer dem neuen Pfad noch einen Integerwert mit den du immer beim eintreten in die Procedure um 1 erhöhst. So bekommst Du die Verzeichnissebene raus und somit um wieviel Leerzeichen Du aktuell einrücken musst.
_________________ Wir zerstören die Natur und Wälder der Erde. Wir töten wilde Tiere für Trophäen. Wir produzieren Lebewesen als Massenware um sie nach wenigen Monaten zu töten. Warum sollte unser aller Mutter, die Natur, nicht die gleichen Rechte haben?
Für diesen Beitrag haben gedankt: 20:30
|
|
20:30
Beiträge: 27
|
Verfasst: Di 22.05.12 20:42
Fast... Aber Danke für den Tipp!
Wenn ich den Integer immer um eins erhöhe werden auch andere Elemente verschoben.
Bsp.:
Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| Ordner Datei Ordner\Unterordner Datei Ordner\Unterordner\UnterOrdner Datei Datei Ordner\Unterordner Datei Ordner\Unterordner Ordner\Unterordner\UnterOrdner Datei usw. |
Wobei ich sicher was falsch gemacht hab.
|
|
Sinspin
Beiträge: 1321
Erhaltene Danke: 117
Win 10
RIO, CE, Lazarus
|
Verfasst: Di 22.05.12 23:16
Deine Procedure sollte ja so aufgebaut sein das sie Verzeichnisse und Dateien findet und ausgibt. Wobei Du alles auf einem Level gefundene auch nur um das übergebene Level (plus 1) einrückst. Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| C:\ [DIR] hans.bat wurst.bat Programme [DIR] Spiele [DIR] ... Basteleien [DIR] ... ratemal.txt stuff.doc zeugs [DIR] Delphi [DIR] ... CScharf [DIR] ... trojaner.stub.com | Die Procedure wird ja nur für jedes Unterverzeichnis aufgerufen das Du findest. Somit erhält ein Unterverzeichnis ein nächst höheres Level. Aber die anderen Dateien und Verzeichnisse auf dem Level von dem du kommst sind ja nicht davon betroffen. Für diese ändert sich das Level ja nicht. Deshalb ist es wichtig die Variable mit zu übergeben aber nicht als var also Rückgabetyp sodern als normalen Parameter.
_________________ Wir zerstören die Natur und Wälder der Erde. Wir töten wilde Tiere für Trophäen. Wir produzieren Lebewesen als Massenware um sie nach wenigen Monaten zu töten. Warum sollte unser aller Mutter, die Natur, nicht die gleichen Rechte haben?
|
|
20:30
Beiträge: 27
|
Verfasst: Fr 25.05.12 15:59
Okay, ich habe jetzt den Tipp von Sinspin in allen möglichen Kombinationen geschraubt und bekomme immer noch falsche Ergebnisse. Kann mir einer noch weiter helfen?
|
|
jaenicke
Beiträge: 19272
Erhaltene Danke: 1740
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Fr 25.05.12 16:57
Wie sieht denn der aktuelle Quelltext aus und was genau kommt dabei Falsches heraus?
|
|
20:30
Beiträge: 27
|
Verfasst: Fr 08.06.12 01:25
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71:
| procedure GetFilesInDirectory(Directory: string; const Mask: string; List: TStrings; WithSubDirs, ClearList, ShowDir, ShowExt: Boolean);
procedure ScanDir(const Directory: string); var SR: TSearchRec; begin if FStyle.CB_VU.Checked then begin if FSTyle.RG_RV.ItemIndex > 0 then begin Form1.M_A.Lines.Add((DupeString(RahmenV,Length(Directory) + 4))); Form1.M_A.Lines.Add(RahmenV + ' ' + Directory + ' ' + RahmenV); Form1.M_A.Lines.Add((DupeString(RahmenV,Length(Directory) + 4))); end else Form1.M_A.Lines.Add(DupeString(' ', Tiefe) + Directory); Form1.M_A.Lines.Add(''); end;
if FindFirst(Directory + Mask, faAnyFile and not faDirectory, SR) = 0 then try repeat if not ShowExt then SR.Name := ChangeFileExt(SR.Name, ''); if ShowDir then begin List.Add(Directory + SR.Name); end else begin List.Add(DupeString(' ', Tiefe) + SR.Name); end; until FindNext(SR) <> 0; finally FindClose(SR); end; inc(Tiefe); Form1.M_A.Lines.Add('');
if WithSubDirs then begin if FindFirst(Directory + '*.*', faAnyFile, SR) = 0 then try repeat if ((SR.attr and faDirectory) = faDirectory) and (SR.Name <> '.') and (SR.Name <> '..') then ScanDir(Directory + SR.Name + '\') until FindNext(SR) <> 0; finally FindClose(SR); end; dec(Tiefe); end; end;
begin List.BeginUpdate; try if ClearList then List.Clear; if Directory = '' then Exit; if Directory[Length(Directory)] <> '\' then Directory := Directory + '\'; ScanDir(Directory); finally List.EndUpdate; end; end; |
Das es falsch ist, sehe sogar ich ich. Handelt sich dabei halt um rumbastlerei.
|
|
20:30
Beiträge: 27
|
Verfasst: Mi 13.06.12 15:23
|
|
jaenicke
Beiträge: 19272
Erhaltene Danke: 1740
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mi 13.06.12 15:54
Was kommt denn heraus und was soll an der Stelle herauskommen? (Ausprobieren kann ich es heute Abend erst.)
|
|
20:30
Beiträge: 27
|
Verfasst: Fr 22.06.12 23:07
Nun, die Verzeichnisse ordnet er gar nicht ein und die Dateien springen eigentlich mal hin dann wieder her.
Was rauskommen soll, habe ich oben beschrieben
PS: Ach ja, wer sich über die Variable RahmenV wundert, die hat nichts damit zu tun. Es sind einfach einstellbare Rahmen (Wie '*').
|
|