Code zu Fenstern und Formularen in .NET
- Verhindern mehrfachen Behandelns von Ereignissen bei Formularvererbung
- Entfernen der Schließen-Systemschaltfläche eines Formulars
- Ermitteln der Ursache für das Schließen eines Formulars
- Anzeigen der Systeminformationen
- Scheinbares Senken des Speicherbedarfs von Formularen
Verhindern mehrfachen Behandelns von Ereignissen bei Formularvererbung
Über Formularvererbung können bestehende Formulare wiederverwendet und erweitert werden. Manchmal ist es erforderlich, daß die Implementierung hinter einem Ereignis des Steuerelements einer Basisklasse im abgeleiteten Formular geändert werden muß. Die Entwicklungsumgebung erlaubt zwar das Hinzufügen einer weiteren Ereignisbehandlungsprozedur, was aber dazu führt, daß zur Laufzeit beide Ereignisbehandlungsprozeduren aufgerufen werden.
In dieser Situation würde man es sich wünschen, daß die Ereignisbehandlungsprozedur aus der Basisklasse nicht ausgeführt wird. Zu diesem Zweck kann man im Konstruktor des abgeleiteten Formulars die Ereignisbehandlungsprozedur aus der Basisklasse vom Ereignis des Steuerelements lösen. Das Entfernen der Ereignisbehandlungsprozedur kann mit der Anweisung RemoveHandler
durchgeführt werden. Damit das Beispiel funktioniert, muß die Ereignisbehandlungsprozedur in der Basisklasse als Protected
deklariert werden. Im abgeleiteten Formular kann man der Ereignisbehandlungsprozedur entweder einen anderen Namen geben oder die Prozedur der Basisklasse überschreiben.
Entfernen der Schließen-Systemschaltfläche eines Formulars
Windows-Forms-Formularen bieten zwar die Möglichkeit, die Systemschaltflächen zum Minimieren und Maximieren getrennt zu deaktivieren, will man aber nur die Systemschaltfläche Schließen außer Gefecht setzen, wird man verzweifelt nach einer entsprechenden Eigenschaft suchen. Die einzige im .NET Framework vorgesehene Möglichkeit besteht darin, alle Systemschaltflächen durch Setzen der ControlBox
-Eigenschaft des Formulars auf False
zu entfernen. Dadurch wird dem Benutzer allerdings die Möglichkeit genommen, das Fenster zu minimieren oder zu maximieren.
Eine einfache Lösung besteht darin, das Ereignis Closing
des Formulars zu behandeln und innerhalb der Ereignisbehandlungsprozedur die Eigenschaft Cancel
des Ereignisargumentobjekts auf False
zu setzen. Es ist wohl offensichtlich, daß diese Vorgehensweise nicht die beste Lösung darstellt. Der Benutzer könnte verunsichert werden, wenn er mehrmals auf die Schaltfläche klickt, sich aber das Fenster trotzdem nicht schließt. Auch das Anzeigen einer Meldung mit einem Hinweis darauf, daß das Fenster nicht geschlossen werden kann, wirkt unprofessionell:
Eine etwas elegantere Lösung zum Entfernen der Schaltfläche liegt im Überschreiben der Eigenschaft CreateParams
des Formulars. In der überschriebenen Eigenschaft werden die Fensterstile so erweitert, daß die Systemschaltfläche zum Schließen des Formulars automatisch deaktiviert wird:
Weiters wäre eine Lösung auf Basis der Windows-API denkbar. Durch Entfernen des Eintrags Schließen und der darüber befindlichen horizontalen Linie aus dem Systemmenü wird auch gleich die dazugehörige Systemschaltfläche deaktiviert:
Ermitteln der Ursache für das Schließen eines Formulars
Fenster können aus verschiedensten Gründen geschlossen werden:
Windows-Forms-Formulare besitzen eine Systemschaltfläche, über die sie geschlossen werden können.
Das Fenster kann über den Task-Manager geschlossen werden.
Das Betriebssystem wird heruntergefahren und dadurch das Fenster geschlossen.
Die Anwendung stellt entsprechende Möglichkeiten zum Schließen selbst zur Verfügung.
In einigen Fällen ist es erforderlich, die Ursache für das Schließen eines Fensters zu kennen. Zu diesem Zweck stehen verschiedene Wege bereit, die wir in Folge ansehen wollen. Im folgenden Beispiel wird Einsicht in einen Stackframe eines Stacktraces genommen und so ermittelt, welche Plattformfunktion zuletzt aufgerufen wurde:
Ob das Fenster über die Systemschaltfläche oder das Systemmenü geschlossen wurde, kann man auch durch Überschreiben der Methode WndProc
des Formulars ermitteln. Über Hineinhorchen in die Nachrichtenschleife kann zudem herausgefunden werden, ob das Herunterfahren des Betriebssystems der Grund für das Schließen des das Fenster ist:
Anzeigen der Systeminformationen
In Visual Basic 6.0 war eine Formularvorlage für einen Informationsdialog enthalten, den man in seine Anwendungen einbinden konnte. Dieser Dialog enthielt auch eine Schaltfläche, über die die Systeminformationen angezeigt werden konnten. Auch wenn der Sinn einer solchen Schaltfläche in Frage zu stellen ist, kann es vorkommen, daß man dem Benutzer die Möglichkeit geben will, die Systeminformationen anzuzeigen.
Folgendes Beispiel liest aus der Systemregistrierung den Pfad der Anwendung aus, in der die Systeminformationen implementiert sind. Existiert die Datei, dann wird sie gestartet. Auf Fehlerbehandlung wurde verzichtet. Unter alten Windows-Versionen kann der Pfad nicht auf diese Weise abgefragt werden. Damit das Beispiel funktioniert, müssen die Namensräume Microsoft.Win32
und System.IO
importiert werden:
Scheinbares Senken des Speicherbedarfs von Formularen
Windows-Forms-Formulare benötigen im nicht-minimierten Zustand sehr viel Arbeitsspeicher. Über die Windows-API-Funktion SetProcessWorkingSize
kann der Speicherbedarf scheinbar reduziert werden. Tatsächlich wird jedoch nur das Minimieren des Hauptfensters der Anwendung simuliert, was bewirkt, daß Daten der Anwendung ausgelagert und der Speicher anderen Anwendungen zur Verfügung gestellt wird. Dem zugrunde liegt der Gedanke, daß minimierte Anwendungen für einige Zeit vom Benutzer nicht verwendet werden und deshalb andere Anwendungen Speicher dringender benötigen.