Ein Dateidialog mit OLE-Automation ◦ ?

Das Thema ActiveX-Steuerelemente illustriert, wie eine selbstständig nicht lauffähige Bibliotheksdatei (DLL) jeder Anwendung ihre Dienste anbietet, die sich an den COM-Standard von Microsoft hält. Selbständig lauffähige Anwendungen wie MS Excel sind ebenfalls in der Lage, Objekte und Methoden zu exportieren. Wir veranschaulichen dies ebenfalls am Beispiel eines Dateidialogs. Nur ist es diesmal nicht eine kleine DLL, sondern eine ganze Anwendung, welche ihre Dienste anbietet.

### Benutzersicht eines Dateidialogs

Das Objektmodell von Access bietet kein Steuerelement in der Art des folgenden "Speichern als"-Dateidialogs:

Der Benutzer wählt den Speicherpfad der Aufgabenbank Access Quiz 39, indem er aus dem Pop-Up-Formular FrmExportAccessQuizMitSelbstkorrektur auf eine der Schaltflächen 'Quiz mit Selbstkorrektur' oder 'Quiz mit Fremdkorrektur' drückt.

Weil Access keinen vordefinierten Dateidialog anbietet, bleiben der Entwicklerin drei Möglichkeiten:

1. Sie entwickelt ein eigenes Dateidialog-Formular

2. Sie importiert ein ActiveX-Steuerelement

3. Sie importiert die gewünschte Funktionalität per OLE-Automation aus einer anderen Applikation

OLE-Automation ist oft mächtiger, aber weniger effizient und stabil als ActiveX Controls. TESTS implementiert deshalb Dateidialoge als ActiveX-Steuerelemente.

### Wie greift Access auf das Objektmodell von Excel zu?

####

#### Dateidialog anzeigen

Weil alle Applikationen von MS Office über das gemeinsame Component Object Model (COM) verbunden sind, kann der Access-Entwickler leicht auf das Objektmodell von Excel zugreifen. In der Objekthierarchie von Exel finden Sie die Methode GetSaveAsFilename. Zuerst öffnet der Entwickler mit »Extras/Verweise die Microsoft Excel 10.0 Object Library. Dann vereinbart er in seinem Code eine

Objektvariable, die auf das ausgewählte Objekt verweist (Den vollständigen Automationscode dieses Hilfethemas finden Sie in Testverwaltung.mdb als Kommentar):

>     Dim xls As New Excel.Application

Die folgende Funktion verwendet den Excel-Dateidialog SaveAsFilename und ermittelt aus dem zurückgegebenen Dateipfad den Verzeichnispfad pub_VerzeichnisVonSaveAs:

>     '~~~ Öffnet SaveAsFilename-Dialogfeld und gibt (ohne zu speichern) das Verzeichnis des
>     '    gewählten Pfads oder "" zurück
>     Public Function pub_VerzeichnisVonSaveAs(Titel As String, Dateiname As String) As String
>       Dim Pfad As Variant		'Variant, um Typenkonflikt mit Rückgabewert False zu vermeiden
>       Dim xls As New Excel.Application

>       'Aufruf der Excel-Methode GetSaveAsFilename nach der COM-Konvention (OLE-Automatisierung)
>       '<Application>.GetSaveAsFilename(InitialFilename, FileFilter, ..., Title, ...) ergibt nach
>       'Abbruch False (vgl. Form_Open/Form_Unload von FrmStart, GetOpenFilename von FrmTestauswahl)
>       If LCase(Right(Dateiname, 3)) = "mdb" Then
>         Pfad = xls.GetSaveAsFilename(InitialFilename:=Dateiname, _
>                                      fileFilter:="Datenbanken (*.mdb), *.mdb)", _
>                                      Title:=Titel)
>       Else
>         Pfad = xls.GetSaveAsFilename(InitialFilename:=Dateiname, _
>                                      fileFilter:="Tabellenblätter (*.xls), *.xls)", _
>                                      Title:=Titel)
>       End If
>       If Pfad <> False Then
>         pub_VerzeichnisVonSaveAs = Left(Pfad , InStrRev(Pfad , "\")) 	'Dateiname entfernen
>       Else
>         pub_VerzeichnisVonSaveAs = ""
>       End If
>       xls.Quit                                     				'Excel beenden
>       Set xls = Nothing                            				'Verweis freigeben
>     End Function

#### Standardarbeitsordner ändern

Anfangswert (engl. default) des Felds 'Speichern in:' des Dateidialogs ist der Standardarbeitsordner von Excel. Ein Dateidialog von TESTS soll aber vom Startverzeichnis von Testverwaltung.mdb ausgehen. Wir stellen deshalb nach dem Start von Testverwaltung.mdb den Standardarbeitsordner auf das Startverzeichnis ein und setzen den Standardarbeitsordner wieder zurück, sobald der Benutzer die Anwendung verlässt:

##### a) Initialisierung beim Start von Testverwaltung.mdb

FrmStart zeigt nicht nur das Eingangsmenü an, sondern initialisiert auch globale Variablen. Wir könnten deshalb mit der Zuweisung xls.DefaultFilePath = pub_Startverzeichnis den Standardarbeitsordner DefaultFilePath von Excel durch das Startverzeichnis von Testverwaltung.mdb ersetzen. Im obigen Bildschirmausschnitt steht das Startverzeichnis Fallbeispiel TESTS anstelle der Excel-Voreinstellung My Documents. Die öffentliche Variable pub_DefaultFilePathBefore speichert diesen Ordner, damit er vor Verlassen von Testverwaltung.mdb wieder zurückgesetzt werden kann.

>     Private Sub Form_Open(Cancel As Integer)
>       ...
>       '-- Ersetzt für die Zeit der Sitzung den bisherigen Excel-Standardarbeitsordner
>       '   (Dieser Initialisierung entspricht die Wiederherstellung des ursprünglichen
>       '   Standardarbeitsordner durch die Finalisierungsprozedur Form_Unload von FrmStart)
>       pub_DefaultFilePathBefore = xls.DefaultFilePath
>       xls.DefaultFilePath = pub_Startverzeichnis
>       ...
>     End Sub

##### b) Finalisierung beim Verlassen von Testverwaltung.mdb

Weil der Standardarbeitsordner nur für die Sitzung mit Testsverwaltung.mdb geändert bleiben soll, setzt die folgende Ereignisprozedur vor dem Verlassen von Testverwaltung.mdb den Standardarbeitsordner zurück:

>     '--- Setzt den in Form_Open geänderten Standardarbeitsordner von Excel wieder zurück
>     '    (Dieser Finalisierung entspricht die Initialisierung der Ereignisprozedur Form_Open.
>     '    FrmStart ist das einzige TESTS-Formular, das nicht vom Benutzer geschlossen werden
>     '    kann, also automatisch vor dem Verlassen von Access geschlossen wird. Form_Unload
>     '    von FrmStart eignet sich deshalb für Finalisierungsaktionen)
>     Private Sub Form_Unload(Cancel As Integer)
>       ...
>       xls.DefaultFilePath = pub_DefaultFilePathBefore
>       ...
>     End Sub