Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Lazarus (IDE) (https://www.delphipraxis.net/81-lazarus-ide/)
-   -   Wie Fehler bzw. Rückgabewert False abfangen? (https://www.delphipraxis.net/185641-wie-fehler-bzw-rueckgabewert-false-abfangen.html)

AlexII 26. Jun 2015 13:47

Wie Fehler bzw. Rückgabewert False abfangen?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,

ich möchte mit dieser Zeile prüfen, ob ein Wechseldatenträger beschreibbar ist:

Delphi-Quellcode:
ForceDirectoriesUTF8(RemovableDriveList.Strings[0] + 'test');
Nun stecke ich eine gelockte SD-Karte ein und bekomme den Fehler, dass die Karte schreibgeschützt ist (ist auch logisch), siehe Screenshot.
Aber wie fange ich diese Windowsmeldung ab? Diese zwei Möglichkeiten machen es nicht:

Delphi-Quellcode:
try
  ForceDirectoriesUTF8(RemovableDriveList.Strings[0] + 'test');
except
end;

// oder

if not ForceDirectoriesUTF8(RemovableDriveList.Strings[0] + 'test') then ;
Der Windowsfehler kommt trotzdem.

Danke!

BUG 26. Jun 2015 13:51

AW: Wie Fehler bzw. Rückgabewert False abfangen?
 
Wie stellst du dir den vor, wie die zweite Möglichkeit was an der Meldung ändert :stupid: :mrgreen:

Abgesehen davon findet man mit Google super schnell diese Lösung.

AlexII 26. Jun 2015 13:55

AW: Wie Fehler bzw. Rückgabewert False abfangen?
 
Zitat:

Zitat von BUG (Beitrag 1306708)
Wie stellst du dir den vor, wie die zweite Möglichkeit was an der Meldung ändert :stupid: :mrgreen:

Jah...
Zitat:

ForceDirectoriesUTF8
gibt False zurück und weiter passiert nichts.

BUG 26. Jun 2015 14:00

AW: Wie Fehler bzw. Rückgabewert False abfangen?
 
Zitat:

Zitat von AlexII (Beitrag 1306709)
ForceDirectoriesUTF8 gibt False zurück und weiter passiert nichts.

Nun weiß ForceDirectoriesUTF8 aber gar nicht, ob du etwas mit dem Rückgabewert machst.

Im Ernst, guckt dir die verlinkten Antworten an, da sollte eine Lösung dabei sein, die dir passt.

AlexII 26. Jun 2015 14:02

AW: Wie Fehler bzw. Rückgabewert False abfangen?
 
Ok....

Habe diese hier gefunden. Muss da Dw1 und Dw2 nicht mit Werter belegt werden?

Delphi-Quellcode:
function LaufwerkBereit(root: string): boolean;
var Oem: cardinal;
  Dw1, Dw2: DWORD;
begin
  Oem := SetErrorMode(SEM_FAILCRITICALERRORS);
  result := GetVolumeInformation(PCHAR(Root), nil, 0, nil, Dw1, Dw2, nil, 0);
  SetErrorMode(Oem) ;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  if Laufwerkbereit('A:\') then ShowMessage('Laufwerk bereit!')
  else ShowMessage('Laufwerk nicht bereit!');
end;

BUG 26. Jun 2015 14:04

AW: Wie Fehler bzw. Rückgabewert False abfangen?
 
Zitat:

Zitat von AlexII (Beitrag 1306711)
Muss da Dw1 und Dw2 nicht mit Werter belegt werden?

Nein, da das optionale Ausgabeparameter sind.

AlexII 26. Jun 2015 14:09

AW: Wie Fehler bzw. Rückgabewert False abfangen?
 
Der sagt mit, meine schreibgeschützte SD-Karte ist bereit... voller Quatsch...
Muss wohl noch was anpassen.

Dalai 26. Jun 2015 14:12

AW: Wie Fehler bzw. Rückgabewert False abfangen?
 
GetVolumeInformation wird hier nur dazu "missbraucht", um zu prüfen, ob ein Medium bzw. Laufwerk vorhanden ist. Wenn du wissen willst, ob das Laufwerk beschreibbar ist, musst du das trotzdem prüfen - ob nun mit ForceDirectories oder sonstwie, ist erstmal egal.

MfG Dalai

AlexII 26. Jun 2015 14:17

AW: Wie Fehler bzw. Rückgabewert False abfangen?
 
Zitat:

Zitat von Dalai (Beitrag 1306714)
GetVolumeInformation wird hier nur dazu "missbraucht", um zu prüfen, ob ein Medium bzw. Laufwerk vorhanden ist. Wenn du wissen willst, ob das Laufwerk beschreibbar ist, musst du das trotzdem prüfen - ob nun mit ForceDirectories oder sonstwie, ist erstmal egal.

MfG Dalai

Und was ist mit diesem Satz? Wie kann ich den Rückgabewert von GetVolumeInformation auf FILE_READ_ONLY_VOLUME prüfen?

Zitat:

Call GetVolumeInformation() and check FILE_READ_ONLY_VOLUME in the returned flags parameter.

Dalai 26. Jun 2015 14:28

AW: Wie Fehler bzw. Rückgabewert False abfangen?
 
Möglich, dass das geht. Denkbar, dass MS damit etwas anderes meint. Probier's doch einfach aus - mehr als nicht funktionieren kann's nicht :).

MfG Dalai

Sir Rufo 26. Jun 2015 14:28

AW: Wie Fehler bzw. Rückgabewert False abfangen?
 
Ganz allgemein gesagt handelt es sich bei dem erscheinenden Dialog nicht um eine Fehlermeldung, sondern eine Aufforderung an den Benutzer, hier tätig zu werden und seine Entscheidung zu verkünden.

Erst wenn der Benutzer sich dagegen entscheidet, dann wird es ein Fehler.

Und
Delphi-Quellcode:
ForceDirectories
wirft eben keine Exception, sondern liefert den Erfolg über einen
Delphi-Quellcode:
Boolean
Wert zurück.

Das sollte dann auch erklären, warum hier ein
Delphi-Quellcode:
try except
ins Leere läuft.

Ein Blick in die MSDN-Doku hilft auch
https://msdn.microsoft.com/en-us/lib...=vs.85%29.aspx

mkinzler 26. Jun 2015 14:29

AW: Wie Fehler bzw. Rückgabewert False abfangen?
 
Wenn ein Volume nicht raed only ist, heißt das noch lange nicht, dass man schreiben kann. Die Systemplatte ist z.B. nicht schreibgeschützt und man kann trotzdem ( als Nicht Admin) nicht in die Root schreiben.

AlexII 26. Jun 2015 14:32

AW: Wie Fehler bzw. Rückgabewert False abfangen?
 
Ok... aber wie prüfe ich, ob der Wechseldatenträger beschreibbar ist, so dass kein Meldungsfenster erscheinen?

BadenPower 26. Jun 2015 14:34

AW: Wie Fehler bzw. Rückgabewert False abfangen?
 
Zitat:

Zitat von AlexII (Beitrag 1306715)
Und was ist mit diesem Satz? Wie kann ich den Rückgabewert von GetVolumeInformation auf FILE_READ_ONLY_VOLUME prüfen?

Zitat:

Call GetVolumeInformation() and check FILE_READ_ONLY_VOLUME in the returned flags parameter.

Dieser Satz sagt aus, dass Du in den zurückgegebenen Parametern auf das Flag "FILE_READ_ONLY_VOLUME" prüfen sollst, um zu wissen, dass das Laufwerk schreibgeschützt ist.

Hilfe lesen!

AlexII 26. Jun 2015 14:39

AW: Wie Fehler bzw. Rückgabewert False abfangen?
 
Das wäre dann wie folgt, so wie ich das verstehen:

Delphi-Quellcode:
Result := GetVolumeInformation(PChar(Root), nil, 0, nil, Dw1, FILE_READ_ONLY_VOLUME, nil, 0);
Aber
Zitat:

FILE_READ_ONLY_VOLUME
wird nicht gefunden. Muss ich daraus eine konstante Variable machen, oder so? Und wenn, welchen Wert besitzt sie?

Sir Rufo 26. Jun 2015 14:40

AW: Wie Fehler bzw. Rückgabewert False abfangen?
 
Eher so
Delphi-Quellcode:
var
  MaximumComponentLength, FileSystemFlags: Cardinal;
begin
  if not GetVolumeInformation( PChar( 'C:\'), nil, 0, nil, MaximumComponentLength, FileSystemFlags, nil, 0 ) then
    RaiseLastOSError( );

  Result := ( ( FileSystemFlags and FILE_READ_ONLY_VOLUME ) = FILE_READ_ONLY_VOLUME );
end;
Zitat:

Zitat von AlexII (Beitrag 1306724)
Aber
Zitat:

FILE_READ_ONLY_VOLUME
wird nicht gefunden. Muss ich daraus eine konstante Variable machen, oder so? Und wenn, welchen Wert besitzt sie?

Ja, den Link zur MSDN-Doku hatte ich dir geschickt, jetzt musst du nur noch lesen :roll:

Perlsau 26. Jun 2015 14:40

AW: Wie Fehler bzw. Rückgabewert False abfangen?
 
Zitat:

Zitat von AlexII (Beitrag 1306706)
Nun stecke ich eine gelockte SD-Karte ein und bekomme den Fehler, dass die Karte schreibgeschützt ist (ist auch logisch), siehe Screenshot. Aber wie fange ich diese Windowsmeldung ab?

Wieso möchtest du diese Meldung überhaupt abfangen? Ist denn nicht eine äußerst sinnvolle Meldung, die den Anwender darüber informiert, daß er den Schreibschutz entfernen muß, bevor er den Datenträger beschreiben kann?

Sir Rufo 26. Jun 2015 14:44

AW: Wie Fehler bzw. Rückgabewert False abfangen?
 
Zitat:

Zitat von mkinzler (Beitrag 1306720)
Wenn ein Volume nicht raed only ist, heißt das noch lange nicht, dass man schreiben kann. Die Systemplatte ist z.B. nicht schreibgeschützt und man kann trotzdem ( als Nicht Admin) nicht in die Root schreiben.

Das macht in diesem Falle aber nichts, denn dieser Dialog kommt nur dann, wenn das Volume read only ist und der Benutzer eine Chance hat, diesen Schreibschutz zu entfernen ;)

AlexII 26. Jun 2015 14:45

AW: Wie Fehler bzw. Rückgabewert False abfangen?
 
Zitat:

Zitat von Perlsau (Beitrag 1306726)
Zitat:

Zitat von AlexII (Beitrag 1306706)
Nun stecke ich eine gelockte SD-Karte ein und bekomme den Fehler, dass die Karte schreibgeschützt ist (ist auch logisch), siehe Screenshot. Aber wie fange ich diese Windowsmeldung ab?

Wieso möchtest du diese Meldung überhaupt abfangen? Ist denn nicht eine äußerst sinnvolle Meldung, die den Anwender darüber informiert, daß er den Schreibschutz entfernen muß, bevor er den Datenträger beschreiben kann?

Muss so sein, meine Anwendung sagt es dem Anwender. Der bekommt sie schon zu sehen )))

