Problem beim speichern eines JPG mit SaveToFile()



  • Hi,

    ich habe ein kleines Problem mit dem Speichern eines JPG. Ich benutze dazu SaveToFile(). Zuerst einmal der Code:

    void SaveGraph (AnsiString info)
    {
      AnsiString    FileName;
    
      TJPEGImage *jp = new TJPEGImage();
    
      //Pfad und Dateiname festlegen
      FileName =  PD.FileData.Reportpfad + PD.FileData.ReportFile;
      FileName += "\\" + info + ".jpg";
    
      //Zu speichernden Bereich auswählen
      MainWin->Oszi->Refresh();
      MainWin->Oszi->Canvas->
          CopyRect(Rect(0, 0, MainWin->Oszi->Width, MainWin->Oszi->Height),
                   MainWin->Canvas,
                   Rect(MainWin->Oszi->Left,
                        MainWin->Oszi->Top,
                        MainWin->Oszi->Left + MainWin->Oszi->Width,
                        MainWin->Oszi->Top + MainWin->Oszi->Height)  );
    
      jp->Assign(MainWin->Oszi->Picture->Bitmap);
    
      try
        {
        jp->SaveToFile(FileName);
        }
      __finally
        {
        delete jp;
        }
    }
    

    Prinzipiell funktioniert alles, der Bereich des Bildschirmes den ich mit CopyRect auswähle wird als JPG gespeichert.
    Das Problem tritt auf wenn es den Pfad in FileName nicht gibt. Dann bleibt das Programm in der Zeile

    jp->SaveToFile(Filename)
    

    stehen....keine Fehlermeldung, keine Exception die ich abfangen könnte, nix geht mehr.
    Irgendwelche Vorschläge was ich machen könnte dass es nicht zum Absturz kommt?

    Grüße,
    Jochen



  • Warum prüfst Du nicht, ob das Verzeichnis bereits existiert und legst es notfalls an?

    Siehe DirectoryExists und ForceDirectories.



  • Joe_M. schrieb:

    Warum prüfst Du nicht, ob das Verzeichnis bereits existiert und legst es notfalls an?

    hilft in meinem Fall nicht wirklich: Das Zielverzeichnis wird vom Programm selbst zu einem früheren Zeitpunkt erstellt, existiert dann also sicher. Allerdings liegt dieses Verzeichnis auf einem Netzlaufwerk. Das Netzwerk als solches ist ab und zu ziemlich lahm. Das heisst in dem Moment wo ich die Datei speichern will, ist das Verzeichnis für das Programm nicht vorhanden. Auch das vorherige prüfen ob das Verzeichnis vorhanden ist, ist keine Sicherheit dass dies einen kurzen Moment später beim eigentlichen Zugriff immer noch so ist.

    Eigentlich dachte ich, dass ich durch das Anwenden von try eben solche Fälle abfangen kann...

    Grüße,



  • Na wenn try, dann so:

    ...
    TJPEGImage *jp;
    AnsiString FileName;
    
    try
    {
       jp = new TJPEGImage();
    
       try
       {
          jp->SaveToFile(FileName);
       }
       catch ( Exception &E )
       {
             // shit happens
             MessageDlg("Fehler beim Speichern!", mtError, TMsgDlgButtons() << mbOK, 0);
       }
    }
    __finally
    {
       if (jp) delete jp;
    }
    
    ...
    


  • Jep, jetzt funktioniert das.

    🙂 DANKE 🙂

    Grüße,
    Jochen



  • Ganz sicher, dass dein Problem damit behoben ist? Denn funktional gibt es keinen Unterschied zu deinem ursprünglichen Code.



  • Jansen schrieb:

    Ganz sicher, dass dein Problem damit behoben ist? Denn funktional gibt es keinen Unterschied zu deinem ursprünglichen Code.

    Ja, ich bin sicher. Es gibt einen funktionalen Unterschied: bei beinem ursprünglichen Code stürzt das Program ab, beim anderen nicht. Wenn ich absichtlich ein Verzeichnis angebe das nicht existiert, ist das jederzeit reproduzierbar.

    Jochen



  • JoKo schrieb:

    Wenn ich absichtlich ein Verzeichnis angebe das nicht existiert, ist das jederzeit reproduzierbar.

    Kann ich eben nicht nachvollziehen. Bei meinen Tests wird bei fehlerhaftem Pfad zuverlässig eine EFCreateError-Exception ausgelöst, die sich problemlos abfangen lässt. Und das unabhängig davon, ob catch oder __finally verwendet wird.


Anmelden zum Antworten