![]() |
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:
Das ist die Prozedur.
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; 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 |
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.
|
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: |
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. |
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:
Danach gehst Du die Liste durch und versucht alle Dateien mit .pdf Erweiterung zu konvertieren.
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; |
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. |
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 |
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. |
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. |
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 12:56 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