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