Delphi-PRAXiS
Seite 2 von 6     12 34     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Suchmaske nach FindFirst verändern? (https://www.delphipraxis.net/143694-suchmaske-nach-findfirst-veraendern.html)

PeterPanino 21. Nov 2009 17:04

Re: Suchmaske nach FindFirst verändern?
 
Zitat:

Zitat von himitsu
Was aber möglich ist: alles liefern lassen und dann selber filtern.

Genau DAS wollte ich ja vermeiden. Grund des Ganzen: Ich brauche eine Funktion HoleNaechsteDatei, um ausgehend von der aktuell geladenen Datei die "nächste" Datei im Verzeichnis dieser geladenen Datei zu suchen (wobei die aktuell geladene Datei nicht über eine Suche gefunden sondern manuell vom Anwender geladen wurde). Dafür gibt es nun verschiedene Möglichkeiten:

1. Im Verzeichnis der aktuell geladenen Datei alle Dateien des gewünschten Dateityps suchen und dann in einer eigenen Liste SLNaechsteDateien speichern. Wenn der Anwender die Funktion "Lade nächste Datei im Verzeichnis der aktuell geladenen Datei" ausführt, wird die nächste Datei aus der Liste SLNaechsteDateien geladen und der Listeneintrag dann gelöscht, usw.
Diese Methode hat einige Nachteile:
a) Die Liste könnte nicht mehr aktuell sein, weil unterdessen Dateien im Verzeichnis etwa gelöscht wurden.
b) Aufwändige und fehleranfällige Verwaltung der Liste: Wenn der Anwender manuell eine Datei aus einem anderen Verzeichnis lädt, muss die Liste zurückgesetzt und neu eingelesen werden, usw.

2. Wenn der Anwender die Funktion "Lade nächste Datei im Verzeichnis der aktuell geladenen Datei" ausführt, sucht das Programm mit FindFirst und der Dateimaske des gewünschten Dateityps im Verzeichnis der aktuell geladenen Datei und lädt die gefundene Datei. SearchRecord wird in einer globalen Variable gespeichert, sodass beim nächsten Ausführen der Funktion "Lade nächste Datei im Verzeichnis der aktuell geladenen Datei" nur mehr FindNext mit der vorher initiierten globalen Variable SearchRecord aufgerufen werden muss.
Vorteil:
a) FindNext findet nur real existierende Dateien (s. Nachteil 1a).
Nachteil:
b) Ebenso aufwändige Verwaltung, da irgendwann FindClose aufgerufen werden und immer wieder überprüft werden muss, ob SearchRecord noch geöffnet bzw. das Searchhandle noch gültig ist.

3. Meine ursprüngliche Absicht - die sich nun wohl als unrealistisch herausgestellt hat - war: Mit FindFirst nach der aktuell geladenen Datei suchen und dann FindNext mit der Dateimaske des gewünschten Dateityps ausführen:

Delphi-Quellcode:
// Prototyp:
function HoleNaechsteDatei: string;
var
  SR: TSearchRec;
begin
  SearchDir := VerzeichnisDerAktuellGeladenenDatei;
  if FindFirst(SearchDir + AktuellGeladeneDatei, faAnyFile, SR) = 0 then
  begin
    AendereDateimaske; // <<<<< nicht möglich!?
    if FindNext(SR) = 0 then
      DateiLaden(SR.Name);
    FindClose(SR);
  end;
end;
Welche Methode würdet ihr bevorzugen?

[Edit: Schreibfehler korrigiert]

Klaus01 21. Nov 2009 17:16

Re: Suchmaske nach FindFirst verändern?
 
Guten Abend,
vielleich geht es so?
Delphi-Quellcode:
// auch ein Prototyp:
function HoleNaechsteDatei: string;
var
  SR: TSearchRec;
begin
  SearchDir := VerzeichnisDerAktuellGeladenenDatei;
  if FindFirst(SearchDir + AktuellGeladeneDatei, faAnyFile, SR) = 0 then
  begin
    FindClose(SR);
    AendereDateimaske; // <<<<< nicht möglich!?
    if FindFirst(AndereDateimaske,faAnyFile,SR) = 0 then
    //if FindNext(SR) = 0 then
      DateiLaden(SR.Name);
    FindClose(SR);
  end;
end;

Grüße
Klaus

PeterPanino 21. Nov 2009 17:20

