Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Prüfen, ob Diskette in A (https://www.delphipraxis.net/2797-pruefen-ob-diskette.html)

CalganX 7. Feb 2003 17:02


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:
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;
@Luckie: habe das ganze ein wenig auf nonVCL geändert und ShowMessages rausgenommen.
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...

jbg 7. Feb 2003 17:05

Mit der WinAPI SetErrorMode kannst du diesen Dialog abschalten.
Delphi-Quellcode:
OldErrorMode := SetErrorMode(SEM_FAILCRITICALERRORS);
try
  // hier deine Abfrage
finally
  SetErrorMode(OldErrorMode);
end;

CalganX 7. Feb 2003 17:07

Super! Funktioniert problemlos.

Chris

NeoDeluxe 7. Feb 2003 17:21

moin, wie wärs mit

Delphi-Quellcode:
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;
[edit=Daniel B]Delphi-Tags gesetzt. Neo, Bitte selbst benutzen, nicht code oder quote für Quelltext. Vielen Dank. MfG Daniel B.[/edit]

CalganX 7. Feb 2003 17:36

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

NeoDeluxe 7. Feb 2003 17:39

Jup. Wärend ich geschrieben habe, hast du schon beantwortet und ich konnte das nicht sehn :wink: , weil es solange gedauert hat. Trotzem Bitte!

CalganX 7. Feb 2003 17:50

Trotzdem danke

CalganX 7. Feb 2003 19:44

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:
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;
Allerdings sind da die Nummern falsch. Hat jemand eine Idee?

Chris

Christian Seehase 7. Feb 2003 19:54

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.

CalganX 7. Feb 2003 19:57

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