Exception bei SelectDirectory und CD-Rom (E/A-Fehler 21)



  • Hallo an alle ...

    kann mir jemand bei folgendem Problem helfen :

    - Eine Form - ein Button - ein Editfeld -

    Der klick auf den Button löst folgenden Quellcode aus :

    #include <FileCtrl.hpp>
    
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
         const SELDIRHELP = 1000;
         AnsiString Dir = "C:\\";
         if (SelectDirectory(Dir, TSelectDirOpts() ,SELDIRHELP))
         Edit1->Text=Dir;
    }
    

    Der Code ist übrigens direkt so aus der Hilfe vom Borland.

    Der Dialog zum wählen eines Directorys wird geöffnet und ich klicke
    auf mein CD-Rom F: - in ihm befindet sich keine CD.

    Und nun wird eine Exception rausgeschmissen : E/A-Fehler 21

    Warum ? Wie bekomme ich die weg ? Ich habe es schon mit try / catch probiert, was aber auch nichts genutzt hat. Wäre schön wenn mir jemand sagen könnte, wie diese Fehlermeldung zu Stande kommt und besser : wie sie sich unterdrücken läßt ohne eine CD im Laufwerk haben zu müssen (dann kommt'se nämlich nich') ...

    Ach ja - Randdaten :

    System : W2KSP4 und XP Home (passiert auf beiden gleich)
    Code : Borland C++ Builder 5.0

    Vielen Dank und Grüße ... SirPaddy



  • versuchs mal mit folgender funktion:

    //---------------------------------------------------------------------------
    // Funktion versucht die Grösse eines Laufwerkes zu ermitteln
    // -> schlägt dieses fehl, so ist in diesem Laufwerk kein
    //    Datenträger (meist bei: floppy-, oder cd-rom-laufwerken)
    //---------------------------------------------------------------------------
    bool DiskInDrive(char Drive)
    {
      WORD ErrorMode;
      bool Result;
    
      Drive = UpCase(Drive);
    
      // zeichen ausserhalb des bereiches
      if ((Drive < 'A') || (Drive > 'Z')) return false;
    
      // ErrorMode setzen (unterdrücken von Fehlermeldungen)
      ErrorMode = SetErrorMode(SEM_FAILCRITICALERRORS | SEM_NOOPENFILEERRORBOX);
    
      try
      {
        // kann DiskSize ermittelt werden
        Result = DiskSize(Drive - 'A' + 1) != -1;
      }
      __finally
      {
        // ErrorMode zurücksetzen
        SetErrorMode(ErrorMode);
      }
    
      return Result;
    }
    


  • Pack eine ApplicationEvents-Komponente auf die Form (unter 'Zusätzlich' in der Komponentenpalette) und schreib in deren OnException-Event z.B.

    if (E->ClassNameIs("EInOutError"))
        ShowMessage("Fehler beim Öffnen des Gerätes (" + E->Message + ")");
    

    Wenn du die Exception stillschweigend abfangen willst dann tun es dort auch einfach ein Paar Kommentarzeichen .

    PS.
    Alternativ könntest du auch den modernen Ordnerdialog verwenden, der sieht nicht so potthässlich aus und die Exceptionproblematik hat sich auch gleich erledigt.

    String Dir = "", root = "";
      if (SelectDirectory("Ein Verzeichnis auswählen", WideString(root), Dir))
        Edit1->Text = Dir;
    


  • Vielen Dank, Sunday und Jansen - Ich werde das gleich mal in die Tat umsetzten.

    Gruß ... SirPaddy


Anmelden zum Antworten