11.11 Die Klasse Application
In den vorangegangenen Abschnitten haben Sie einige Mitglieder der Klasse Application kennengelernt und eingesetzt. Das Wichtigste war sicherlich die Methode Run, um die Nachrichtenschleife zu starten. Der Typ Application im Namensraum System.Windows.Forms stellt noch eine Reihe weiterer statischer Methoden und Eigenschaften zur Verfügung, um allgemeine Informationen der aktuellen Anwendung abzurufen.
11.11.1 Die Datei AssemblyInfo.vb
Einige allgemeine Informationen können in die Datei AssemblyInfo.vb als Attribute eingetragen werden, beispielsweise die Produktversion oder der Produktname. Nachfolgend sehen Sie einen Auszug aus dieser Datei.
... <Assembly: AssemblyTitle("Meine Anwendung")> <Assembly: AssemblyDescription("")> <Assembly: AssemblyConfiguration("")> <Assembly: AssemblyCompany("Tollsoft")> <Assembly: AssemblyProduct("Tollsoft's Massenprodukt")> <Assembly: AssemblyCopyright("Copyright @ Tollsoft 2008")> <Assembly: AssemblyTrademark("")> <Assembly: AssemblyCulture("")> ...
Zur Laufzeit lassen sich die Einträge in der Datei AssemblyInfo.vb auswerten. Mit
MessageBox.Show(Application.ProductName)
können Sie zum Beispiel den Eintrag unter AssemblyProduct abrufen und in einem Meldungsfenster ausgeben.
11.11.2 Wartende Ereignisse abrufen (DoEvents)
Ist einem Ereignis ein Ereignishandler zugeordnet, wird dieser ausgeführt. Er ist aber nichts anderes als eine Methode, die vom Anfang bis zum Ende ausgeführt wird, bevor die Kontrolle wieder an die aufrufende Methode übergeben wird.
Wird beispielsweise ein Mausereignis ausgelöst, während die Windows-Anwendung damit beschäftigt ist, ein anderes, in der Ausführungszeit länger andauerndes Ereignis abzuarbeiten, dann wird das Mausereignis in einer Warteschlange gepuffert. Erst wenn der laufende Ereignishandler vollständig abgearbeitet ist, wird der nächste aus dem Puffer geholt. Die Folge ist ein nicht unbedeutendes Problem: Ein Ereignishandler, dessen Ausführung eine längere Zeit in Anspruch nimmt, wird die Bearbeitung der anderen eingehenden Ereignisse blockieren. Wie kann dieses Problem gelöst werden?
Eine mögliche Lösung ist ein weiterer Thread. Die Programmierung kann aber im Einzelfall ziemlich komplex werden und sollte daher nicht als Nonplusultra angesehen werden. Einfacher ist es, die Ausführung der laufenden Ereignisprozedur zu unterbrechen und während der Unterbrechung das nächste anstehende Ereignis aus dem Puffer zu holen und zu bearbeiten. Genau das leistet die statische Methode DoEvents der Klasse Application.
Wir wollen uns die Wirkungsweise dieser Methode an einem Beispielprogramm ansehen. Abbildung 11.13 zeigt das Layout. Das Formular enthält eine Textbox und drei Schaltflächen. Nach dem Anklicken der Schaltfläche Start wird im Ereignishandler des Ereignisses Click eine Schleife von 0 bis 1.000.000 durchlaufen und der aktuelle Zählerstand in die Textbox eingetragen. Die Abarbeitung der Schleife nimmt eine deutlich spürbare Zeitspanne in Anspruch, während der – wenn wir nicht mit DoEvents die Nachrichtenschleife zum Zug kommen lassen – keine der beiden anderen Schaltflächen auf das Anklicken eine Reaktion zeigt. Die Schaltfläche Meldung soll nur ein einfaches Meldungsfenster anzeigen, und die Schaltfläche Beenden soll die Laufzeitumgebung der Anwendung unabhängig vom aktuellen Stand des Schleifenzählers schließen.
Abbildung 11.13 Formular des Programms »DoEvents«
Der Programmcode dieses Beispiels sieht wie folgt aus:
'...\WinForm\Ereignisse\DoEvents.vb |
Public Class DoEvents Private flag As Boolean Private Sub Start_Click(sender As Object, e As EventArgs) _ Handles Start.Click Meldung.Focus() For i As Integer = 0 To 1000000 ' unterbrechen und anstehende Ereignisse aus dem Puffer holen Application.DoEvents() If flag Then Exit For Zähler.Text = i.ToString() Zähler.Refresh() Next End Sub Private Sub Meldung_Click(sender As Object, e As EventArgs) _ Handles Meldung.Click MessageBox.Show("Textausgabe unterbrochen", Application.ProductName) End Sub Private Sub Beenden_Click(sender As Object, e As EventArgs) _ Handles Beenden.Click Me.flag = True Application.Exit() End Sub End Class
Der DoEvents-Aufruf sorgt dafür, dass die Ereignishandler der beiden anderen Schaltflächen eine Chance haben, die CPU in Anspruch zu nehmen. Wenn Sie den DoEvents-Aufruf auskommentieren, muss die Schleife zuerst bis zum Endwert durchlaufen werden. Durch das Feld flag wird bei Beendigung der Anwendung die Schleife auch beendet, und sie läuft nicht weiter nach dem Schließen aller Fenster und der Nachrichtenschleife.
Der Fokus sollte vor dem Eintritt in die Schleife auf einen anderen Button gelegt werden. Wenn Sie das versäumen, müssen vor dem Anzeigen der Meldung bzw. dem Schließen noch andere Ereignisse abgearbeitet werden, was zur Folge hat, dass die entsprechende Schaltfläche zweimal angeklickt werden muss.
11.11.3 Eigenschaften und Methoden
Tabelle 11.17 zeigt einige der Eigenschaften und Methoden der Klasse Application.
Eigenschaft/Methode | Beschreibung | Typ |
CompanyName |
Der Firmenname, der dieser Anwendung zugeordnet ist |
E |
ExecutablePath |
Pfadangabe einschließlich des Dateinamens der ausführbaren Datei, die zum Starten der Anwendung verwendet wurde |
E |
ProductName |
Der Produktname, der dieser Anwendung zugeordnet ist |
E |
ProductVersion |
Die Produktversion, die dieser Anwendung zugeordnet ist. |
E |
StartupPath |
Angabe des Pfades, in dem sich die ausführbare Datei der Anwendung befindet, ohne die ausführbaren Datei selbst |
E |
DoEvents |
Verarbeitet alle Windows-Meldungen, die sich derzeit in der Nachrichtenwarteschlange befinden. |
M |
EnableVisualStyles |
Ermöglicht die Darstellung im XP-Stil. |
M |
Exit |
Schließt alle Anwendungsfenster, sobald alle Nachrichten verarbeitet wurden. |
M |
ExitThread |
Verlässt die Nachrichtenschleife für den aktuellen Thread und schließt alle Fenster des Threads. |
M |
Run |
Beginnt die Ausführung einer Nachrichtenschleife einer Anwendung für den aktuellen Thread. |
M |
Ihre Meinung
Wie hat Ihnen das Openbook gefallen? Wir freuen uns immer über Ihre Rückmeldung. Schreiben Sie uns gerne Ihr Feedback als E-Mail an kommunikation@rheinwerk-verlag.de.