API-Funktion GetSaveFileDialog (32-Bit und 64-Bit)

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.

Sie haben das Ende des frei verfügbaren Textes erreicht. Möchten Sie ...

TestzugangOder bist Du bereits Abonnent? Dann logge Dich gleich hier ein. Die Zugangsdaten findest Du entweder in der aktuellen Print-Ausgabe auf Seite U2 oder beim Online-Abo in der E-Mail, die Du als Abonnent regelmäßig erhältst:

Schreibe einen Kommentar