Autor Beitrag
20:30
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 27



BeitragVerfasst: 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:

ausblenden volle Höhe Delphi-Quelltext
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:
//Liste
  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
      //Hier möglicherweise versch. Schreibweisen hin!
      List.Add(Directory + SR.Name);
        end
      else
        begin
      //Hier möglicherweise versch. Schreibweisen hin!
          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 user profile iconNarses: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 429
Erhaltene Danke: 107

Win 10
Delphi 6 Prof, Delphi 10.4 Prof
BeitragVerfasst: Di 22.05.12 09:02 
vielleicht hilft das hier weiter?

www.swissdelphicente.../showcode.php?id=400

Für diesen Beitrag haben gedankt: 20:30
20:30 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 27



BeitragVerfasst: Di 22.05.12 14:19 
Jein... Nur wie ordne ich diese dann richtig in ein Memofeld an?
mandras
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 429
Erhaltene Danke: 107

Win 10
Delphi 6 Prof, Delphi 10.4 Prof
BeitragVerfasst: Di 22.05.12 14:39 
user profile icon20:30 hat folgendes geschrieben Zum zitierten Posting springen:
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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 27



BeitragVerfasst: Di 22.05.12 15:27 
user profile iconmandras hat folgendes geschrieben Zum zitierten Posting springen:

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.


"Lucida Console", wie es das Notepad als Standard-Schriftart benutzt? Eignet sich auch sonst wunderbar für ASCII-Art.

user profile iconmandras hat folgendes geschrieben Zum zitierten Posting springen:

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.


In die Richtung hab ich das gemeint. Nur wie mache ich das alles?
Sinspin
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1321
Erhaltene Danke: 117

Win 10
RIO, CE, Lazarus
BeitragVerfasst: Di 22.05.12 17:41 
Hi und :welcome: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 27



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1321
Erhaltene Danke: 117

Win 10
RIO, CE, Lazarus
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 27



BeitragVerfasst: 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.:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1321
Erhaltene Danke: 117

Win 10
RIO, CE, Lazarus
BeitragVerfasst: 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.
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 27



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19272
Erhaltene Danke: 1740

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Fr 25.05.12 16:57 
Wie sieht denn der aktuelle Quelltext aus und was genau kommt dabei Falsches heraus?
20:30 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 27



BeitragVerfasst: Fr 08.06.12 01:25 
ausblenden volle Höhe Delphi-Quelltext
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: stringconst Mask: string;
                              List: TStrings;
                              WithSubDirs, ClearList, ShowDir, ShowExt: Boolean);

procedure ScanDir(const Directory: string);
var
  SR: TSearchRec;
begin
//Überschrift + Rand
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;

//Liste
  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
      //Hier versch. Schreibweisen hin!
      List.Add(Directory + SR.Name);
        end
      else
        begin
      //Hier versch. Schreibweisen hin!
          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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 27



BeitragVerfasst: Mi 13.06.12 15:23 
*Hust*?
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19272
Erhaltene Danke: 1740

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 27



BeitragVerfasst: 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 '*').