Re: Suchmaske nach FindFirst verändern?
 
Zitat:

Zitat von Klaus01
Guten Abend,
vielleich geht es so?

Leider nein - diese Funktion wird immer das selbe Ergebnis liefern ...

Mithrandir 21. Nov 2009 17:25

Re: Suchmaske nach FindFirst verändern?
 
Zitat:

Welche Methode würdet ihr bevorzugen?
Von der aktuell gefundenen Datei den Pfad abtrennen und damit ein neues FindFirst anstoßen. Vorher jedoch FindClose aufrufen. Zur Sicherheit den Dateinamen im Speicher halten, falls FindFirst als erstes Ergebnis die Originaldatei liefern sollte. Falls das der Fall sein sollte, mit FindNext die nächste Datei holen.

Weiß nicht, ob ich dich jetzt richtig verstanden habe... :gruebel:

PeterPanino 21. Nov 2009 17:30

Re: Suchmaske nach FindFirst verändern?
 
Zitat:

Zitat von Daniel G
Von der aktuell gefundenen Datei den Pfad abtrennen und damit ein neues FindFirst anstoßen. Vorher jedoch FindClose aufrufen. Zur Sicherheit den Dateinamen im Speicher halten, falls FindFirst als erstes Ergebnis die Originaldatei liefern sollte. Falls das der Fall sein sollte, mit FindNext die nächste Datei holen.

Meinst du den gleichen Vorschlag wie Klaus01? Das würde jedoch immer das selbe Ergebnis liefern, weil ein neues FindFirst (nach vorherigem FindClose) immer an der gleichen Stelle wie das vorherige FindFirst beginnt.

Mithrandir 21. Nov 2009 17:33

Re: Suchmaske nach FindFirst verändern?
 
Zitat:

Zitat von PeterPanino
Das würde jedoch immer das selbe Ergebnis liefern.

Nee, Klaus01 hatte vergessen, den Dateinamen Dateipfad im Speicher zu halten, und ggf. bei Übereinstimmung erneut FindNext aufzurufen. Dann ist das Ergebnis nicht mehr dasselbe. ;)

Aber vom Prinzip ist der Weg gleich ja, bis auf die Sache mit dem Namen Pfad und dem entsprechenden Vergleich.

himitsu 21. Nov 2009 17:43

Re: Suchmaske nach FindFirst verändern?
 
> Verzeichnisinhalt (gefiltert) auflisten
> Verzeichnisüberwachung einrichten
> > wird datei gelöscht, dann wird sie auch aus der Liste gelöscht (wenn sie da drinnen ist)
> > wird eine Datei erstellt/reinkopiert, dann wird sie mit der Suchmaske verlichen und wenn es stimmt, dann wird sie an die Liste angehängt

PeterPanino 21. Nov 2009 18:11

Re: Suchmaske nach FindFirst verändern?
 
Habe gerade den Vorschlag von Klaus01 und Daniel G probiert - funktioniert leider nicht:

Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin
  // Verzeichnis, das mehrere JPG-Dateien enthält:
  Form1.Caption := 'F:\test\test1.jpg';
end;

procedure TForm1.btnGetNextFileClick(Sender: TObject);
var
  SR: TSearchRec;
begin
  if FindFirst(Form1.Caption, faAnyFile, SR) = 0 then
  begin
    FindClose(SR);
    if FindFirst('F:\test\*.jpg', faAnyFile, SR) = 0 then
      Form1.Caption := 'F:\test\' + SR.Name;
    FindClose(SR);
  end;
end;

PeterPanino 21. Nov 2009 18:16

Re: Suchmaske nach FindFirst verändern?
 
Zitat:

Zitat von Daniel G
Nee, Klaus01 hatte vergessen, den Dateinamen Dateipfad im Speicher zu halten, und ggf. bei Übereinstimmung erneut FindNext aufzurufen. Dann ist das Ergebnis nicht mehr dasselbe. ;)

Aber dann wird halt mit FindNext immer wieder die selbe Datei gefunden!

Mithrandir 21. Nov 2009 18:23

Re: Suchmaske nach FindFirst verändern?
 
Jetzt hab ich erst gerafft, was du willst... :wall:

Der Vorschlag von Himi, mit der Überwachung des Verzeichnis, dürfte dich zum Ziel führen...


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:33 Uhr.
Seite 2 von 6     12 34     Letzte »    

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