AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Delphi Wie erstelle ich eine eigene Fehlermeldung beim Öffnen einer Seite?
Thema durchsuchen
Ansicht
Themen-Optionen

Wie erstelle ich eine eigene Fehlermeldung beim Öffnen einer Seite?

Ein Thema von die Suchende · begonnen am 14. Sep 2011 · letzter Beitrag vom 20. Sep 2011
Antwort Antwort
die Suchende

Registriert seit: 27. Mär 2009
16 Beiträge
 
#1

Wie erstelle ich eine eigene Fehlermeldung beim Öffnen einer Seite?

  Alt 14. Sep 2011, 16:53
Hallo zusammen,

ich habe jetzt schon einige Varianten ausprobiert, komme aber nie zum gewünschten Ergebnis: Infomeldung "beim" Öffnen einer Seite anzeigen. Das ist gar nicht so trivial wie es klingt!

Ich habe mehrere TForm - auch die Seiten von TTabControl sind irgendwann voll - auf denen ich meine gefühlten 10000 Parameter einstellen kann. Da ich die Seiten aber nicht immer brauche, habe ich sie zu "verfügbare Formulare" geschoben. Ich erzeuge sie auf Knopfdruck wie folgt:
Delphi-Quellcode:
  if not assigned(Form2) then begin
     Application.CreateForm(TForm2, Form2);
  end;
  Form2.show;
und gebe sie beim Schließen (OnCloseQuery) wieder frei:
Delphi-Quellcode:
  Form2.Release;
  Form2 := nil;
Das hat bisher immer gut funktioniert und auch keine Fehler gebracht. Ich hoffe, dass damit auch wirklich die Resourcen wieder freigegeben sind.

Nun prüfe ich aber nach Programmstart, ob die hinterlegten Einstellungen auch sinvoll sind, z.B. ob die zuletzt verwendete COM-Schnittstelle verwendet werden kann oder ein eingestellter Pfad noch existiert. Es werden dann zwar die Default-Einstellungen verwendet, aber es sollte eine Meldung an den Anwender geben, der ihn darüber informiert, so dass er sich die Einstellungen auch wieder selbst anpassen kann.


Zuerst wollte ich die Fehlermeldung als "showMessage" dort aufrufen, wo auch die Seite "angezeigt" wird: im OnShow-Ereignis. Das hatte allerdings immer zur Folge, das die Fehlermeldung sich zeigte, bevor die Seite mit den Einstellungen überhaupt geöffnet war.

Dann habe ich es mit einem Timer probiert (in onShow Timer1.enabled=true), der die Infomeldung nach ca. 2 Sekunden bringt (im OnTimer-Ereignis wurde dieser wieder deaktiviert). Allerdings habe ich festgestellt, gerade wenn mehrere Sachen zu korrigieren sind, dass es günstiger wäre, die Infomeldung immer wieder zu bringen, bis man entweder die Defaulteinstellung akzeptiert oder eben ändert. Allerdings fand ich den Timer nicht besonders elegant.

Dann bin ich dazu übergegangen, die Meldung auf der entsprechenden Seite in ein Label zu schreiben, schön groß + rot + fett. Das geht auch fehlerfrei. Allerdings fand das der Chef nicht gut. Es sollte - wie bei Windows - ein eigenes Fenster mit Fehlermeldung sein.

Also habe ich den Aufruf ShowMessage in das OnActivate-Event geschrieben. Test:
- Ich starte das Programm und mache die Seite mit den Einstellungen auf. Infomeldung kommt = OK.
- Ich wechsle zwischen der Startseite und den Einstellungen und auch da kommt ordentlich die InfoAnzeige.
- Ich mache von der Seite der Einstellungen ein weiteres Fenster mit Einstellungen auf (auch ein verfügbares Formular) = OK.
- Ich wechsle zwischen dem 2. Einstellungsfenster und dem 1. Einstellungsfenster. Infomeldung kommt = alles OK.
- Ich schließe das 2. Einstellungsfenster und der Focus/die Active-Eigenschaft geht zurück zum Ersten und boom -> Fehlermeldung: "Im Projekt Project1.exe ist eine Exception der Klasse EAccessViolation aufgetreten. Meldung: 'Zugriffsverletzung bei Adresse blablabla in Modul 'Project1.exe'. Lesen von Adresse blablabla. Prozess wurde angehalten. Mit einzelner Anweisung oder Start fortsetzen."
Der Fehler kommt übrigens nicht, wenn ich alle Fenster offen habe, die Startseite anklicke, dann das Eigenschaftsfenster 2 und dann das Eigenschaftsfenster 2 schließe, weil es dann nicht das OnActive-Event von Eigenschaftsfenster 1 ausgelöst wird!
Die Fehlermeldung kommt auch nicht, wenn ich Eigenschaftfenster 2 zu den "automatisch erzeugten" Formularen schiebe. Da ich es aber nur selten brauche, möchte ich auch, dass es auch nur ein "verfügbares Formular" ist.

