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.0Vielen 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