Das Öffnen eines Dialogs zum Auswählen des Namens einer zu speichernden Datei erledigen Sie beispielsweise mit der API-Funktion “GetSaveFileDialog”. Diese stellen wir im vorliegenden Beitrag für 32-Bit- und 64-Bit-Office vor. Dabei weisen wir auch auf die Änderungen hin, die für das Update einer eventuell bereits bestehenden 32-Bit-Version auf die 64-Bit-Version notwendig sind.
Die API-Funktion GetSaveFileDialog ist eine Funktion der Bibliothek comdlg32.dll. Sie erwartet alle Parameter, die das Aussehen des Speichern-Dialogs beeinflussen, in Form eines Typs namens OPENFILENAME. Er heißt OPENFILENAME, weil er in gleicher Form auch für die API-Funktion zum Anzeigen eines Datei öffnen-Dialogs zum Einsatz kommt. Sie liefert den Pfad der zu speichernden Datei zurück oder eine leere Zeichenkette, falls kein Name ausgewählt wurde – zum Beispiel, weil der Benutzer den Dialog mit der Abbrechen-Schaltfläche geschlossen hat.
Die Wrapper-Funktion GetSaveFile
Vor dem Aufruf der API-Funktion GetSaveFileDialog füllt man also den Typ OPENFILENAME mit den gewünschten Einstellungen.
Da Sie das nicht jedes Mal erledigen sollen, wenn Sie diese Funktion zu einer Ihrer Anwendungen hinzufügen wollen, liefern wir eine Wrapperfunktion namens GetSaveFile. Diese sieht wie in Listing 1 aus.
Public Function GetSaveFile(Optional strStartDir As String, _ Optional strDefFileName As String, _ Optional strFilter As String = "Alle Dateien (*.*)", _ Optional strTitle As String) As String Dim udtOpenFileName As OPENFILENAME Dim strExt As String On Error GoTo Fehler If Len(strStartDir) = 0 Then strStartDir = CurrentProject.Path End If With udtOpenFileName .nStructSize = LenB(udtOpenFileName) .hwndOwner = Application.hWndAccessApp strFilter = strFilter & vbNullChar & vbNullChar .sFilter = strFilter .nFilterIndex = 1 .sInitDir = strStartDir & vbNullChar .sDlgTitle = strTitle .sFile = Space$(256) & vbNullChar .nFileSize = Len(.sFile) If Len(strDefFileName) <> 0 Then Mid(.sFile, 1) = strDefFileName End If .sFileTitle = Space$(256) & vbNullChar .nTitleSize = Len(.sFileTitle) If GetSaveFileName(udtOpenFileName) Then GetSaveFile = Left(udtOpenFileName.sFile, InStr(.sFile, vbNullChar) - 1) Else GetSaveFile = "" End If End With Ende: Exit Function Fehler: MsgBox Err.Description, vbCritical, "GetSaveFileName" Resume Ende End Function
Listing 1: Wrapperfunktion für die API-Funktion GetSaveFileName
Dies sind die Parameter:
- strStartDir: Hier geben Sie das Verzeichnis an, das beim Öffnen des Dialogs vorausgewählt werden soll.
- strDefFileName: Vordefinierter Dateiname, der beim Öffnen des Dialogs im Feld Dateiname eingetragen werden soll.
- strFilter: Ein Ausdruck, der angibt, welche Dateitypen als Speichername verwendet werden dürfen.
- strTitle: Titel des Dialogs
Ablauf von GetSaveFile
Der Wrapperfunktion für die API-Funktion GetSaveFileName haben wir einen etwas verkürzten Namen gegeben – eben GetSaveFile. Sie definiert als Erstes eine Variable namens udtOpenFileName des Typs OPENFILENAME. Wie dieser genau aussieht und deklariert wird, zeigen wir weiter unten.
Dieser Typ arbeitet wie eine Klasse und hat verschiedene Eigenschaften, die wir mit der Funktion GetSaveFile füllen. nStructSize nimmt beispielsweise die Größe des Typs udtOpenFileName entgegen, die wir mit der Funktion LenB ermitteln. Das ist übrigens auch eine der Änderungen der 64-Bit-Version gegenüber der 32-Bit-Version – früher wurde hier die Funktion Len verwendet. Len ermittelt die Anzahl der Zeichen einer Zeichenkette, LenB die Anzahl der Bytes dieser Zeichenkette. hwndOwner füllen wir mit dem Handle des aktuellen Fensters. Den Filter aus dem Parameter strFilter erweitern wir noch um zwei vbNullChar, bevor wir ihn der Eigenschaft sFilter zuweisen. Gültige Werte dazu schauen wir uns gleich im Anschluss an. Welcher der Filter voreingestellt wird, legt die Funktion für die Eigenschaft nFilterIndex fest, in diesem Fall mit dem Wert 1.
Das mit dem Parameter strStartDir übergebene Startverzeichnis ergänzt die Funktion ebenfalls um vbNullChar und schreibt sie dann in die Eigenschaft sInitDir. Der Titel für den Dialog landet unbehandelt in sDlgTitle.
In sFile trägt die Funktion eine leere Zeichenkette mit einer Länge von 256 Zeichen und einem abschließenden vbNullChar ein. nFileSize erhält die Länge von sFile.