Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Ordnernamen in Listbox laden (https://www.delphipraxis.net/127457-ordnernamen-listbox-laden.html)

cyanroot 13. Jan 2009 17:52


Ordnernamen in Listbox laden
 
Hallo,

wie kann ich alle Ordner die sich im Programmordener befinden auslesen und ihre Namen in einer Listbox anzeigen?

Danke im Vorraus

DeddyH 13. Jan 2009 17:56

Re: Ordnernamen in Listbox laden
 
Mit FindFirst() und FindNext() durch das Verzeichnis iterieren, auf das faDirectory-Attribut prüfen und Namen eintragen.

toms 13. Jan 2009 18:07

Re: Ordnernamen in Listbox laden
 
Hallo

Das geht z.B mit der LB_DIR Nachricht.
Flexibler bist du jedoch mit Delphi-Referenz durchsuchenFindFirst, Delphi-Referenz durchsuchenFindNext etc.

Delphi-Quellcode:
procedure ListDirectories(LB: TListBox; Path: PChar);
var
  i: Integer;
begin
  with LB do
  begin
    Perform(LB_DIR, DDL_DIRECTORY, Integer(Path));
    for i := Pred(Items.Count) downto 0 do
      if Items[i][1] <> '[' then Items.Delete(i);
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  ListDirectories(ListBox1,'C:\*.*');
end;

cyanroot 13. Jan 2009 20:17

Re: Ordnernamen in Listbox laden
 
Danke für den Code, es geht.

Leider werden aber die Namen mit [ ] umrandet und es befindet sich auch ein [...] in der ListBox. Kann man das irgendwie ändern?

Danke

toms 13. Jan 2009 20:22

Re: Ordnernamen in Listbox laden
 
Edit: i sollte vom Typ Integer sein und nicht Word. Probier's nochmals.

cyanroot 13. Jan 2009 20:26

Re: Ordnernamen in Listbox laden
 
Die Namen werden immer noch mit [ ] umrandet und es befindet sich auch ein [..] in der ListBox.
Weisst du was ich noch tun könnte?

TBx 13. Jan 2009 20:29

Re: Ordnernamen in Listbox laden
 
In dem Code findest Du eine For-Schleife.
In dieser wird jeder Eintrag gelöscht, der nicht mit '[' beginnt.
In dieser Schleife kannst Du nun einbauen, dass die Zeichen '[' und ']' ausgeschnitten werden. Dein Freunde hierfür sind Delphi-Referenz durchsuchencopy und Delphi-Referenz durchsuchenpos.
Auch kannst Du den Eintrag [..] darin ebenfalls löschen.

Gruß

cyanroot 13. Jan 2009 20:34

Re: Ordnernamen in Listbox laden
 
Es tut mir leid, ich habe nie auf dieser Ebene mit Delphi gearbeitet. Könntest Du mir nicht einen kleinen Beispielcode schreiben?

Wäre dir sehr dankbar.

quendolineDD 13. Jan 2009 21:31

Re: Ordnernamen in Listbox laden
 
Oder halt so
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
  ListBox1.Items.Assign(DirectoryListing('C:/*'));
end;

function TForm1.DirectoryListing(const PATH: string): TStrings;
var
  S : TSearchRec;
begin
  Result := TStringlist.Create;
  if FindFirst(PATH, faDirectory, S) = 0 then
  begin
    repeat
      if (S.Attr and faDirectory) = S.Attr then
        Result.Add(S.Name);
    until FindNext(S) <> 0;
    FindClose(S);
  end;
  if Result.Count = 0 then Result.Add(format('%s enthält keine Ordner', [path]));
end;
Am besten du schaust dir mal die Delphihilfe an. Einfach Copy eingeben und dann schauen was es dir anzeigt. Da siehst du auch direkt, welche Parameter die Funktion erwartet etc.

Lg

cyanroot 13. Jan 2009 21:48

Re: Ordnernamen in Listbox laden
 
Danke, aber da werden jetzt noch zuerst . und .. angezeigt. Weisst Du wie man die wegmacht?

taaktaak 13. Jan 2009 21:53

Re: Ordnernamen in Listbox laden
 
Delphi-Quellcode:
if (S.Name<>'.') and (S.Name<>'..') then Result.Add(S.Name)
// PS: dass die Funktion eine Stringliste erzeugt, finde ich nicht besonders glücklich, mach' doch 'ne Prozedur draus und übergebe dieser die Listbox zum direkten Befüllen

cyanroot 13. Jan 2009 22:01

Re: Ordnernamen in Listbox laden
 
Und das geht wie? ;).

taaktaak 13. Jan 2009 22:07

Re: Ordnernamen in Listbox laden
 
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
  DirectoryListing('C:/*',Listbox1.Items);
