![]() |
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.
|
AW: Rekursiv Suchen
@Mod Erledigt hoffe das reicht so. Was anderes ist mir nicht eingefallen :lol:
@SirRufo mein Problem besteht ja darin das auch weiterhin nur einzelene Dateien konvertierbar sein müssen. Kann ich trotzdem eine generelle nehmen? |
AW: Rekursiv Suchen
Zitat:
Delphi-Quellcode:
Fertig => Ja, kann man (und vor allem sehr übersichtlich)
procedure ConvertFrpToPdf( const AFilename: string );
begin FrpToPdf( AFilename, ChangeFileExt( AFilename, '.pdf' ) ); end; procedure DoIt; begin ProcessFiles( 'C:\WoAuchImmer', '*.frp', ConvertFrpToPdf ); end; |
AW: Rekursiv Suchen
Zitat:
|
AW: Rekursiv Suchen
Zitat:
Delphi-Quellcode:
testen und nicht auf
<>0
Delphi-Quellcode:
und als Überschrift wäre "Dateien rekursiv suchen" noch besser.
=1
Gruß K-H |
AW: Rekursiv Suchen
Zitat:
|
AW: Rekursiv Suchen
Du warst nie und nimmer in einer Endlosschleife drin, denn deine if-Abfrage auf "PFAD/dir" hat verhindert, dass du jemals in die repeat-Schleife reinkommst, außer deine Eingabe lautete tatsächlich "PFAD/dir" und dieses Verzeichnis wird's wohl nicht geben.
|
AW: Rekursiv Suchen
Zitat:
und "PFAD" ist zum Beispiel "C:\Programme\Foo\Alt\usw" nicht das Wort Pfad :lol: |
AW: Rekursiv Suchen
Wie kannst du in der Endlosschleife drin sein, wenn er angeblich schreibt "Konvertierung erfolgreich". :gruebel:
|
AW: Rekursiv Suchen
Das "Konvertierung erfolgreich" kommt nur wenn ich
Delphi-Quellcode:
habe. Sprich da ist keine Endlosschleife. Die Endlosschleife kommt nur wenn ich
<> 0
Delphi-Quellcode:
nutze.
= 0
|
AW: Rekursiv Suchen
Dann hab ich wohl deinen Post #4 falsch interpretiert.
|
AW: Rekursiv Suchen
Da Du anscheinend mein Post (#5) nicht willst...
.. zerlege ich deinen Code von Post #1
Delphi-Quellcode:
Deine Routine findet ein Verzeichnis, keine Datei!
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 // Hier fehlt ein an den Parameter angehängtes '*.*' oder direkt '*.FRP', notwendig, damit FindFirst auch nach Files sucht repeat FRPzuPDF(Parameter,ChangeFileExt(Parameter,'.pdf')); // Hier sollte eigentlich was mit x.Name gemacht werden, sprich dem gefundenen Dateiname. In Parameter steht ja nur ein Verzeichnis und kein Dateiname !! until FindNext(X) = 1; //Hier kommt immer ne' Endlosschleife // Und wie schon mehrfach geschrieben '<> 0' finally FindClose(X); Writeln('Konvertierung erfolgreich'); end; end; Wenn deine Suche mit *.* gemacht würde, dann würde er Filenamen in X zurückgeben, sprich die Dateien, welche Du ja eigentlich konvertieren willst. Da Du diese aber nicht benutzt, passiert auch nichts. Er spring bei <> 0 direkt wieder raus, da er ja das Verzeichnis schon gefunden hat und kein weiteres (gleiches) findet.. So, jetzt schaust Du DIr mal die Funktion in meinem Post #5 oder den Post von Sir Rufo #8 an, da ist genau das hier geschriebene gemacht worden.. |
AW: Rekursiv Suchen
Mir leuchtet die if-Abfrage nicht ein, warum dann überhaupt eine Eingabe machen lassen, wenn es sowieso nur für das eine Verzeichnis gilt.
|
AW: Rekursiv Suchen
nene das ist nur zum testen ein festes Verzeichnis
Delphi-Quellcode:
Im Debug Modus ist er genau 8x die Prozedur durchgegangen also hat sozusagen geklappt. Aber die Dateien wurden nicht konvertiert. Ich schau mir jetzt die Prozedur nochmal an. Diese geht aber eigentlich.
var f : integer;
eingabe, Parameter : string; SearchRec : TSearchRec; begin writeln('FRP to PDF'); Writeln(''); Writeln('Verzeichnis eingeben:'); readln(eingabe); Parameter := 'C:\Dokumente und Einstellungen\jgross\Desktop\TestSpeichern\'; //Für Testzwecke -> Später noch ändern if eingabe = Parameter +'/dir' then begin if FindFirst(Parameter+'*.*', faDirectory, SearchRec) = 0 then try repeat if (SearchRec.Name <> '.') then FRPzuPDF(Parameter,ChangeFileExt(Parameter,'.pdf')); until FindNext(SearchRec)<> 0; //Hier kommt immer ne' Endlosschleife finally FindClose(SearchRec); Writeln('Konvertierung erfolgreich'); end; end; Ich glaube ich habe meinen Fehler gefunden. Die Prozedur möchte den genauen Namen zurück haben. Sie kriegt aber nur den Pfad ohne Dateinamen. |
AW: Rekursiv Suchen
Ein erster Schritt wäre wirklich mal, die Antwortbeiträge zu lesen.
Delphi-Quellcode:
Könnte helfen.
FRPzuPDF(Parameter,ChangeFileExt(x.Name,'.pdf'));
|
AW: Rekursiv Suchen
Zitat:
Delphi-Quellcode:
steht der Dateiname ohne Pfadangabe :warn:
TSearchRec.Name
|
AW: Rekursiv Suchen
Ich weiss, dass hier solche Vorschläge nicht gern gesehen sind. Aber vielleicht sollte der TE erstmal lernen, wie man 1) Code ordentlich einrückt, damit er leserlich ist und 2) den Debugger bedient, damit man sich nicht drei Seiten lang völlig lernresistent im Kreis bewegt und eine Copy & Paste-Lösung nach der anderen probiert und es immernoch nicht hinbekommt? Man man man ... :roll:
|
AW: Rekursiv Suchen
Liste der Anhänge anzeigen (Anzahl: 1)
Habe mithilfe eines Arbeitskollegens das Programm komplett umgeschrieben:
Bekomme jetzt eine Exception... Hier der Code:
Delphi-Quellcode:
Im Anhang ist die Exception...
program FRPtoPDF;
uses Forms, SysUtils, Math, ShellApi, frxClass, frxExportPDF, FR_Class, PsFR_E_Main, PsFR_E_PDF, Graphics; {$AppType Console} function FRPzuPDF(AFRPFile, APDFFile : string): boolean; var frReport : TfrReport; PDFExport : TPsfrPDFExport; begin Result := false; if not FileExists(AFRPFile) then exit; if FileExists(APDFFile) then if not DeleteFile(APDFFile) then exit; frReport := TFrReport.Create(NIL); PDFExport := TPsfrPDFExport.Create(NIL); try PDFExport.ShowDialog := false; frReport.ShowProgress := false; try frReport.LoadPreparedReport(AFRPFile); frReport.ExportTo(PDFExport, APDFFile); except exit; end; finally PDFExport.Free; frReport.Free; end; Result := true; end; function VerzeichnisMitFRPzuPDF(PfadUndDateimaske: string; SubDirs: boolean): boolean; var X : TSearchRec; Pfad: string; begin Result:=false; if FindFirst(PfadUndDateimaske, faAnyFile, X) = 0 then try repeat Write(ExtractFilePath(PfadUndDateimaske)+X.Name+' --> '+ChangeFileExt(ExtractFilePath(PfadUndDateimaske)+X.Name,'.pdf')+'...'); Result:=FRPzuPDF(ExtractFilePath(PfadUndDateimaske)+X.Name,ChangeFileExt(ExtractFilePath(PfadUndDateimaske)+X.Name,'.pdf')); if not Result then begin Writeln('Fehler!'); break; end else Writeln('OK'); until FindNext(X) <> 0; finally FindClose(X); end; if Result then begin if SubDirs then begin Pfad:=ExtractFilePath(PfadUndDateimaske); if FindFirst(Pfad+'*.*', faDirectory, X) = 0 then try repeat if (X.Name <> '.') and (X.Name <> '..') and ((X.Attr and faDirectory) <> 0) then begin Result:=VerzeichnisMitFRPzuPDF(ExtractFilePath(PfadUndDateimaske)+X.Name+'\'+ExtractFileName(PfadUndDateimaske),SubDirs); if not Result then break; end; until FindNext(X) <> 0; finally FindClose(X); end; end; end; end; var Parameter : string; SubDirs: boolean; begin Writeln('FRP to PDF'); if ParamCount<1 then exit; Parameter := ParamStr(1); if Copy(Parameter,Length(Parameter),1)<>'\' then Parameter:=Parameter+'\'; if ExtractFileName(Parameter)='' then Parameter:=Parameter+'*.FRP'; SubDirs:=(ParamCount>1) and (AnsiUpperCase(ParamStr(2))='/S'); // /S für SubDirectorys VerzeichnisMitFRPzuPDF(Parameter,SubDirs); end. |
AW: Rekursiv Suchen
Zitat:
Frage doch deinen Arbeitskollegen. Bitte beschäftige dich mit dem Debugger und wie man ihn verwendet! Ansonsten gibt's noch andere schöne Lehrstellen im handwerklichen Bereich, wo man mehr mit den Händen arbeitet. Kann auch sehr schön sein! |
AW: Rekursiv Suchen
Ich würde gerne wisssen wie ich die Exception löse. Mein Arbeitskollege ist auch überfragt...
Die Exception tritt auf wenn er in ein Unterverzeichnis möchte... |
AW: Rekursiv Suchen
Welche Zeile / Anweisung? Wie sind die Werte der Parameter? An welchem Datum ist Weihnachten? :roll:
|
AW: Rekursiv Suchen
Zitat:
Delphi-Quellcode:
Hier springt er im Debugmodus von repeat zu until.
repeat
if (X.Name <> '.') and (X.Name <> '..') and ((X.Attr and faDirectory) <> 0) then begin //Geht hier nicht rein Result:=VerzeichnisMitFRPzuPDF(ExtractFilePath(PfadUndDateimaske)+X.Name+'\'+ExtractFileName(PfadUndDateimaske),SubDirs); if not Result then break; end; until FindNext(X) <> 0; Dann kommt halt die Exception. Die Parameterwerte sind ein einfaches Verzeichnis 'C:\Files\FRP\2010\September' beispielsweise. Der Ordner besteht aus 8 FRP Dateien 1 Ordner in dem befinden sich 3 FRP Dateien und noch 1 Ordner der auch 3 FRP Dateien beinhaltet. Weihnachten ist am 24.12. :lol: |
AW: Rekursiv Suchen
EDIT : ** gelöscht **
|
AW: Rekursiv Suchen
Zitat:
Delphi-Quellcode:
ersetzt. Jetzt kommt zwar keine Exception aber er schließt einfach.
= 0
Sprich das Unterverzeichnis wird immer noch nicht angerührt |
AW: Rekursiv Suchen
Zitat:
Wie sieht denn dein Call Stack aus? Ungefähr so?
Code:
:77712312 ntdll.RtlEnterCriticalSection + 0x12
:758ca25d KERNELBASE.FindNextFileW + 0x46 :00420704 FindNext + $10 FRPtoPDF.FRPtoPDF :76f5337a kernel32.BaseThreadInitThunk + 0x12 :77729882 ntdll.RtlInitializeExceptionChain + 0x63 :77729855 ntdll.RtlInitializeExceptionChain + 0x36 |
AW: Rekursiv Suchen
Zitat:
|
AW: Rekursiv Suchen
Zitat:
Schaue mal in diesen kostenlosen PDF auf Seite 147: ![]() Wenn du das Fenster nicht kennst dann probiere doch mal in der IDE Menü -> Ansicht -> Debug Fenster -> Aufruf-Stack. |
AW: Rekursiv Suchen
Muss ich das irgendwie aktivieren? Weil bei mir steht nur "Auf den Prozess kann nicht zugegriffen werden"
Oder mache ich etwas falsch? |
AW: Rekursiv Suchen
Zitat:
Also NICHT im "Programmiermodus" (normales Layout). |
AW: Rekursiv Suchen
bin anscheinend zu doof dazu...
sobald ich das Programm starte geht das Fenster weg und erst wenn ich STRG+F2 drücke nach der Exception kommt das wieder. Trotzdem steht da noch nix drin.. |
AW: Rekursiv Suchen
Also ich denke, dass wenn du z.B. nach "C:\temp\*.FRP" mit FindNirst/FindNext suchst, dass du die Unterverzeichnisse damit nicht erwischen kannst.
Deine repeat-Schleife müsst eigentlich ohne Exception durchlaufen. Die Exception kann ich mir eigenlich nur bei diesem Block vorstellen:
Delphi-Quellcode:
Hier mal nen Haltepunkt und mit F8 durchsteppen.
try
PDFExport.ShowDialog := false; frReport.ShowProgress := false; try frReport.LoadPreparedReport(AFRPFile); frReport.ExportTo(PDFExport, APDFFile); except exit; end; finally PDFExport.Free; frReport.Free; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:35 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