Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Problem mit ShowModal und Exception (https://www.delphipraxis.net/159920-problem-mit-showmodal-und-exception.html)

Jack and the Juice 18. Apr 2011 22:56

Problem mit ShowModal und Exception
 
Hallo,

seit kurzem tritt in meinem aktuellen Projekt (Datenbankverwaltung) ein eigenartiges Problem auf:
Ich rufe das Formular zum Bearbeiten eines Datensatzes mit ShowModal auf. Das Formular wird anstandslos geöffnet. Wenn alle Eingaben korrekt getätigt wurden, dann wird der Datensatz gespeichert und das Formular wieder geschlossen. Wenn allerdings eine Eingabe nicht korrekt getätigt wird und ich einen Fehler erhalte, tritt die Exception ein und ein Dialog informiert den Nutzer darüber, dass nicht alle benötigten Felder ausgefüllt wurden. Das Formular soll dann natürlich geöffnet bleiben, um weitere Eingaben zuzulassen ... und genau hier tritt das Problem auf. Im Fall einer Exception wird die Fehlermeldung angezeigt, das Formular wird aber trotzdem geschlossen, sprich die MainForm wird wieder angezeigt.

Delphi-Quellcode:
  try
    //Daten speichern ; hier tritt beispielsweise eine Exception auf, weil eine benötigte Eingabe fehlt o.ä.
    Form2.Close;

  except
    messagedlg(
      'Es ist ein Fehler aufgetreten. Bitte überprüfen Sie Ihre Eingaben.', mtError, [mbOK], 0);
    form1.ClientDataSet1.Delete;
  end;
So wie ich das verstehe, sollte das Formular nach obenstehendem Code im Fehlerfall nicht geschlossen werden oder bin ich da einem Irrtum aufgesessen?

Besten Dank schonmal,
Jackandthejuice

Perlsau 18. Apr 2011 23:28

AW: Problem mit ShowModal und Exception
 
Zitat:

Zitat von Jack and the Juice (Beitrag 1095911)
Delphi-Quellcode:
  try
    //Daten speichern ; hier tritt beispielsweise eine Exception auf, weil eine benötigte Eingabe fehlt o.ä.
    Form2.Close;

  except
    messagedlg(
      'Es ist ein Fehler aufgetreten. Bitte überprüfen Sie Ihre Eingaben.', mtError, [mbOK], 0);
    form1.ClientDataSet1.Delete;
  end;
So wie ich das verstehe, sollte das Formular nach obenstehendem Code im Fehlerfall nicht geschlossen werden oder bin ich da einem Irrtum aufgesessen?

Würde ich anders lösen. Deklariere im Datenmodul eine Funktion mit Boolean-Rückgabewert:

Delphi-Quellcode:
FUNCTION TDatenmodul1.DatensatzSpeichern(Sender: TObject) : BOOLEAN;
BEGIN
    try
      Dataset.Post;
      Result := TRUE;

    except
      Result := FALSE;
    end;
END;
Dann rufst du diese Function mittels entsprechendem Übernahme-Button auf:
Delphi-Quellcode:
PROCEDURE TFormEingabeModal.ButtonEingabenUebernehmenClick(Sender: TObject);
BEGIN
     IF  Datenmodul1.DatensatzSpeichern(Sender)
     THEN CLOSE
     ELSE Showmessage('Es ist ein Fehler aufgetreten. Bitte überprüfen Sie Ihre Eingaben.');
END;
Als Alternative zum Übernahme-Button setzt du noch einen Cancel-Button auf dein Modalform, damit der Benutzer die Eingabe abbrechen kann:
Delphi-Quellcode:
PROCEDURE TFormEingabeModal.ButtonEingabenUebernehmenClick(Sender: TObject);
BEGIN
     CLOSE;
END;
Sieht dann ungefähr so aus.

ConnorMcLeod 19. Apr 2011 06:36

AW: Problem mit ShowModal und Exception
 
Dafür gibt es OnCloseQuery.
Delphi-Quellcode:
procedure TForm1.FormCloseQuery(Sender: TObject;
  var CanClose: Boolean);
begin
  try
    // machwas
  except
    CanClose := False;
  end;
end;

Deep-Sea 19. Apr 2011 08:04

AW: Problem mit ShowModal und Exception
 
Diese Art der Fehlerbehandlung ist eigentlich ein No-go, da man damit niemals den wahren Fehlergrund ermitteln kann. Dies kann die Fehlersuche unmöglich machen. Das erfreut dann sowohl Programmierer als auch Kunden :roll:
Die ursprüngliche Fehlermeldung sollte also nach wie vor einsehbar sein. Im einfachsten Falle hängt man einfach die Message an seine eigene. Oder man nutzt Nested Exceptions.

Perlsau 19. Apr 2011 10:07

AW: Problem mit ShowModal und Exception
 
Zitat:

Zitat von Deep-Sea (Beitrag 1095944)
Diese Art der Fehlerbehandlung ist eigentlich ein No-go, da man damit niemals den wahren Fehlergrund ermitteln kann. Dies kann die Fehlersuche unmöglich machen. Das erfreut dann sowohl Programmierer als auch Kunden :roll:
Die ursprüngliche Fehlermeldung sollte also nach wie vor einsehbar sein. Im einfachsten Falle hängt man einfach die Message an seine eigene. Oder man nutzt Nested Exceptions.

Darum ging es aber nicht, das wäre ein anderes Thema.

Daniel 19. Apr 2011 11:07

AW: Problem mit ShowModal und Exception
 
Sodele. Ich habe mal eine Reihe an Beiträgen weggefegt, die mit der Frage nichts zutun hatten.

Der Fragesteller hat nun mehrere Möglichkeiten, mit der Thematik umzugehen. Und kann selbst entscheiden, wie tief er in das Thema "Exception-Handling" einsteigen will.

Perlsau 19. Apr 2011 11:09

AW: Problem mit ShowModal und Exception
 
Zitat:

Zitat von Daniel (Beitrag 1095992)
Sodele. Ich habe mal eine Reihe an Beiträgen weggefegt, die mit der Frage nichts zutun hatten.
Der Fragesteller hat nun mehrere Möglichkeiten, mit der Thematik umzugehen. Und kann selbst entscheiden, wie tief er in das Thema "Exception-Handling" einsteigen will.

Einwandfrei :wink:

Jack and the Juice 19. Apr 2011 17:23

AW: Problem mit ShowModal und Exception
 
Hallo,

zunächst vielen Dank an alle. Ich habe das Problem jetzt mit OnCloseQuery und ModalResult gelöst. Jetzt funktioniert es einwandfrei.

Zu der Diskussion bezüglich des Exception-Handlings: ich bin gerne bereit mehr zu lernen. Wenn also jemand Tippr und Tricks, am Besten in Tutorial-Form hat, dann immer her damit.

Besten Dank und Grüße aus Dänemark,
jackandthejuice

ConnorMcLeod 19. Apr 2011 17:37

AW: Problem mit ShowModal und Exception
 
Gern geschehen!
Ich habe die Diskussion nicht mitbekommen, aber was Deep-Sea wahrscheinlich gemeint hat, ist z.B.:
Delphi-Quellcode:
procedure TForm1.FormCloseQuery(Sender: TObject;
  var CanClose: Boolean);
begin
  try
    // machwas
  except
    on e:Exception do
      begin
        CanClose := False;
        ShowMessage(
            'Da ist ein Fehler passiert.'
          + #13
          + 'Meldung: '
          + e.Message
          );
      end;
  end;
end;
sodaß man weiß, wie die Exception heißt. Man kann hier auch zwischen verschiedenen Exception-Arten unterscheiden, wenn man will. Bezüglich Detailreichtum der Meldung befrage Deine Phantasie ;-)

Bei meiner ersten Antwort ging es mir mehr darum, den Kern Deiner Frage zu treffen, als mit Exception-Handling vom Wesentlichen abzulenken.

HTH


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:40 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz