AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Prüfen, ob Diskette in A

Ein Thema von CalganX · begonnen am 7. Feb 2003 · letzter Beitrag vom 7. Feb 2003
Antwort Antwort
CalganX

Registriert seit: 21. Jul 2002
Ort: Bonn
5.403 Beiträge
 
Turbo Delphi für Win32
 
#1

Prüfen, ob Diskette in A

  Alt 7. Feb 2003, 18:02
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...
Angehängte Grafiken
Dateityp: bmp Problem_DiskInA.bmp (218,4 KB, 24x aufgerufen)
  Mit Zitat antworten Zitat
jbg

Registriert seit: 12. Jun 2002
3.483 Beiträge
 
Delphi 10.1 Berlin Professional
 
#2
  Alt 7. Feb 2003, 18:05
Mit der WinAPI SetErrorMode kannst du diesen Dialog abschalten.
Delphi-Quellcode:
OldErrorMode := SetErrorMode(SEM_FAILCRITICALERRORS);
try
  // hier deine Abfrage
finally
  SetErrorMode(OldErrorMode);
end;
  Mit Zitat antworten Zitat
CalganX

Registriert seit: 21. Jul 2002
Ort: Bonn
5.403 Beiträge
 
Turbo Delphi für Win32
 
#3
  Alt 7. Feb 2003, 18:07
Super! Funktioniert problemlos.

Chris
  Mit Zitat antworten Zitat
Benutzerbild von NeoDeluxe
NeoDeluxe

Registriert seit: 4. Dez 2002
Ort: Behind the Firewall
240 Beiträge
 
Delphi 7 Personal
 
#4
  Alt 7. Feb 2003, 18: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]
Alex
  Mit Zitat antworten Zitat
CalganX

Registriert seit: 21. Jul 2002
Ort: Bonn
5.403 Beiträge
 
Turbo Delphi für Win32
 
#5
  Alt 7. Feb 2003, 18: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
  Mit Zitat antworten Zitat
Benutzerbild von NeoDeluxe
NeoDeluxe

Registriert seit: 4. Dez 2002
Ort: Behind the Firewall
240 Beiträge
 
Delphi 7 Personal
 
#6
  Alt 7. Feb 2003, 18:39
Jup. Wärend ich geschrieben habe, hast du schon beantwortet und ich konnte das nicht sehn , weil es solange gedauert hat. Trotzem Bitte!
Alex
  Mit Zitat antworten Zitat
CalganX

Registriert seit: 21. Jul 2002
Ort: Bonn
5.403 Beiträge
 
Turbo Delphi für Win32
 
#7
  Alt 7. Feb 2003, 18:50
Trotzdem danke
  Mit Zitat antworten Zitat
CalganX

Registriert seit: 21. Jul 2002
Ort: Bonn
5.403 Beiträge
 
Turbo Delphi für Win32
 
#8
  Alt 7. Feb 2003, 20: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
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.116 Beiträge
 
Delphi 11 Alexandria
 
#9
  Alt 7. Feb 2003, 20: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.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
CalganX

Registriert seit: 21. Jul 2002
Ort: Bonn
5.403 Beiträge
 
Turbo Delphi für Win32
 
#10
  Alt 7. Feb 2003, 20:57
Super! Funktioniert nun wieder problemlos!

Chris
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:37 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz