Von VBA zu C#: Objekt-Ereignisse

Lies in den Artikel rein und unten bekommst Du ein unschlagbares Angebot!

Nicht nur Fenster und Steuerelemente, sondern auch Objekte, die nicht Bestandteil der Benutzeroberfläche sind, können Ereignisse auslösen. Schließlich können Sie auch selbst Klassen programmieren und diese mit Ereignishandlern versehen. Wie Sie unter C# mit diesen Möglichkeiten umgehen, zeigt dieser Artikel. Dabei schauen wir uns zunächst an, wie Sie Ereignisse für Objekte auf Basis etwa der OpenFileDialog-Klasse implementieren und erstellen dann eine benutzerdefinierte Klasse mit einem Ereignishandler.

Ereignisse von Klassen implementieren

Neben Formularen und Steuerelementen bieten unter Access auch verschiedene Klassen beziehungsweise Objekte Ereignisse an, die Sie selbst implementieren können. Als Beispiel sei etwa die Klasse Application anderer Office-Anwendungen wie Outlook,Word oder Excel genannt. Sie deklarieren dabei eine entsprechende Objektvariable wie etwa objWord mit dem Typ Word.Application und instanzieren Word dann mit der New-Methode. Wenn Sie die Deklaration mit dem Schlüsselwort WithEvents durchführen, können Sie anschließend nicht nur Methoden oder Eigenschaften von Word aufrufen, sondern auch noch die Ereignisse von Word durch entsprechende Ereignisprozeduren implementieren – beispielsweise, wenn ein Dokument geöffnet oder geschlossen wird:

Dim WithEvents objWord As Word.Application
Set objWord = New Word.Application

Dazu wählen Sie dann im linken Kombinationsfeld des VBA-Fensters, in der die Variable objWord definiert ist, den Eintrag objWord aus und können dann mit dem rechten Kombinationsfeld die zur Verfügung stehenden Ereignisse selektieren – beispielsweise das Quit-Ereignis. Im Beispiel aus Bild 1 haben wir etwa eine Word-Instanz erstellt und unter objWord gespeichert. Die für das Quit-Ereignis erstellte Ereignisprozedur haben wir mit einer Anweisung gefüllt, die ein Meldungsfenster liefert, wenn die Word-Instanz wieder geschlossen wird.

Implementieren eines Ereignisses eines Objekts

Bild 1: Implementieren eines Ereignisses eines Objekts

Ereignis unter C# implementieren

Unter C# läuft dies etwas anders, aber nicht viel. Im folgenden Beispiel wollen wir die Timer-Klasse verwenden (der Zugriff auf Word ist von C#-Projekten aus etwas aufwändiger – dies schauen wir uns in einem späteren Beitrag an …). Die Timer-Klasse erlaubt es, ein Zeitgeber-Intervall festzulegen, nach dem das Ereignis Elapsed ausgelöst wird.

Die Objektvariable für das Objekt, das ein Ereignis auslösen soll, deklarieren wir unter C# nicht mit einem speziellen Schlüsselwort wie WithEvents unter VBA, sondern einfach als private, statische Variable:

private static Timer timer;

In der gleichen Klasse legen wir unsere Methode an, welche das Objekt auf Basis der Klasse Timer instanziert, stellen das Zeitgeber-Intervall ein und starten den Zeitgeber. Außerdem, und das ist der wichtigste Punkt, legen wir fest, dass beim Eintreten des Ereignisses Elapsed der Timer-Klasse die Methode Timer_Elapsed ausgeführt werden soll. Dies erreichen wir durch die folgende Zeile:

timer.Elapsed += Timer_Elapsed;

Die komplette Prozedur zum Erstellen des Timer-Objekts und zum Starten des Zeitgebers sieht nun wie folgt aus:

public static void TimerEreignis() {
     Console.WriteLine("Start Timer. Intervall: eine Sekunde.");
     timer = new Timer();
     timer.Elapsed += Timer_Elapsed;
     timer.Interval = 1000;
     timer.Start();
}

Nun benötigen wir noch die Methode, die beim Eintreten des Elapsed-Ereignisses ausgelöst wird – unter VBA haben wir diese Ereignisprozedur genannt. Diese erhält die ähnliche Signatur wie auch die Ereignisprozeduren etwa von Steuerelementen, also mit zwei Parametern namens sender und e:

private static void Timer_Elapsed(object sender, 
         ElapsedEventArgs e) {
     timer.Stop();
     Console.WriteLine("Zeit abgelaufen.");
     Console.ReadLine();
}

e hat hier allerdings den Typ ElapsedEventArgs. Dieses Objekt liefert neben den Standardelementen mit der Eigenschaft SignalTime die Zeit, zu der das Ereignis ausgelöst wurde. Dieses nehmen wir noch zur Ausgabe hinzu:

Console.WriteLine("Zeit abgelaufen. {0}", e.SignalTime);

Eigene Ereignisse programmieren

 

Schreibe einen Kommentar