![]() |
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:
So wie ich das verstehe, sollte das Formular nach obenstehendem Code im Fehlerfall nicht geschlossen werden oder bin ich da einem Irrtum aufgesessen?
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; Besten Dank schonmal, Jackandthejuice |
AW: Problem mit ShowModal und Exception
Zitat:
Delphi-Quellcode:
Dann rufst du diese Function mittels entsprechendem Übernahme-Button auf:
FUNCTION TDatenmodul1.DatensatzSpeichern(Sender: TObject) : BOOLEAN;
BEGIN try Dataset.Post; Result := TRUE; except Result := FALSE; end; END;
Delphi-Quellcode:
Als Alternative zum Übernahme-Button setzt du noch einen Cancel-Button auf dein Modalform, damit der Benutzer die Eingabe abbrechen kann:
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;
Delphi-Quellcode:
PROCEDURE TFormEingabeModal.ButtonEingabenUebernehmenClick(Sender: TObject);
BEGIN CLOSE; END; ![]() |
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; |
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. |
AW: Problem mit ShowModal und Exception
Zitat:
|
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. |
AW: Problem mit ShowModal und Exception
Zitat:
|
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 |
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:
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 ;-)
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; 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