Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Hilfe bei Fehlerbehandlung gesucht (in Zusammenhang mit DriveComboBox)

10 views
Skip to first unread message

Peter Dassow

unread,
Nov 8, 2020, 11:34:54 AM11/8/20
to
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

unread,
Nov 8, 2020, 11:50:53 AM11/8/20
to
Am 08.11.2020 um 17:34 schrieb 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

unread,
Nov 8, 2020, 1:54:52 PM11/8/20
to
On 08.11.20 17:34, Peter Dassow wrote:
> 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

unread,
Nov 8, 2020, 4:16:26 PM11/8/20
to
Am 08.11.2020 um 19:54 schrieb retired developer:
> On 08.11.20 17:34, Peter Dassow wrote:
>> 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
>

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.
0 new messages