end;

procedure TForm1.DirectoryListing(const PATH:String;SL:TStrings);
var
  S : TSearchRec;
begin

  if FindFirst(PATH, faDirectory, S) = 0 then
  begin
    repeat
      if (S.Attr and faDirectory) = S.Attr then
       if (S.Name<>'.') and (S.Name<>'..') then SL.Add(S.Name)
    until FindNext(S) <> 0;
    FindClose(S);
  end;
  if Result.Count = 0 then SL.Add(format('%s enthält keine Ordner', [path]));
end;
// nur aus dem Kopf getippt

toms 13. Jan 2009 22:07

Re: Ordnernamen in Listbox laden
 
Zitat:

Zitat von cyanroot
Und das geht wie? ;).

Delphi-Quellcode:
procedure ListDirectory(Strings: TStrings; const Path: string);
var
  S: TSearchRec;
begin
  if FindFirst(Path, faDirectory, S) = 0 then
  begin
    repeat
      if ((S.Attr and faDirectory) = faDirectory) and
        (s.Name <> '.') and (s.Name <> '..') then
        Strings.Add(S.Name);
    until FindNext(S) <> 0;
    FindClose(S);
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  ListDirectory(ListBox1.Items, 'C:\*.*');
end;

taaktaak 13. Jan 2009 22:08

Re: Ordnernamen in Listbox laden
 
hihihi, schneller :lol:

quendolineDD 13. Jan 2009 22:09

Re: Ordnernamen in Listbox laden
 
Ja, weil ich die Stringliste dann nicht mehr freigeben kann. Aber Delphi dürfte den Speicher dann trotzdem wieder freigeben, was?

Ansonsten mach doch einfach so:

Delphi-Quellcode:
function TForm1.DirectoryListing(const PATH: string;
  var L: TListBox): Integer;
var
  S : TSearchRec;
begin
  Result := 0;
  if FindFirst(PATH, faDirectory, S) = 0 then
  begin
    repeat
      if ((S.Attr and faDirectory) = S.Attr) and (S.Name <> '.') and (S.Name <> '..') then
      begin
        L.Items.Add(S.Name);
        INC(Result);
      end;
    until FindNext(S) <> 0;
    FindClose(S);
  end;
  if Result = 0 then L.Items.Add(format('%s enthält keine Ordner', [PATH]));
end;
Ich liebe Funktionen ;)

taaktaak 13. Jan 2009 22:11

Re: Ordnernamen in Listbox laden
 
Ja, geht auch, aber TStrings sind universeller
:wink:

jfheins 13. Jan 2009 22:13

Re: Ordnernamen in Listbox laden
 
Zitat:

Zitat von taaktaak
hihihi, schneller :lol:

Aber falsch :P
Zitat:

Zitat von taaktaak
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
  DirectoryListing('C:/*',Listbox1.Items);
end;

procedure TForm1.DirectoryListing(const PATH:String;SL:TStrings);
var
  S : TSearchRec;
begin

  if FindFirst(PATH, faDirectory, S) = 0 then
  begin
    repeat
      if (S.Attr and faDirectory) = S.Attr then // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
       if (S.Name<>'.') and (S.Name&lt;&gt;'..') then SL.Add(S.Name)
    until FindNext(S) &lt;&gt; 0;
    FindClose(S);
  end;
  if Result.Count = 0 then SL.Add(format('%s enthält keine Ordner', [path]));
end;
// nur aus dem Kopf getippt

Funkt nur, wenn wirklich nur das Directory-Flag gesetzt ist - es darf also nicht komprimiert/veschlüsselt/schreibgeschützt/etc. sein ;)

taaktaak 13. Jan 2009 22:18

Re: Ordnernamen in Listbox laden
 
Schon richtig!
Das ist nur übernommen, nicht von mir.
Hätte korrigiert werden müssen!
Sorry!
:cry:

cyanroot 13. Jan 2009 22:21

Re: Ordnernamen in Listbox laden
 
Danke euch ;). Und warum ist das besser? ;).

taaktaak 13. Jan 2009 22:23

Re: Ordnernamen in Listbox laden
 
WAS?

cyanroot 13. Jan 2009 22:37

Re: Ordnernamen in Listbox laden
 
Oh sry, ihr habt ja noch was geschrieben ;). Warum procedure besser als function ist.

taaktaak 13. Jan 2009 22:41

Re: Ordnernamen in Listbox laden
 
Weil du dir unnötigerweise Problem mit dem Freigeben der in der Funktion erzeugten Liste einhandelst. Du kannst natürlich auch eine Funktion formulieren, die wie die Prozedur direkt an die Listbox übergibt und als Funktionsergebnis den Erfolg/Misserfolg des DirScans meldet.


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:55 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