Delphi-PRAXiS
Seite 1 von 6  1 23     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Rekursiv Suchen (https://www.delphipraxis.net/187222-rekursiv-suchen.html)

GroZ 9. Nov 2015 12:54

Delphi-Version: 7

Rekursiv Suchen
 
Hey,
Ich habe ein Problem.
Mein Konverter ist immer noch nicht fertig.
Mein Problem ist ganz einfach eigentlich aber ich komme dennoch nicht weiter.
Delphi-Quellcode:
var f : integer;
    eingabe, Parameter : string;
    X : TSearchRec;
begin
  writeln('FRP to PDF');
  Writeln('');
  Writeln('Verzeichnis eingeben:');
  readln(eingabe);
  Parameter := 'PFAD';
  if eingabe = Parameter +'/dir' then
    begin
      Writeln(Parameter);
      if FindFirst(Parameter, faAnyFile, X) = 0 then try
    repeat
      FRPzuPDF(Parameter,ChangeFileExt(Parameter,'.pdf'));
    until FindNext(X) = 1; //Hier kommt immer ne' Endlosschleife
  finally
    FindClose(X);
    Writeln('Konvertierung erfolgreich');
    end;
end;
Das ist die Prozedur.
Mein Problem ist das er in dem Ordner die Dateien nicht konvertiert. Sprich er öffnet nur den Ordner und probiert dann "nix" zu konvertieren. Könnt ihr mir helfen?
Danke im Vorraus

baumina 9. Nov 2015 13:00

AW: Erneute Hilfe
 
FindNext ist 0 wenns klappt, ansonsten liefert dir Findnext den Fehlercode zurück. Du fragst auf 1 ab, d.h. er bricht nur ab, wenn der Fehlercode 1 ist. Besser wäre auf <> 0 abzufragen.

haentschman 9. Nov 2015 13:03

AW: Erneute Hilfe
 
Hallöle...:P

auf den ersten Blick fehlen end´s zum begin und das repeat steht wahrscheinlich falsch. Um dir exakt helfen zu können schreibe mal in Prosa wie du dir den Ablauf vorstellst ohne auf den Quelltext zu gucken. :thumb:

GroZ 9. Nov 2015 13:04

AW: Erneute Hilfe
 
Das hab ich natürlich probiert. Jedoch das selbe Ergebnis. Kommt keine Fehlermeldung er hat halt ne Endlosschleife

Also ablaufen sollte das ganze so:

Konsole öffnen:

'Pfad eingeben' + /dir
Enter
Konvertierungsprozedur
wiederholen bis komplette Verzeichnis konvertiert ist.

HolgerX 9. Nov 2015 13:08

AW: Erneute Hilfe
 
Hmm..

Da sind mehrere Fehler drinnen..

Und da ich nicht jeden einzelnd erklären will, hier mal eine Funktion, welche Dir alle Dateien eines Verzeichnisses auflistet:

Delphi-Quellcode:
procedure GetFileList(APath : string;AList : TStrings;WithSubPath : boolean);
var
  sr: TSearchRec;
  tmpPath : string;
begin
  tmpPath := IncludeTrailingPathDelimiter(APath);
  if FindFirst(tmpPath+'*.*', faAnyFile, sr) = 0 then begin
    repeat
      if (sr.Attr or faDirectory) = sr.Attr then begin
        if WithSubPath then begin
          if (sr.Name[1] <> '.') then
            GetFileList(tmpPath+sr.Name,AList,WithSubPath);
        end;
      end else begin
        AList.Add(tmpPath + sr.Name);
      end;
    until FindNext(sr) <> 0;
    FindClose(sr);
  end;
end;
Danach gehst Du die Liste durch und versucht alle Dateien mit .pdf Erweiterung zu konvertieren.

baumina 9. Nov 2015 13:08

AW: Erneute Hilfe
 
Achso, interessanterweise machst du mit dem gefundenen TSearchRec X gar nichts.

In die repeat-Schleife kommt er nur, wenn die Eingabe genau "PFAD/dir" lautete.

GroZ 9. Nov 2015 13:11

AW: Erneute Hilfe
 
Was müsste ich denn da vorher noch "deklarieren"?
Hab in der OH geguckt das einzige was für mich relevant wäre, wäre FileName und der ist immer unterschiedlich. Bei meinen Testordner zum Beispiel Folien1-10

Sir Rufo 9. Nov 2015 13:49

AW: Erneute Hilfe
 
Ich würde mir schon mal gar keine spezielle Routine dafür bauen, sondern eine generelle und diese dann verwenden. Dann wird auch der gesamte Code übersichtlicher.

Hier etwas zum Herumspielen
Delphi-Quellcode:
program Project1;

{$APPTYPE CONSOLE}
{$R *.res}

uses
  SysUtils;

type
  TProcessFileCallback = procedure( const AFilename: string );

procedure ProcessFiles( const ADirectory, ASearchPattern: string; ACallback: TProcessFileCallback; AAttr: Integer = faAnyFile; ARecursive: Boolean = False );
var
  SearchRec: TSearchRec;
begin
  // Dateien suchen
  if FindFirst( IncludeTrailingPathDelimiter( ADirectory ) + ASearchPattern, AAttr, SearchRec ) = 0
  then
    try
      repeat
        ACallback( IncludeTrailingPathDelimiter( ADirectory ) + SearchRec.Name );
      until FindNext( SearchRec ) <> 0;
    finally
      FindClose( SearchRec );
    end;

  // Wenn rekursiv
  if ARecursive
  then // dann
    begin
      // Verzeichnisse suchen
      if FindFirst( IncludeTrailingPathDelimiter( ADirectory ) + '*.*', faDirectory, SearchRec ) = 0
      then
        try
          repeat
            if ( SearchRec.Name <> '.' ) and ( SearchRec.Name <> '..' )
            then
              ProcessFiles( IncludeTrailingPathDelimiter( ADirectory ) + SearchRec.Name, ASearchPattern, ACallback, AAttr, ARecursive );
          until FindNext( SearchRec ) <> 0;
        finally
          FindClose( SearchRec );
        end;
    end;
end;

procedure ProcessSomeFiles( const AFilename: string );
begin
  // Hier erledigen wir die eigentliche Arbeit
  WriteLn(AFilename);
end;

procedure Test;
begin
  WriteLn('=== STARTING ===');
  ProcessFiles( 'C:\Users', '*.png', ProcessSomeFiles, faAnyFile, True );
  WriteLn('=== FINISHED ===');
end;

begin
  try
    Test;
  except
    on E: Exception do
      Writeln( E.ClassName, ': ', E.Message );
  end;

end.

Phoenix 9. Nov 2015 13:51

AW: Erneute Hilfe
 
@GroZ wärest Du bitte so freundlich und editierst nochmal Deinen ersten Beitrag und gibst ihm einen Aussagekräftigen Titel?
Mit "Erneute Hilfe" kann keiner was anfangen und es wäre schade, wenn wir das Thema wegen einem extrem schlecht gewählten Titel zu machen zu müssen.

Danke.

Luckie 9. Nov 2015 13:53

AW: Erneute Hilfe
 
Bitte gib deinen Beiträgen in Zukunft aussagekräftige Titel, in denen deutlich wird, um was es geht.


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:49 Uhr.
Seite 1 von 6  1 23     Letzte »    

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