Verwende ich statt "ShowMessage" eine eigene Form (automatisch erzeugt; hat nur ein Label mit dem entsprechenden Text, den ich je nach Anforderung anpasse und einen OK-Button, der die Seite nur schließt = close) und rufe diese bei OnActivate mit InfoForm.show auf, erscheint sie auch im Fordergrund. Möchte ich sie dann aber schließen, kommt die Meldung: "Im Projekt Project1.exe ist eine Exception der Klasse EInvalidOperation aufgetreten. Meldung: 'Eigenschaft Visible kann in OnShow oder OnHide nciht verändert werden!. Prozess wurde angehalten. Mit einzelner Anweisung oder Start fortsetzen."
Zweifellos kommt dies, weil beim Schließen der Focis/Activate wieder an die Einstellungsseite 1 übergeht und damit sofort wieder das OnActivate und damit das Zeigen des InfoFensters ausgelöst wird, das sich gerade(? noch dabei?) schließt.
Anschließend kann man im Einstellungsfenster 1 noch alles machen/anklicken, aber so wie es den Fokus verliert, z.B. weil man die Startseite angeklickt hat oder Eigenschaftsfenster 2 öffnet, scheint im Eigenschaftsfenster 2 alles enabled=false zu sein. Man kann nichts mehr drücken, selbst minimieren und schließen mit den Fenster-Buttons funktioniert nicht mehr.

Schreibe ich:
Delphi-Quellcode:
  if InfoForm.Visible = false then begin
     InfoForm.show;
  end;
Dann ist das InfoFenster hinter dem Eigenschaftsfenster 1. Das Ereignis wird scheinbar 2 Mal ausgelöst. Habe ich bis dahin gar nicht mitbekommen, weil das OnActivate bei einem InfoEintrag in ein Label auf dieser Seite nur einmal ausgelöst wird. Und auch wenn ich ShowMessage verwende, wird es nur einmal ausgelöst. Bei ShowMessage, wird OnActivate von Eigenschatsfenster 1 nichmal nochmal ausgelöst wenn ich die ShowMessage-Medung schließe.

Jedenfalls kann ich alles normal anklicken und auch Einstellungsseite 2 ohne Fehlermeldung schließen, solange das Infofenster noch offen ist (egal ob der Focus nach dem Schließen von Eigenschaftsfenster 2 auf das Infofenster, die Startseite oder Eigenschaftsfenster 1 übergeht). Will ich aber das Infofenster wieder schließen , kommt sofort wieder die Fehlermeldung, von wegen ich würde auf die Eigenschaft Visible im OnShow/ OnHide Ereignis manipulieren wollen.

Verwende ich statt InfoForm.Show -> InfoForm.ShoModal, bringt das gar nichts, außer dass ich keinem anderen Fenster den Fokus geben kann, wenn das InfoFenster mit showModal aufgerufen wurde. Außerdem finde ich es merkwürdig, dass wenn alle Fenster offen sind und ich dann das Einstellungsfenster 1 aktiviere und das Infofenster schließe, scheinbar kein Fenster den Fokus hat = Alle Rahmen sind matt?!

Einen Timer im OnActivate auszulösen war relativ sinnlos, da die Seite ja jedesmal wieder den Fokus erhält, wenn man das Infofenster wieder schließt.

Das wäre sicherlich das nächste Problem gewesen, wenn keine Fehlermeldung mehr nach dem Schließen des eigengeschriebenen InfoFenster mehr gekommen wäre. Das es sich gleich nach dem Schließen wieder öffnet, weil ja anschließend gleich OnActivate der Einstellungsseite 1 ausgelöst werden würde.


Irgendwie stehe ich da auf dem Schlauch. Das kann doch nicht so schwer sein, 'ne einfache eigene Fehlermeldung anzuzeigen.
Ich brauche Hiiiilfe!!!

die Suchende
  Mit Zitat antworten Zitat
Darlo

Registriert seit: 28. Jul 2008
Ort: München
1.196 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#2

AW: Wie erstelle ich eine eigene Fehlermeldung beim Öffnen einer Seite?

  Alt 14. Sep 2011, 18:08
Hi,

ich hatte mal das selbe Problem und folgende Notiz gefunden:
OnShow: Form ist nocht nicht sichtbar
onPaint: Form ist sichtbar
onResize: Form ist sichtbar und wird nach inPaint ausgelöst.

Ob das sauber ist läßt sich drüber streiten, habe dann glaube ich onResize genommen.
Philip
  Mit Zitat antworten Zitat
die Suchende

Registriert seit: 27. Mär 2009
16 Beiträge
 
#3

AW: Wie erstelle ich eine eigene Fehlermeldung beim Öffnen einer Seite?

  Alt 20. Sep 2011, 08:19
Entschuldigung dass ich mich erst so spät melde. habe ein neues Projekt auf den Tisch bekommen um dass ich mich zuerst kümmern musste.

Jedenfalls habe ich deinen Tipp ausprobiert. Und tatsächlich geht es mit dem OnPaint genau so wie ich mir das vorstelle und ohne Fehlermeldung. Mit OnResize hatte ich nicht das gewünschte Ergebnis, weil ich meine Oberfläche nicht zur Laufzeit an den Bildschirm anpasse. Und dass man das Fenster manuell resized, ist ja ehr selten der Fall.

Danke Darlo für die schnelle Antwort ... war ja doch recht einfach. Ich dachte nur, dass OnPaint von Fenster2 auch ausgelöst wird, wenn Fenster3 (überdeckt Ecke von Fenster2) geschlossen wird und der Fokus an Fenster1 übergeht, weil ja die kürzlich überdeckte Ecke nun neu gezeichnet werden muss. Ist aber doch nicht der Fall. Jeden Falls kam dann meine Meldung nicht. Mit OnPaint funktioniert es so wie ich mir das vorstelle.

nochmal Danke
die Suchende
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:04 Uhr.
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