mkinzler 26. Jun 2015 14:47

AW: Wie Fehler bzw. Rückgabewert False abfangen?
 
Und wenn der Anwender unabhängig von Deiner Anwendung eine Karte mit Schreibschutz einschiebt, unterbleibt dann der Hinweis?

AlexII 26. Jun 2015 14:47

AW: Wie Fehler bzw. Rückgabewert False abfangen?
 
Zitat:

Zitat von Sir Rufo (Beitrag 1306725)
Eher so
Delphi-Quellcode:
var
  MaximumComponentLength, FileSystemFlags: Cardinal;
begin
  if not GetVolumeInformation( PChar( 'C:\'), nil, 0, nil, MaximumComponentLength, FileSystemFlags, nil, 0 ) then
    RaiseLastOSError( );

  Result := ( ( FileSystemFlags and FILE_READ_ONLY_VOLUME ) = FILE_READ_ONLY_VOLUME );
end;
Zitat:

Zitat von AlexII (Beitrag 1306724)
Aber
Zitat:

FILE_READ_ONLY_VOLUME
wird nicht gefunden. Muss ich daraus eine konstante Variable machen, oder so? Und wenn, welchen Wert besitzt sie?

Ja, den Link zur MSDN-Doku hatte ich dir geschickt, jetzt musst du nur noch lesen :roll:

Ich verstehe nur nicht was da alles heißt und wie man es anwendet. Was macht hier in deinem Fall
Delphi-Quellcode:
RaiseLastOSError( );
??
Ich hoffe es wirft keine Meldung aus, diese möchte ich ja abfangen.

AlexII 26. Jun 2015 14:50

AW: Wie Fehler bzw. Rückgabewert False abfangen?
 
Zitat:

Zitat von mkinzler (Beitrag 1306729)
Und wenn der Anwender unabhängig von Deiner Anwendung eine Karte mit Schreibschutz einschiebt, unterbleibt dann der Hinweis?

Ne, das nicht. Nur in meiner Anwendung soll der unterbleiben.

AlexII 26. Jun 2015 15:00

AW: Wie Fehler bzw. Rückgabewert False abfangen?
 
Ok, soweit alles klar, aber was mache ich mit der
Zitat:

FILE_READ_ONLY_VOLUME
?
Ist das eine Konstante und wenn ja welchen Wert hat sie?

Dalai 26. Jun 2015 15:09

AW: Wie Fehler bzw. Rückgabewert False abfangen?
 
Zitat:

Zitat von AlexII (Beitrag 1306733)
Ok, soweit alles klar, aber was mache ich mit der
Zitat:

FILE_READ_ONLY_VOLUME
?
Ist das eine Konstante und wenn ja welchen Wert hat sie?

Lies doch einfach mal im verlinkten MSDN-Artikel zu GetVolumeInformation, denn dort sind alle nötigen Infos enthalten!

MfG Dalai

AlexII 26. Jun 2015 15:35

AW: Wie Fehler bzw. Rückgabewert False abfangen?
 
Ich glaube ich hab's. Vielen Dank an alle!

Delphi-Quellcode:
function LaufwerkBeschreibbar(root: String): Boolean;
const
  FILE_READ_ONLY_VOLUME = $00080000;
var
  Oem: Cardinal;
  MaximumComponentLength, FileSystemFlags: Cardinal;
begin
  Oem := SetErrorMode(SEM_FAILCRITICALERRORS);
  if GetVolumeInformation(PChar(Root), nil, 0, nil, MaximumComponentLength, FileSystemFlags, nil, 0) then
    Result := ((FileSystemFlags and FILE_READ_ONLY_VOLUME) = FILE_READ_ONLY_VOLUME);
  SetErrorMode(Oem);
end;

Sir Rufo 26. Jun 2015 15:47

AW: Wie Fehler bzw. Rückgabewert False abfangen?
 
Zitat:

Zitat von AlexII (Beitrag 1306730)
Ich verstehe nur nicht was da alles heißt und wie man es anwendet. Was macht hier in deinem Fall
Delphi-Quellcode:
RaiseLastOSError( );
??
Ich hoffe es wirft keine Meldung aus, diese möchte ich ja abfangen.

Ja stimmt, wenn du dort Grütze übergibst (z.B. das Volume gibt es gar nicht), dann ist es sehr sinnvoll keine Exception zu werfen. :roll:

AlexII 26. Jun 2015 15:54

AW: Wie Fehler bzw. Rückgabewert False abfangen?
 
Moment, muss es nicht so sein? Ohne if-Abfrage?

Delphi-Quellcode:
function LaufwerkBeschreibbar(root: String): Boolean;
const
  FILE_READ_ONLY_VOLUME = $00080000;
var
  Oem: Cardinal;
  MaximumComponentLength, FileSystemFlags: Cardinal;
begin
  Oem := SetErrorMode(SEM_FAILCRITICALERRORS);
  GetVolumeInformation(PChar(Root), nil, 0, nil, MaximumComponentLength, FileSystemFlags, nil, 0);
  Result := ((FileSystemFlags and FILE_READ_ONLY_VOLUME) = FILE_READ_ONLY_VOLUME);
  SetErrorMode(Oem);
end;

BadenPower 26. Jun 2015 15:56

AW: Wie Fehler bzw. Rückgabewert False abfangen?
 
Zitat:

Zitat von Sir Rufo (Beitrag 1306739)
Ja stimmt, wenn du dort Grütze übergibst (z.B. das Volume gibt es gar nicht), dann ist es sehr sinnvoll keine Exception zu werfen. :roll:

Ich stimme Dir vollkommen zu, dass der Benutzer in diesem Fall auf einen Fehler aufmerksam gemacht werden sollte.:thumb:

Aber dies ist noch lange kein Grund ständig diese nervigen modalen Exceptions zu werfen.:angel:

Da glaube ich, werden wir uns nie einig werden.:cheers:

BadenPower 26. Jun 2015 16:01

AW: Wie Fehler bzw. Rückgabewert False abfangen?
 
Zitat:

Zitat von AlexII (Beitrag 1306740)
Moment, muss es nicht so sein? Ohne if-Abfrage?

Und wie unterscheidest Du, ob die Abfrage mit GetVolumeInformation gültig/erfolgreich war, wenn Du die If-Abfrage wegläßt?

AlexII 26. Jun 2015 16:10

AW: Wie Fehler bzw. Rückgabewert False abfangen?
 
Zitat:

Zitat von BadenPower (Beitrag 1306742)
Zitat:

Zitat von AlexII (Beitrag 1306740)
Moment, muss es nicht so sein? Ohne if-Abfrage?

Und wie unterscheidest Du, ob die Abfrage mit GetVolumeInformation gültig/erfolgreich war, wenn Du die If-Abfrage wegläßt?

True ist nur dann wenn Laufwerk nur lesbar?

BadenPower 26. Jun 2015 16:17

AW: Wie Fehler bzw. Rückgabewert False abfangen?
 
Zitat:

Zitat von AlexII (Beitrag 1306743)
Jetzt stehe ich auf dem Schlauch? Kann etwa GetVolumeInformation nicht erfolgreich sein.

Wenn Du zum Beispiel auf Laufwerk X prüfst und hast gar kein Laufwerk X, oder sonst einen Müll eingibst.

Siehe Sir Rufo's Post #26

Zitat:

Zitat von AlexII (Beitrag 1306743)
Was bekommt dann Result wenn es nicht erfolgreich war?

Welches Result?

Das Deiner Funktion oder das der Funktion GetVolumeInformation?


[EDIT]
AlexII hat seinen Beitrag geändert, bevor meine Antwort auf seinen Original-Text gesendet wurde.

Sir Rufo 26. Jun 2015 16:18

AW: Wie Fehler bzw. Rückgabewert False abfangen?
 
Zitat:

Zitat von AlexII (Beitrag 1306743)
Zitat:

Zitat von BadenPower (Beitrag 1306742)
Zitat:

Zitat von AlexII (Beitrag 1306740)
Moment, muss es nicht so sein? Ohne if-Abfrage?

Und wie unterscheidest Du, ob die Abfrage mit GetVolumeInformation gültig/erfolgreich war, wenn Du die If-Abfrage wegläßt?

True ist nur dann wenn Laufwerk nur lesbar?

NEIN, wenn der API-Call eine vernünftige Antwort ermitteln konnte, ansonsten steht in den Werten nämlich auch nur Grütze (weil vorher Grütze reingekommen ist).

Delphi-Quellcode:
GetVolumeInformation( PCHAR('Grütze'), ... )
.

Ach ja, RTFM -> MSDN-Doku (Link weiter oben)

AlexII 26. Jun 2015 16:23

AW: Wie Fehler bzw. Rückgabewert False abfangen?
 
Also wenn das Laufwerk beschreibbar ist, ist Result = 0(False). Und wenn unbeschreibbar = -1(True) :roteyes:

Delphi-Quellcode:
  if GetVolumeInformation(PChar(Root), nil, 0, nil, MaximumComponentLength, FileSystemFlags, nil, 0) then
  begin
    Result := ((FileSystemFlags and FILE_READ_ONLY_VOLUME) = FILE_READ_ONLY_VOLUME);
    showmessage(booltostr(result));
  end;

BadenPower 26. Jun 2015 16:31

AW: Wie Fehler bzw. Rückgabewert False abfangen?
 
Zitat:

Zitat von AlexII (Beitrag 1306750)
Also wenn das Laufwerk beschreibbar ist, ist Result = 0(False). Und wenn unbeschreibbar = -1(True) :roteyes:

Da gibt es doch nichts, was einem die Augen verdrehen läßt.

Du prüfst doch, ob das Flag FILE_READ_ONLY_VOLUME gesetzt ist.

Ist der Datenträger beschreibbar, dann ist das Flag FILE_READ_ONLY_VOLUME nicht gesetzt und daher lautet das Ergebnis "false" (Flag nicht gesetzt).

AlexII 26. Jun 2015 16:37

AW: Wie Fehler bzw. Rückgabewert False abfangen?
 
Ich glaube ich mache mal ne Pause....

Sir Rufo 26. Jun 2015 20:05

AW: Wie Fehler bzw. Rückgabewert False abfangen?
 
Das umkehren von boolschen Werten ist aber auch schon High Level Programming und nur was für erfahrene Programmierer ... OMG

Perlsau 26. Jun 2015 21:08

AW: Wie Fehler bzw. Rückgabewert False abfangen?
 
Du meinst sicher sowas hoch anspruchsvolles wie
Delphi-Quellcode:
MyBoolVar := Not MyBoolVar;
:stupid:
Da kann ich dir nur beipflichten, ist nichts für Anfänger :twisted:

Sir Rufo 26. Jun 2015 21:21

AW: Wie Fehler bzw. Rückgabewert False abfangen?
 
Zitat:

Zitat von Perlsau (Beitrag 1306781)
Du meinst sicher sowas hoch anspruchsvolles wie
Delphi-Quellcode:
MyBoolVar := Not MyBoolVar;
:stupid:
Da kann ich dir nur beipflichten, ist nichts für Anfänger :twisted:

Könntest du dafür noch ein Tutorial mit Video zu machen ... das versteht doch wieder keiner :mrgreen:

AlexII 26. Jun 2015 22:20

AW: Wie Fehler bzw. Rückgabewert False abfangen?
 
Zitat:

Zitat von Sir Rufo (Beitrag 1306773)
Das umkehren von boolschen Werten ist aber auch schon High Level Programming und nur was für erfahrene Programmierer ... OMG

Ich drehe nur das was verstehe... jetzt kann ich das auch, aber nicht vor ein Paar Stunden wo ich den Code noch verstehen versuchte.

Perlsau 27. Jun 2015 06:35

AW: Wie Fehler bzw. Rückgabewert False abfangen?
 
Zitat:

Zitat von Sir Rufo (Beitrag 1306783)
Könntest du dafür noch ein Tutorial mit Video zu machen ... das versteht doch wieder keiner :mrgreen:

Okay, hab ich gemacht: Die Variable heißt tot, erst ist sie false, dann true, dann wieder false und dann endgültig true.


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:48 Uhr.
Seite 1 von 2  1 2      

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