SaveDialog1, speichern verhindern, wenn der Dateiname bereits geöffnet ist



  • Hi,
    ich habe einen Standard Speichern unter Dialog der jedoch kollidiert, wenn ich
    eine Datei (z.B. Test.csv) bereits geöffnet hab,
    und die Gleiche datei über meinen Speichern unter Dialog überschreiben will,...
    Wie kann ich sowas abfangen??

    void __fastcall TfrmMain::btnSaveClick(TObject *Sender)
    {
      SaveDialog1->FileName = FileName;
    
      SaveDialog1->InitialDir = ExtractFilePath(Application->ExeName);
      if (SaveDialog1->Execute())
      {
          TStringList * List = new TStringList();
    
          List->Add("Ausfahren");
          List->Add(" ");
          List->Add("Einfahren");
          //...
    
          List->SaveToFile(SaveDialog1->FileName);
    
          delete List;
    
          FileName = SaveDialog1->FileName;
      }
    }
    

    Danke und Gruß
    mx



  • Hallo

    Die Funktion FileExists verwenden? 😕

    bis bald
    akari



  • Danke für die schnelle Antwort,
    aber das ist nicht genau das was ich suche,...
    Ich will nicht prüfen ob eine Datei existiert, sondern ob diese offen ist oder nicht,...
    Wenn diese offen ist soll dann das speichern abgebrochen werden, somit
    stürzt das prog nicht mehr ab...

    Gruß



  • Hallo

    Dann zuerst mit FileExists schauen ob die Datei schon existiert, wenn ja, dann mit DeleteFile die Datei löschen. Kann die vorhandene Datei nicht gelöscht werden, dann wirst du wohl auch keine Schreibrechte mit TStringList bekommen.

    Alternativ must du mit std::fstream arbeiten da kannst du zuerst überprüfen ob du Schreibrechte bekommst.

    Oder du arbeitest mit try-catch, um die Exception bei SaveToFile abzufangen und entsprechend manuell zu behandeln.

    bis bald
    akari



  • Pack doch einfach einen try/catch-Block um SaveToFile und fang die Exception ab. Dann kannst du ja eine meldung rausgeben, dass das Schreiben jetzt nicht möglich ist.



  • Hi, danke,...

    ich hab das mit dem Try/catch ausprobiert, aber der stürzt immer noch ab, und führt meine Fehlermeldung nicht aus, was hab ich hier falsch??

    void __fastcall TfrmMain::btnSaveClick(TObject *Sender)
    {
      SaveDialog1->FileName = FileName;
    
      SaveDialog1->InitialDir = ExtractFilePath(Application->ExeName);
      if (SaveDialog1->Execute())
      {
          TStringList * List = new TStringList();
    
          List->Add("Ausfahren");
          List->Add(" ");
          List->Add("Einfahren");
    
          try
          {
            List->SaveToFile(SaveDialog1->FileName);
          }
          catch(EFOpenError&)
          {
              MessageDlg("Die Datei kann nicht gespeichert werden, da eine gleichnahmige Datei bereits geöffnet ist",
                          mtInformation, TMsgDlgButtons() << mbOK , 0 );
              delete List;
              return;
          }
          delete List;
    
          //RichEdit1->Lines->SaveToFile(SaveDialog1->FileName);
          FileName = SaveDialog1->FileName;
          //StatusBar1->Panels->Items[0]->Text = FileName;
      }
    }
    

    Gruß mx



  • sicher, dass es EFOpenError ist? Alternativ kannst du es mit catch(...) probieren, um alle Fehler abzufangen.

    greetz KN4CK3R



  • Hallo

    Die Exception wird im Builder normalerweise immer angezeigt, auch wenn im Programm eine try-catch-behandlung eingebaut ist (die danach ausgeführt wird). Teste dein Programm mal ohne IDE, dnan wirst du nur deine Behandlung sehen.

    bis bald
    akari



  • Beide Tipps sind die lösung

    das ... hatte ich schon ausprobiert allerdings kommt wieder ein Compilerfehler,...
    Wenn ich die .exe allerdings ohne Boarland ausführe gehts einwandfrei,...

    Vielen Dank,...
    gruß
    mx



  • KN4CK3R schrieb:

    sicher, dass es EFOpenError ist?

    Wahrscheinlich eher EFCreateError.


Anmelden zum Antworten