Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi ParamStr komplette Verzeichnisse auswählen (https://www.delphipraxis.net/187033-paramstr-komplette-verzeichnisse-auswaehlen.html)

GroZ 22. Okt 2015 09:13

Delphi-Version: 7

ParamStr komplette Verzeichnisse auswählen
 
Hey, Ich hoffe mir kann jemand helfen. Mein Konsolenkonvertierer (FRP-PDF) ist soweit fertig. Ich kann aber derzeit nur einzelne Dateien umwandeln. Ich möchte aber Verzeichnisse, Ordner und Verzeichnisse + Unterordner konvertieren können. zum beispiel so: C:\Alte Dateien\FRP /DSub -> Dann soll er das komplette Verzeichnis konvertieren mit Unterordnern. Wie stell ich das am besten an?
Hier mein Code:
Delphi-Quellcode:
program Project2;

uses
  Forms, ShellApi, SysUtils, Graphics, Math,
   frxClass, frxExportPDF, FR_Class, PsFR_E_Main, PsFR_E_PDF;

{$AppType Console}
function FRPtoPDF(AFRPFile, APDFFile : string) : integer;
var
  frReport : TfrReport;
  PDFExport : TPsfrPDFExport;
begin
 Result := 1;
 if not fileexists(AFRPFile) then
  exit;
 if fileexists(APDFFile) then
  begin
    if not DeleteFile(APDFFile) then
     begin
      Result := 2;
      exit;
     end;
  end;


  frReport := TfrReport.Create(NIL);
  PDFExport := TPsfrPDFExport.Create(NIL);
  try
   PDFExport.ShowDialog := false;
   frReport.ShowProgress := false;
    try
     frReport.LoadPreparedReport(AFRPFile);
     frReport.ExportTo(PDFExport, APDFFile);
    except
     Result := 3;
     exit;
    end;


  finally
   PDFExport.Free;
   frReport.Free;

  end;
 Result := 0;
end;

var
  f : integer;
  eingabe : string;
begin
  Writeln(Paramstr(1));
  Writeln('////////////');    //unnötig
  f := FRPtoPDF(Paramstr(1),ChangeFileExt(Paramstr(1),'.pdf'));

   if f = 0 then
    Writeln('Konvertierung erfolgreich')
   else
    begin
     Writeln('Ein Fehler ist aufgetreten '+ IntToStr(F));
     Writeln('Geben sie /? ein fuer weitere Informationen');
    end;
  readln(eingabe); // Wegnehmen wenn fertig
  if eingabe = '/?' then
  begin
   Writeln('Fehlercode 1 - Verzeichnis existiert nicht oder ist falsch');
   Writeln('Fehlercode 2 - PDF wurde ersetzt');
   Writeln('Fehlercode 3 - Konvertierung fehlgeschlagen');
   Writeln('D= - Directory - Verzeichnis');
   Writeln('D= / Sub - Verzeichnis mit Unterordnern');
   Writeln('F= - File - Ordner');
   readln; // Wegnehmen wenn fertig
  end;

end.

baumina 22. Okt 2015 09:30

AW: ParamStr komplette Verzeichnisse auswählen
 
Schau dir mal dieses Tutorial an.

mm1256 22. Okt 2015 09:36

AW: ParamStr komplette Verzeichnisse auswählen
 
Hallo,

wie man die Commandline auswertet habe ich dir im anderen Thread schon gezeigt. Dazu noch der Link von Baumina, und du bist am Ziel.

Zu deinem Code. Schau dir auch nochmal den Try..Finally-Block an. Wenn du zwei constructoren aufrufst, dann solltest du diese besser innerhalb des try aufrufen.

Delphi-Quellcode:
try
  frReport := TfrReport.Create(NIL);
  PDFExport := TPsfrPDFExport.Create(NIL);
finylly
  PDFExport.Free;
  frReport.Free;
end;
Hintergrund: Wenn einer der beiden constructoren fehlschlägt, wird in jedem Fall mit Free wieder richtig aufgeräumt, weil Free auf "nil" prüft, und somit auch keine Exception wirft, wenn eine der beiden Instanzen nil ist.

GroZ 22. Okt 2015 09:48

AW: ParamStr komplette Verzeichnisse auswählen
 
Okay ich werd es mal probieren. Danke

Der schöne Günther 22. Okt 2015 10:24

AW: ParamStr komplette Verzeichnisse auswählen
 
Zitat:

Zitat von mm1256 (Beitrag 1319410)
Hintergrund: Wenn einer der beiden constructoren fehlschlägt, wird in jedem Fall mit Free wieder richtig aufgeräumt, weil Free auf "nil" prüft, und somit auch keine Exception wirft, wenn eine der beiden Instanzen nil ist.

Die Absicht ist richtig (Konstruktor vor dem try..finally-Block), die Begründung aber nicht :warn:

Wenn im Konstruktor eine Exception auftritt
- Wird der Destruktor ausgeführt
- Und die Exception anschließend weiter geworfen
- In den try..finally-Block kommt man somit erst gar nicht.


(Deshalb ist
Delphi-Quellcode:
Free()
sogar eigentlich unnötig da im try..finally-Block die Referenz niemals
Delphi-Quellcode:
nil
sein kann, ein
Delphi-Quellcode:
Destroy()
reicht völlig)

Sir Rufo 22. Okt 2015 10:29

AW: ParamStr komplette Verzeichnisse auswählen
 
ts, ts, ts, ...
Delphi-Quellcode:
procedure dofoo;
var
  foo: TFoo;
begin
  foo := TFoo.Create;
  try

    // work with foo

  finally
    foo.Free;
  end;
end;

// aber

procedure dofoobar;
var
  foo: TFoo;
  bar: TBar;
begin
  // lokale Variablen sind NICHT initialisiert,
  // also machen wir das mal
  foo := nil;
  bar := nil;
  try
    foo := TFoo.Create;
    bar := TBar.Create;
   
    // work with foo and bar

  finally
    foo.Free;
    bar.Free;
  end;
end;

GroZ 22. Okt 2015 10:50

AW: ParamStr komplette Verzeichnisse auswählen
 
Was ist ein TFoo? Konnte dazu in der OH nix finden..

p80286 22. Okt 2015 11:01

AW: ParamStr komplette Verzeichnisse auswählen
 
Zitat:

Zitat von GroZ (Beitrag 1319419)
Was ist ein TFoo? Konnte dazu in der OH nix finden..

das ist nur ein Platzhalter für einen nicht konkreten Typ so wie "TIrgendwas"

@sirRufo Was will uns der Dichter damit sagen?

Gruß
K-H

Sir Rufo 22. Okt 2015 11:26

AW: ParamStr komplette Verzeichnisse auswählen
 
Zitat:

Zitat von p80286 (Beitrag 1319421)
@sirRufo Was will uns der Dichter damit sagen?

Das war eine Antwort auf die Beiträge:
Zitat:

Zitat von mm1256 (Beitrag 1319410)
Zu deinem Code. Schau dir auch nochmal den Try..Finally-Block an. Wenn du zwei constructoren aufrufst, dann solltest du diese besser innerhalb des try aufrufen.

Delphi-Quellcode:
try
  frReport := TfrReport.Create(NIL);
  PDFExport := TPsfrPDFExport.Create(NIL);
finylly
  PDFExport.Free;
  frReport.Free;
end;
Hintergrund: Wenn einer der beiden constructoren fehlschlägt, wird in jedem Fall mit Free wieder richtig aufgeräumt, weil Free auf "nil" prüft, und somit auch keine Exception wirft, wenn eine der beiden Instanzen nil ist.

und
Zitat:

Zitat von Der schöne Günther (Beitrag 1319417)
Zitat:

Zitat von mm1256 (Beitrag 1319410)
Hintergrund: Wenn einer der beiden constructoren fehlschlägt, wird in jedem Fall mit Free wieder richtig aufgeräumt, weil Free auf "nil" prüft, und somit auch keine Exception wirft, wenn eine der beiden Instanzen nil ist.

Die Absicht ist richtig (Konstruktor vor dem try..finally-Block), die Begründung aber nicht :warn:

Wenn im Konstruktor eine Exception auftritt
- Wird der Destruktor ausgeführt
- Und die Exception anschließend weiter geworfen
- In den try..finally-Block kommt man somit erst gar nicht.


(Deshalb ist
Delphi-Quellcode:
Free()
sogar eigentlich unnötig da im try..finally-Block die Referenz niemals
Delphi-Quellcode:
nil
sein kann, ein
Delphi-Quellcode:
Destroy()
reicht völlig)

Denn zum echten Schutz vor einem MemLeak müsste es so lauten
Delphi-Quellcode:
frReport := nil;
PDFExport := nil;
try
  frReport := TfrReport.Create(NIL);
  PDFExport := TPsfrPDFExport.Create(NIL);
finally
  PDFExport.Free;
  frReport.Free;
end;

Olli73 22. Okt 2015 11:32

AW: ParamStr komplette Verzeichnisse auswählen
 
Zitat:

Zitat von p80286 (Beitrag 1319421)
@sirRufo Was will uns der Dichter damit sagen?

Ich bin zwar nicht Sir Rufo, antworte aber trotzdem mal...

Es geht darum, ein

Delphi-Quellcode:
procedure dofoobar;
var
   foo: TFoo;
   bar: TBar;
begin
   foo := TFoo.Create;
   try
     bar := TBar.Create;
     try
      // work with foo and bar
     finally
       bar.Free;  
     end;
   finally
     foo.Free;
   end;
end;
zu vereinfachen (= weniger Einrückungen/Verschachtelungen).

Das Thema hatten wir schon mal.

Edit: Zu spät. (Aber kein blauer Balken?!)


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:26 Uhr.
Seite 1 von 2  1 2      

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