Autor Beitrag
jackle32
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 183
Erhaltene Danke: 7

Win7
Delphi XE5 Starter, RAD Studio XE7 Pro
BeitragVerfasst: Fr 14.10.16 19:27 
Hallo zusammen,

folgende Situation:
Ich benutze im meinem Projekt die FireDAC Komponenten um auf eine Access-Datenbank zuzugreifen.
Da die Datenbank nicht dauerhaft verbunden sein soll, gebe ich dem Nutzer die Möglichkeit zur Laufzeit die Anmeldung vorzunehmen.
Genau zu diesem Zweck gibt es ja die TFDGUIxLoginDialog Komponente.

In der Hilfe von RAD Studio gibt es folgenden Code:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
try
   FDConnection1.Connected := True;
 except
   on E: EAbort do
     ; // user pressed Cancel button in Login dialog
   on E: EFDDBEngineException do
     case E.Kind of
     ekUserPwdInvalid: ; // user name or password are incorrect
     ekUserPwdExpired: ; // user password is expired
     ekServerGone: ;     // DBMS is not accessible due to some reason
     else                // other issues
     end;
 end;


Funktioniert auch soweit gut (zusätzlich mit den extra aufgeführten Hinweisen).

Mein Problem ist jetzt nur, dass beim drücken des Abbrechen Buttons im Login-Dialog die Exception-Routine gar nicht aufgerufen wird (bei anderen Fehlern, wie falschem Passwort schon), sondern eine FireDAC Exception Meldung kommt.
Die ist erstens sehr kryptisch und zweites brauche ich keine, da ein Cancel ja ein ganz normaler Vorgang ist.

Hat jemand von euch schon mal mit dieser Komponente gearbeitet bzw. den Fehler auch schon mal umschiffen müssen?
Google ist dabei leider auch nicht wirklich hilfreich.

Gruß,
Jack

_________________
Es gibt keine dummen Fragen, nur dumme Antworten.
Frühlingsrolle
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2162
Erhaltene Danke: 399

[Win NT] 5.1 x86 6.1 x64
[Delphi] 7 PE, 2006, 10.1 Starter, Lazarus - [C#] VS Exp 2012 - [Android API 15] VS Com 2015, Eclipse, AIDE - [C++] Builder 10.1
BeitragVerfasst: Fr 14.10.16 19:47 
Guten Abend jackle32,

in der Zeile 5 musst du schon irgendetwas aufrufen, damit im Falle einer auftretenden EAbort-Exception auch etwas passiert.
Oder hast du dort etwas stehen, und es passiert dennoch nichts? Dann liegt es daran, dass die Exception zu jenen Zeitpunkt nicht ausgeworfen wird.

_________________
„Politicians are put there to give you the idea that you have freedom of choice. You don’t. You have no choice. You have owners. They own you. They own everything." (George Denis Patrick Carlin)
jackle32 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 183
Erhaltene Danke: 7

Win7
Delphi XE5 Starter, RAD Studio XE7 Pro
BeitragVerfasst: Fr 14.10.16 21:09 
Hallo,

nein ich habe da nix stehen. Habe mal mit ShowMessage() versucht eine Meldung zu generieren, es passiert aber nix.
Mit einem Test per Haltepunkt setzen, habe ich gesehen, dass ich gar nicht in den Exception Bereich bzw. in keinen den ich bis jetzt abfange rein komme.

_________________
Es gibt keine dummen Fragen, nur dumme Antworten.
Frühlingsrolle
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2162
Erhaltene Danke: 399

[Win NT] 5.1 x86 6.1 x64
[Delphi] 7 PE, 2006, 10.1 Starter, Lazarus - [C#] VS Exp 2012 - [Android API 15] VS Com 2015, Eclipse, AIDE - [C++] Builder 10.1
BeitragVerfasst: Fr 14.10.16 23:03 
Der Block wird nicht erreicht, weil er nicht ausgelöst wird. Damit er ausgelöst werden kann, muss die EAbort-Exception "aktiv" sein. Damit dies passiert, kann man den Fehler künstlich herbeirufen mit:

ausblenden Delphi-Quelltext
1:
raise EAbort.Create('EAbort');					

oder es wird die Methode Abort() aufgerufen, siehe Silent Exceptions

Da das geklärt ist, was genau soll bei der Anmeldung passieren?

Nachtrag:
Vielleicht verstehst du es so besser

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
try
  if FDGUIxLoginDialog1.Execute then
  begin
    ShowMessage('Login wurde ausgeführt');
  end else
    Abort;
except
  on E: EAbort do
    ShowMessage('Login wurde abgebrochen');
end;

_________________
„Politicians are put there to give you the idea that you have freedom of choice. You don’t. You have no choice. You have owners. They own you. They own everything." (George Denis Patrick Carlin)
jackle32 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 183
Erhaltene Danke: 7

Win7
Delphi XE5 Starter, RAD Studio XE7 Pro
BeitragVerfasst: Mo 02.01.17 13:40 
Hallo zusammen,

habe mich nach längerer Zeit nochmal diesem Thema gewidmet und des Rätsels Lösung gefunden.
Hier die Erklärung falls nochmal jemand darüber stolpern sollte.

Wird der Aufgerufenen Dialog mit Abbrechen beendet wird keine Exception der Klasse "EFDDBEngineException" und auch nicht der Klasse "EAbort" erzeugt.
Erzeugt wird eine Exception der Klasse "EFDException"

Somit kann die Fehlermeldung abgefangen werden indem in den except Block aus meinem ersten Post noch der Abschnitt

ausblenden Delphi-Quelltext
1:
2:
3:
4:
on E: EFDException do
begin
  //Was getan werden soll
end;


eingefügt wird.

Hoffe es spart dem ein oder anderen etwas Zeit

Gruß,
Jack

_________________
Es gibt keine dummen Fragen, nur dumme Antworten.

Für diesen Beitrag haben gedankt: mandras