![]() |
Prüfen, ob Diskette in A
Liste der Anhänge anzeigen (Anzahl: 1)
Hi,
habe folgendes Problem: ich will prüfen, ob eine Diskette in Laufwerk A:\ ist. Allerdings darf, wenn keine eingelegt ist, kein Fehler kommen. Ich habe folgenden Source von Luckie bekommen:
Delphi-Quellcode:
@Luckie: habe das ganze ein wenig auf nonVCL geändert und ShowMessages rausgenommen.
function DiskInDriveA: Boolean;
var sRec: TSearchRec; i: Integer; Drive : Char; begin Drive := 'A'; Result := False; {$I-} i := FindFirst(Drive + ':\*.*', faAnyFile, sRec); FindClose(sRec); {$I+} case i of 0 : Result := True; 2, 18: begin Result := True; end; 21, 3: Result := false; end; end; Das Problem ist, dass beim Starten des Programms der im Anhang befindliche Fehler kommt, wenn keine Diskette drin ist. Eben dieser soll nicht kommen. Hat jemand eine (oder mehrere) Idee(n)? Chris PS: Achja, die Lösung sollte nonVCL sein. Aber wenn nicht, ist auch nicht schlimm... Kann ich ja umprogrammieren... |
Mit der WinAPI SetErrorMode kannst du diesen Dialog abschalten.
Delphi-Quellcode:
OldErrorMode := SetErrorMode(SEM_FAILCRITICALERRORS);
try // hier deine Abfrage finally SetErrorMode(OldErrorMode); end; |
Super! Funktioniert problemlos.
Chris |
moin, wie wärs mit
Delphi-Quellcode:
[edit=Daniel B]Delphi-Tags gesetzt. Neo, Bitte selbst benutzen, nicht code oder quote für Quelltext. Vielen Dank. MfG Daniel B.[/edit]
function DiskInDrive(lw:Char; Statusanzeige:boolean): boolean;
var sRec:TSearchRec; i:Integer; begin result:=False; {$I-} i:=FindFirst(lw + ':\*.*', faAnyfile, SRec); FindClose(SRec); {$I+} case i of 0 : result :=True; //Diskette mit Dateien 2, 18 : begin if Statusanzeige then showmessage('Diskette im Laufwerk ' + lw + ' ist leer!'); //(hier kannst du deine Funktion schreiben!) Result := True; end; 21,3 : if Statusanzeige then Showmessage('Keine Diskette im Laufwerk ' + lw); else if Statusanzeige then Showmessage('Diskette nicht formiatiert!' + IntToStr(i)); //falls du sowas brauchst! end; |
Das war ja genau, dass was ich hatte. Nur habe ich die ShowMessage-Sachen herausgenommen, weil ich dir sowieso nicht brauchte. Desweiteren habe ich ja gesagt, dass jetzt alles läuft...
Chris |
Jup. Wärend ich geschrieben habe, hast du schon beantwortet und ich konnte das nicht sehn :wink: , weil es solange gedauert hat. Trotzem Bitte!
|
Trotzdem danke
|
So, nun will ich das ganze nach nonVCL kopieren und da gibts schon die ersten Problem. Als Hinweis: du Unit SysUtils ist nicht mehr dabei. Nun ist folgender Source:
Delphi-Quellcode:
Allerdings sind da die Nummern falsch. Hat jemand eine Idee?
function DiskInDrive(Drive: Char): Boolean;
var OldErrorMode: Cardinal; Find: THandle; Data: TWin32FindData; begin OldErrorMode := SetErrorMode(SEM_FAILCRITICALERRORS); try Result := False; {$I-} Find := FindFirstFile(PChar(Drive + ':\*.*'), Data); Windows.FindClose(Find); {$I+} case Find of 0 : Result := True; 2, 18: begin Result := True; end; 21, 3: Result := false; end; // hier deine Abfrage finally SetErrorMode(OldErrorMode); end; end; Chris |
Moin Chris,
da FindFirst einen Windows Fehlercode zurückgibt, oder 0 bei Erfolg, und FindFirstFile ein SearchHandle (INVALID_HANDLE_VALUE bei Misserfolg), ist es ja nur logsich, dass die Werte nicht Stimmen. Die würden im Fehlerfalle stimmen, wenn Du sie dann mit GetLastError ermittelst. Du musst also unmittelbar nach FindFirstFile das Handle prüfen. Ist es ungültig hat's nicht geklappt und FileClose ist dann auch nicht notwendig. Dafür kannst Du dann mit GetLastError prüfen, was denn nun genau schiefgegangen ist. Wenn Dich das nicht weiter interessiert, kannst Du die gesamte folgende Prüfung auch weglassen (ausser eben Prüfung des Handles). PS: Das {$I-}/{$I+} kannst Du auch streichen: die APIs lösen keine Pascal I/O-Exceptions aus. |
Super! Funktioniert nun wieder problemlos!
Chris |
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:52 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz