Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Inhalt eines Ordners auslesen (https://www.delphipraxis.net/102118-inhalt-eines-ordners-auslesen.html)

Seppel 23. Okt 2007 19:01


Inhalt eines Ordners auslesen
 
Hi,

z.B in einem Ordner sind Bilder gespeichert und der Ordner heißt "Test" in meiner DB gibt es eine Person namens Test und zu der gehört der Ordner, der Pfad zu dem Ordner ist auch in der DB gespeichert.

Ich möchte jetzt also, dass die Bilder(in dem Ordner "Test") in einer Combobox oder etwas anderem aufzurufen sind und wenn man das BIld auswählt und auf Öffnen drückt öffnet sich dies.

Wie bekomme ich hin, dass der Inhalt und ausschließlich, .jpg oder .gif datein angezeigt werden.
Zudem müssen sie ja noch geöffnet werden.
Ich suche schon ne weile mir fällt nur keine Methode ein wie ich das hinbekommen soll.
Also der Pfad zu dem Ordner ist vorhanden in der DB und wenn der User angewählt wird, und in den Bereich kommt wo man alles überihn noch ma genau sieht und ändern kann, sollen Bilder über ihn auch anwählbar sein.

Ich hoffe ihr könnt mir helfen.
Danke.

dominikkv 23. Okt 2007 19:11

Re: Inhalt eines Ordners auslesen
 
Delphi-Quellcode:
procedure GetFileList(Path: String; ZielListe: TStringList);
var
  SR: TSearchRec;
begin
  if Path[length(Path)] <> '\' then
    Path := Path + '\';
  if FindFirst(Path + '*.*', faAnyFile, SR) = 0 then
    repeat
      if (Lowercase(ExtractFileExt(Path + sr.Name)) = '.jpg') then
        ZielListe.Add(Path + sr.Name);
    until FindNext(SR) <> 0;
  FindClose(SR);
  if FindFirst(Path + '*.*', faAnyFile, SR) = 0 then
    repeat
      if (SR.Attr = faDirectory) and
         (SR.Name <> '.') and (SR.Name <> '..') then
           GetFileList(Path + SR.Name + '\', ZielListe);
    until FindNext(SR) <> 0;
  FindClose(SR);
end;
dabei werden auch unterordner durchsucht.
kannst du so aufrufen:
Delphi-Quellcode:
procedure TForm1.Button1Click;
var
  List: TStringList;
  I: Integer;
begin
  List := TStringList.create;
  try
    GetFileList('<MeinPfad>', List);
    for I := 0 to List.Count do
      LoadMyImage(List[I]); // image laden
  finally
    FreeAndNil(List);
  end;
end;

Seppel 23. Okt 2007 19:14

Re: Inhalt eines Ordners auslesen
 
Kannst du mir das ein bisschen erläutern, ich würd auch gerne etwas lernen und wo muss ich was ändern.

dominikkv 23. Okt 2007 19:31

Re: Inhalt eines Ordners auslesen
 
ok :stupid:
und ich hab beim durchgehen gesehen das man da noch was vereinfachen kann :cyclops:

Delphi-Quellcode:
procedure GetFileList(Path: String; ZielListe: TStringList);
var
  SR: TSearchRec;
begin
  if Path[length(Path)] <> '\' then // erstmal schauen wir ob der übergebene pfad
    Path := Path + '\';             // mit einem \ aufhört, zB C:\Test\
  if FindFirst(Path + '*.jpg', faAnyFile, SR) = 0 then // nach der ersten datei suchen die mit .jpg endet
                                                       // * wird dabei als platzhalter verwendet
                                                       // in SR wird der fund gespeichert
    repeat
      ZielListe.Add(Path + sr.Name);    // pfad zum bild merken
    until FindNext(SR) <> 0;         // mit FindNext wird die suche wiederholt
  FindClose(SR);               // suche abschließen
  if FindFirst(Path + '*.*', faAnyFile, SR) = 0 then   // das ganze noch mal von vorne mit ordnern
    repeat
      if (SR.Attr = faDirectory) and                   //  schauen ob fund ein ordner ist
         (SR.Name <> '.') and (SR.Name <> '..') then   //     "
           GetFileList(Path + SR.Name + '\', ZielListe); // rekursiver aufruf unserer procedure mit unterordner
    until FindNext(SR) <> 0;   // suche widerholen
  FindClose(SR);               // suche abschließen
end;

procedure TForm1.Button1Click;
var
  List: TStringList;
  I: Integer;
begin
  List := TStringList.create;  // unsere StringList erzeugen
  try                          // speicherschutzblock
    GetFileList('<MeinPfad>', List); // unsere prozedure, deinen pfad hier eintragen!
    for I := 0 to List.Count do      // alle elemente der liste durchgehen...
      LoadMyImage(List[I]);          // ... und laden (ist jetzt nur nen beispiel)
  finally
    FreeAndNil(List);          // speicher freigeben
  end;
end;
das laden vom bild musst du übernehmen^^
setz dir am anfang der prozedure nen breakpoint, dann siehst du mit jedem knopfdruck auf F8 wo er gerade hinspringt.
Bei weiteren Fragen fragen.

Seppel 23. Okt 2007 19:40

Re: Inhalt eines Ordners auslesen
 
ok thx, morgen werd ich probieren.

Seppel 24. Okt 2007 12:46

Re: Inhalt eines Ordners auslesen
 
Was muss ich bei LoadMyImage einsetzen??

guidok 24. Okt 2007 13:16

Re: Inhalt eines Ordners auslesen
 
Zitat:

Zitat von Seppel
Was muss ich bei LoadMyImage einsetzen??

Das was du mit deiner Bilderliste, die du erstellt hast, anfangen willst. Steht doch dahinter, dass es nur ein Beispiel ist. Du kannst die ganze for-Schleife weglassen, falls du das an dieser Stelle nicht brauchst, oder du weist die List einer Listbox zu (assign) usw. usw.

Seppel 24. Okt 2007 13:24

Re: Inhalt eines Ordners auslesen
 
ok.
Sagen wir ich möchte, die Datein(also alle Bilder) in dem Ordner in einer Combobox angezeigt bekommen, wie stelle ich das dann an.

DeddyH 24. Okt 2007 13:36

Re: Inhalt eines Ordners auslesen
 
Meine Version ohne Unterordner:
Delphi-Quellcode:
procedure ListAllPics(sPath: string; List: TStrings);
var Rec: TSearchRec;
begin
  List.BeginUpdate;
  List.Clear;
  if sPath[Length(sPath)] <> '\' then
    sPath := sPath + '\';
  if FindFirst(sPath + '*.*',faAnyfile,Rec) = 0 then
    begin
      repeat
        if (AnsiLowerCase(ExtractFileExt(Rec.Name)) = '.jpg') or
           (AnsiLowerCase(ExtractFileExt(Rec.Name)) = '.gif') then
          List.Add(Rec.Name);
      until FindNext(Rec) <> 0;
      FindClose(Rec);
    end;
  List.EndUpdate;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  ListAllPics('F:',ComboBox1.Items);
end;

guidok 24. Okt 2007 15:14

Re: Inhalt eines Ordners auslesen
 
Zitat:

Zitat von Seppel
ok.
Sagen wir ich möchte, die Datein(also alle Bilder) in dem Ordner in einer Combobox angezeigt bekommen, wie stelle ich das dann an.

siehe Antwort von DeddyH.

Um aber beim Code von dominikkv zu bleiben:


Delphi-Quellcode:
ComboBox1.Items.Assign(List);
Und dies anstelle von:
Delphi-Quellcode:
for I := 0 to List.Count do      // alle elemente der liste durchgehen...
  LoadMyImage(List[I]);
Die Liste, die erstellt wird ist vom Typ TStringList und die Eigenschaft Items der Combobox ebenfalls. Mit Assign werden die Inhalte der einen Liste in die andere Liste kopiert.

Natürlich wäre es auch richtig:
Delphi-Quellcode:
 GetFileList('<MeinPfad>', ComboBox1.Items);
zu schreiben. Dann kannst du dir die Instanz "List" sparen und die File Liste wird direkt in die Stringliste Items der Combobox geschrieben.

Seppel 25. Okt 2007 13:04

Re: Inhalt eines Ordners auslesen
 
Ok es funzt.
Wie kriege ich Datei jetzt geöffnet, da muss ich bestimmt die Dialoge benutzen...
Und wenn ich z.B jemand neues der Db hinzufüge, dann muss für ihn auch ein Ordner erstellt werden, sagen wir ma es ist so: F:/Adressdb/User (User ist dann halt der Name)^^
So wenn ich den User anwähle und in den Editbereich lade, dann kann ich mir dort Bilder über ihn an sehen.(Das Laden hab ich ja jetzt^^) Jetzt fehlt also nur noch ein Bild hinzufügen und wenn jemand ganz neues erstellt wird einen Ordner zu erstellen.
Also mit Dilagen habe ich noch net so richtig gearbeitet, werd mich ma ein bisschen damit beschäftigen, dann müsste ich das auch blad hinkriegen.
Denn wenn der Pfad auser user angegeben ist ist es ja net so schwer ('F:/Adressdb/'+ edit1.Text; so ungefähr öffnet man dann und erstellt man den User.)

DeddyH 25. Okt 2007 13:08

Re: Inhalt eines Ordners auslesen
 
Also, Ordner erstellen kannst Du mit ForceDirectories. Das Bild holst Du Dir mit einem TOpenPictureDialog und speicherst es mit der Methode SaveToFile von TJPEGImage bzw. TGIFImage wieder ab.

crasher1985 25. Okt 2007 13:40

Re: Inhalt eines Ordners auslesen
 
Hier nochmal eine Version der Vollständigkeit halber

Delphi-Quellcode:
procedure AlleDateienImVerz(pfad:string; gefunden:TStrings; HS:String ;MitUnterVerz:Boolean);
//gibt liste aller dateien im verz zurück, wahlweise mit allen in allen unterverz.
 var
  sr:       TWin32FindData;
  h:        THandle;
begin
 if ansilastchar(pfad)<>'\' then pfad:=pfad+'\';

 h:=FindFirstFile(PChar(pfad + HS + '*.*'),sr);

 if not (h=INVALID_HANDLE_VALUE) then
  repeat
      if DirectoryExists(pfad+sr.cFileName) then
        begin
          if not (sr.cFileName[0]='.') then if MitUnterVerz then AlleDateienImVerz(pfad+sr.cFileName,gefunden,HS ,True);
        end
      else
       begin
        gefunden.add(pfad+sr.cFileName);
       end;
  until Findnextfile(h,sr)=false;
 windows.FindClose(h);
end;
AlleDateienImVerz(pfad:string; gefunden:TStrings; HS:String ;MitUnterVerz:Boolean);
pfad :
der Pfad der durchsucht werden soll

gefunden:
tStringlist in die alle Dateinamen gespeichert werden

HS:
war ne kleine abwandlung dient um zu filtern wenn man z.b. nur Dateinen haben möchte die mit XX beginnen. Kann ansonsten einfach mit nem leeren String aufgerufen werden.

MitUnterVerz
True oder false halt wie du es brauchst

Seppel 25. Okt 2007 14:01

Re: Inhalt eines Ordners auslesen
 
Ich will jetzt eine Datei öffnen^^
Was mache ich falsch:
Delphi-Quellcode:
if openpicturedialog1.Execute then
openpicturedialog1.FileName := Combobox1.ImeName

image1.Picture.LoadFromFile(openpicturedialog1.FileName);
Also mir ist eben die idee gekommen, dass man das Bild was drinne ist nur anzeigen lassen soll in einer image komponente, und das neu erstellen mache ich später, erst ma dieses Problem.
Was mache ich falsch?

DeddyH 25. Okt 2007 14:04

Re: Inhalt eines Ordners auslesen
 
Was soll denn die Zuweisung des Filenames? Außerdem fehlt da ein begin - end.

Seppel 25. Okt 2007 14:09

Re: Inhalt eines Ordners auslesen
 
ok^^
das begin und end is in meinem Prog da...
Ich will also, dass das was in der Combobox ausgewählt wird auch geöffnet wird und dann in einer image (z.B.) angezeigt wird, wie stelle ich das jetzt an?

DeddyH 25. Okt 2007 14:13

Re: Inhalt eines Ordners auslesen
 
Wenn Du den Dateinamen aus einer ComboBox liest, kannst Du Dir den Dialog aber sparen.

Seppel 25. Okt 2007 14:15

Re: Inhalt eines Ordners auslesen
 
Delphi-Quellcode:
procedure TForm1.Button2Click(Sender: TObject);
begin
image1.Picture.LoadFromFile(Combobox1.Text); // oda? hier is auch das edit^^
end;
Also dann müsste das ja richtig sein oder???

Jedenfalls, das wollte ich ja auch so machen^^

Aber es gibt ne Fehlermeldung aus, falsche Dateiendung.
edit:
hab was im code geändert.

DeddyH 25. Okt 2007 14:48

Re: Inhalt eines Ordners auslesen
 
Was steht denn in der ComboBox? Meine Glaskugel ist leider gerade zur Politur.

Seppel 25. Okt 2007 16:22

Re: Inhalt eines Ordners auslesen
 
Ja in der Combobox is ja die Datein, die vorher in einem Ordner durchsucht werden und dann darein geladen werden.
Es ist aufjedenfall ne Bilddatei, soviel kann ich sagen.
übrigens bei bmp dateien gibt es keine Fehlermeldung, dafür aber auch kein Bild^^

DeddyH 25. Okt 2007 16:31

Re: Inhalt eines Ordners auslesen
 
Hast Du denn auch die Units jpeg und GifImage eingebunden? Und dass kein Bild angezeigt wird, könnte am fehlenden Pfad liegen, wenn ich das richtig verstanden habe.

Seppel 25. Okt 2007 16:52

Re: Inhalt eines Ordners auslesen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Also:
Der Code ist momentan so:
Delphi-Quellcode:
image1.Picture.LoadFromFile('C:\Dokumente und Einstellungen\Sebastian\Eigene Dateien\Eigene Bilder\'+ Combobox1.Text);
Das müsste ja richtig sein, also die Unit Jpeg is eingebunden, gif war ich zu faul^^.
Aber es wird eine fehlermeldung ausgegeben(siehe anhang.)

DeddyH 25. Okt 2007 16:58

Re: Inhalt eines Ordners auslesen
 
Der Befehl sieht erstmal richtig aus. Der Fehler muss woanders herkommen. Setz doch mal einen Breakpoint auf die Zeile und steppe mal durch.

Seppel 25. Okt 2007 17:04

Re: Inhalt eines Ordners auslesen
 
Danke für den Tipp mim Breakpoint, hab da ma was nebenbei probiert, das war der Fehler.
Danke.


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

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