|  | Unser Angebot für Sie! Lesen Sie diesen Beitrag und 500 andere sofort im Onlinearchiv, und erhalten Sie alle zwei Monate brandheißes Access-Know-how auf 72 gedruckten Seiten! Plus attraktive Präsente, zum Beispiel das bald erscheinende Buch 'Access 2010 - Das Grundlagenbuch für Entwickler'! |
| | | | | |
Zusammenfassung
Erfahren Sie, wie Sie mit Schnittstellenklassen die Nutzung gleichartiger Implementierungen vereinheitlichen.
Techniken
VBA, Klassenprogrammierung
Voraussetzungen
Access 2000 und höher
Beispieldateien
Schnittstellen.mdb
Shortlink
www.access-im-unternehmen.de/734
Schnittstellenvererbung
André Minhorst, Duisburg
Access-Entwickler sind nicht gerade verwöhnt, wenn es um objektorientierte Techniken unter VBA geht. Es gibt zwar die Möglichkeit, Klassen zu programmieren und Objekte auf Basis dieser Klassen zu erzeugen, aber Features wie Vererbung fallen weitgehend flach. Weitgehend? Nun, zumindest die sogenannte Schnittstellenvererbung ist unter VBA möglich. Damit können Sie immerhin mehrere Ausprägungen einer Klasse nach den Vorgaben einer Schnittstelle implementieren und diese je nach Bedarf austauschen.
Bevor wir uns den technischen Feinheiten widmen, schauen wir uns erstmal den Sinn und Zweck der Schnittstellenvererbung an. Es gibt Anforderungen, die sehr ähnliche Vorgänge mit verschiedenen Techniken umsetzen. Ein Beispiel dafür ist das Versenden von E-Mails: Sie können dazu Outlook fernsteuern oder alternativ eine der vielen Klassen zum direkten Versenden von E-Mails via Winsock und SMTP einsetzen. Für Ihre Anwendung ist das Ziel immer gleich: Die E-Mail soll beim Empfänger ankommen und dafür stellen wir ein Paket aus Informationen wie Empfänger, Absender, Betreff und Inhalt der E-Mail zusammen. Der Rest interessiert uns nicht - dies sollen entsprechende Prozeduren erledigen.
Ein ähnliches Beispiel ist die Ausgabe von Daten. Diese sollen einmal in einem Bericht landen, ein anderes Mal in einem Word-Dokument, vielleicht aber auch einfach in einer Textdatei, in einem HTML- oder XML-Dokument oder als schlichte Ausgabe im Direktfenster des VBA-Editors.
Auch hier haben wir wenig Lust, uns darum zu kümmern, wie der Inhalt im entsprechenden Ausgabeformat landet - wir möchten höchstens festlegen, welches Ausgabeformat verwendet wird und gegebenenfalls die dorthin geschickten Daten filtern oder sortieren.
Dies alles ist mit herkömmlichen Prozeduren möglich. Im Falle der E-Mails würden Sie die Daten wie Absender, Empfänger, Betreff und Text etwa per Formular abfragen und dann die Prozedur zum Versenden der E-Mail aufrufen.
Diese entscheidet dann auf Basis vorher festgelegter Kriterien, ob die E-Mail mit Outlook oder direkt per SMTP verschickt wird, und steuert den entsprechenden Zweig einer If...Then- oder Select Case-Bedingung an. In den verschiedenen Zweigen steckt dann versandspezifischer Code oder schlicht ein Aufruf einer Funktion, welche den Versand auf die angegebene Weise durchführt.
Sie würden dann beispielsweise zwei Funktionen definieren, deren Prozedurköpfe etwa so aussehen:
Public Function MailToOutlook(strSender As String, strRecipient As String, strSubject As String, strBody As String)
Public Function MailToSMTP(strSender As String, strRecipient As String, strSubject As String, strBody As String)
Die aufrufende Prozedur enthielte dann beispielsweise den folgenden Code:
Select Case strVersandart
Case "Outlook"
Call MailToOutlook (...)
Case "SMTP"
Call MailToSMTP (...)
End Select
Sie haben hier alle Freiheiten: Die Funktionen MailToOutlook oder MailToSMTP könnten beispielsweise auch zusätzliche Parameter verwenden, oder Sie erweitern das Select Case-Statement um eine dritte Methode zum Versenden von E-Mails.
Klasse Funktion
Die Funktionen zum Versenden von E-Mails könnten auch in zwei Klassen ausgelagert werden. Die Klasse zum Versenden von E-Mails via SMTP könnte beispielsweise wie in Listing 1 aussehen. Die Klasse für den Versand mit Outlook sieht genauso aus, nur dass die Methode zum Versenden der E-Mail den Namen SendSMTPMail besitzt.
Listing 1: Klasse zum Versenden von E-Mails via SMTP
Private m_Sender As String
Private m_Recipient As String
Private m_Subject As String
Private m_Body As String
Public Property Let Sender(strSender As String)
m_Sender = strSender
End Property
Public Property Let Recipient(strRecipient As String)
m_Recipient = strRecipient
End Property
Public Property Let Subject(strSubject As String)
m_Subject = strSubject
End Property
Public Property Let Body(strBody As String)
m_Body = strBody
End Property
Public Function SendSMTPMail() As Boolean
'... Code zum Senden der Mail per SMTP
SendSMTPMail = True
End Function
Eine Prozedur, welche eine dieser beiden Klassen aufruft, sieht etwa wie in Listing 2 aus. Sie bekommt per Parameter den Versender, den Empfänger, den Betreff und den Inhalt sowie die Versandart übermittelt. Mit diesen Informationen entscheidet die Select Case-Bedingung, welcher der beiden Zweige angesteuert werden soll.
Listing 2: Instanzierung der Klassen zum Versenden von E-Mails und Versenden der E-Mail
Public Sub MailVersenden(strAbsender As String, strEmpfaenger As String, strBetreff As String, strInhalt As String, strVersandart As String)
Dim objSendSMTPMail As clsSendSMTPMail
Dim objSendOutlookMail As clsSendOutlookMail
Select Case strVersandart
Case "SMTP"
Set objSendSMTPMail = New clsSendSMTPMail
With objSendSMTPMail
.Sender = strAbsender
.Recipient = strEmpfaenger
.Subject = strBetreff
.Body = strInhalt
If .SendSMTPMail = True Then
MsgBox "Versand via SMTP erfolgreich!"
End If
End With
Case "Outlook"
Set objSendOutlookMail = New clsSendOutlookMail
With objSendOutlookMail
.Sender = strAbsender
.Recipient = strEmpfaenger
|