Discussion:
Hilfe bei Fehlerbehandlung gesucht (in Zusammenhang mit DriveComboBox)
(zu alt für eine Antwort)
Peter Dassow
2020-11-08 16:34:53 UTC
Permalink
Hallo, suche Hilfe beim Abfangen eines nicht setzbaren Laufwerks.
Es soll versucht werden, Laufwerk D: anzusprechen.
Wenn Laufwerk D: nicht existiert, soll der Benutzer mit Hilfe einer
Abfrage die Möglichkeit bekommen, ein USB-Memory-Stick zu benutzen (so
dass dann nach dem Einstecken Laufwerk D: existiert).
Der Refresh der DriveComboBox geschieht mit dem erneuten Zuweisen des
Attributs textcase.
Leider wird genau einmal der Fehler abgefangen, wenn der User 'Ja'
anwählt, und der Refresh stattfindet, läuft das Programm in eine
Fehlermeldung ohne erneute Fehlerbehandlung.

Im Ereignis OnCreate des Formulars Form1 steht folgendes:

var confirm:Integer;
is_successful:Boolean;

Begin
confirm:=mrYes;
is_successful:=False;
while (is_successful=False) AND (confirm=mrYes) do

begin
Try
{ try to set the drive to D: }
DriveComboBox1.Drive:='d';
DriveComboBox2.Drive:='d';
FileListBox1.Drive:='d';
is_successful:=True;
confirm:=mrNo; { if this statement is reached, no need to ask
again }
Except
confirm:=MessageDlg('There is no drive D:
!'+Chr(13)+Chr(10)+'Connect an USB storage drive.'
+Chr(13)+Chr(10)+'If confirmed, a retry will be
started.' ,mtError,[mbYes,mbNo],0);
is_successful:=False;
End;

if (confirm=mrNo) and (is_successful=False) then
{ only in case of it wasn't successful the user's choice is
important }
{ the user don't like to go on, so terminate the application
immediately }
Begin
Application.Terminate;
Exit;
End;
{ in any case a refresh of the DriveComboBox can be done now }
{ if it isn't successful,
with DriveComboBox1 do
textcase := textcase; { that should enforce the refresh of the
DriveComboBox }

End; { end of while loop }

End;

Gewollt ist, dass nach dem Beantworten mit 'Ja' erneut versucht wird,
auf das Laufwerk D: zu wechseln.
Wo muss der textcase-Refresh hin, damit die Fehlerbehandlung erneut wirkt ?
Peter Dassow
2020-11-08 16:50:53 UTC
Permalink
Post by Peter Dassow
Hallo, suche Hilfe beim Abfangen eines nicht setzbaren Laufwerks.
Es soll versucht werden, Laufwerk D: anzusprechen.
Wenn Laufwerk D: nicht existiert, soll der Benutzer mit Hilfe einer
Abfrage die Möglichkeit bekommen, ein USB-Memory-Stick zu benutzen (so
dass dann nach dem Einstecken Laufwerk D: existiert).
Der Refresh der DriveComboBox geschieht mit dem erneuten Zuweisen des
Attributs textcase.
Gewollt ist, dass nach dem Beantworten mit 'Ja' erneut versucht wird,
auf das Laufwerk D: zu wechseln.
Wo muss der textcase-Refresh hin, damit die Fehlerbehandlung erneut wirkt ?
Mann muss nur darüber reden/schreiben, dann fällt einem die Lösung auch
selbst ein. Die "with DriveComboBox1 do" Anweisung muss gleich dem Try
in der while-Schleife folgen, der eigentlich unnötige erste Refresh von
DriveComboBox1 ist nicht weiter schlimm. Jetzt funktioniert es so, wie
ich es wollte.
retired developer
2020-11-08 18:54:51 UTC
Permalink
Post by Peter Dassow
Hallo, suche Hilfe beim Abfangen eines nicht setzbaren Laufwerks.
Es soll versucht werden, Laufwerk D: anzusprechen.
Warum so kompliziert?

Sei WinXP bzw. Delphi7 gibt es:

https://docs.microsoft.com/en-us/windows/win32/api/fileapi/nf-fileapi-getlogicaldrives

--- schnipp ---
var driveIndex: Integer;

driveIndex:= 8;
if (GetLogicalDrives and driveIndex) = 0
then // Laufwerk nicht vorhanden
else // Laufwerk vorhanden

--- schnapp ---

wobei driveIndex ist: 1=A, 2=B, 4=C, 8=D, usw.

Ist doch viel einfacher, oder?

Gruesse
Julius
--
An old Windows has old security holes.
A new Windows has new security holes.
Another OS has other security holes.
For safety you must care yourself.
Peter Dassow
2020-11-08 21:16:25 UTC
Permalink
Post by retired developer
Post by Peter Dassow
Hallo, suche Hilfe beim Abfangen eines nicht setzbaren Laufwerks.
Es soll versucht werden, Laufwerk D: anzusprechen.
Warum so kompliziert?
https://docs.microsoft.com/en-us/windows/win32/api/fileapi/nf-fileapi-getlogicaldrives
--- schnipp ---
var driveIndex: Integer;
driveIndex:= 8;
if (GetLogicalDrives and driveIndex) = 0
    then // Laufwerk nicht vorhanden
    else // Laufwerk vorhanden
--- schnapp ---
wobei driveIndex ist: 1=A, 2=B, 4=C, 8=D, usw.
Ist doch viel einfacher, oder?
Gruesse
Julius
Nein. Die Aufgabe war nicht, herauszufinden ob es ein Laufwerk gibt oder
nicht. Sondern das, selbst wenn es ein Laufwerk C: gibt, der Benutzer
keins anwählen kann. Die Annahme war, das Betriebssystem ist immer auf
C:, daher soll er darauf kein Zugriff haben.
Alle anderen Laufwerke soll er aber durchaus anwählen können.
Später (bei OnChange) frage ich dann ab, ob jemand C: ausgewählt hat,
wenn er das tut, kriegt er eine Warnung und es wird wieder auf D:
zurückgewechselt.

Loading...