Dateiauswahl per API

15.12.2006 von Helma  Spona
Erst ab Access XP bietet das Objektmodell von Access die Möglichkeit, grafische Dialoge zur Auswahl eines Dateinamens anzeigen zu lassen, über die der Benutzer eine Datei zum Öffnen oder ein Ziel zum Speichern einer Datei wählen kann. Für Anwendungen, die auch unter Access 2000 funktionieren sollen, ist das ein Problem. Hier müssen Sie auf externe Komponenten oder die Windows API ausweichen. Der Beitrag stellt den Aufruf der Windows-API-Funktionen vor.

Wie immer, wenn Sie die API nutzen möchten, benötigen Sie dazu zahlreiche Deklarationen. Die Declare-Anweisungen für die zwei API-Funktionen selbst sind da noch das kleinste Übel. Viel mehr Aufwand erfordern die Deklarationen für die Konstanten, mit denen Sie die Dialoge konfigurieren können.

Notwendige Deklarationen

Sie benötigen zunächst zwei API-Funktionen Get-OpenFileNameA und GetSaveFileNameA. Die erste Funktion benötigen Sie zur Anzeige des Öffnen- Dialogs, die zweite zur Anzeige des Dialogs Speichern unter (Listing 1). Beiden Funktionen übergeben Sie eine Datenstruktur des Typs typ- OFN, die Sie ebenfalls deklarieren müssen. Über die Eigenschaft lngFlags der Struktur beeinflussen Sie bestimmte Eigenschaften des Dialogs. Dazu müssen Sie der Eigenschaft lngFlags eine Summe von hexadezimalen Werten zuweisen, die in den Konstanten am Ende von Listing 1 festgelegt sind.

Option Compare Database
Option Explicit
Declare Function apiGOFN Lib "comdlg32.dll" _
Alias "GetOpenFileNameA" (OFN As typOFN) As Boolean
Declare Function apiGSFN Lib "comdlg32.dll" _
Alias "GetSaveFileNameA" (OFN As typOFN) As Boolean
Type typOFN
lngSize As Long
hwndOwner As Long
lngInstance As Long
strFilter As String
strCustomFilter As String
lngMaxCustFilter As Long
lngFilterindex As Long
strFile As String
lngMaxFile As Long
strFileTitel As String
lngMaxFileTitel As Long
strInitialDir As String
strTitel As String
lngFlags As Long
intFileOffset As Integer
intFileExtension As Integer
strDefExt As String
lngCustom As Long
lngHook As Long
strTemplate As String
End Type
Global Const OFN_Readonly = &H1
Global Const OFN_Prompt = &H2
Global Const OFN_HideReadOnly = &H4
Global Const OFN_NOCHANGEDIR = &H8
Global Const OFN_SHOWHELP = &H10
Global Const OFN_NOVALIDATE = &H100
Global Const OFN_ALLOWMULTISELECT = &H200
Global Const OFN_EXTENSIONDIFFERENT = &H400
Global Const OFN_PATHMUSTEXIST = &H800
Global Const OFN_FILEMUSTEXIST = &H1000
Global Const OFN_CREATEPROMPT = &H2000
Global Const OFN_SHAREAWARE = &H4000
Global Const OFN_NOREADONLYRETURN = &H8000
Global Const OFN_NOTESTFILECREATE = &H10000
Global Const OFN_NONETWORKBUTTON = &H20000
Global Const OFN_NOLONGNAMES = &H40000
Global Const OFN_EXPLORER = &H80000
Global Const OFN_NODEREFERENCELINKS = &H100000
Global Const OFN_LONGNAMES = &H200000

Die benötigten Funktionen

Sie könnten zwar die Funktionen apiGOFN und apiGSFN direkt in Ihrem Code aufrufen, besser und komfortabler ist jedoch eine weitere Funktion Dateiauswahl, die abhängig von den übermittelten Parametern die Werte an die API-Funktionen übergibt. Damit wird der Aufruf dann wesentlich einfacher. Listing 2 zeigt diese Funktion sowie die zwei Hilfsfunktionen Nullwerte- Loeschen und AddFilter. Die Funktion Nullwerte Loeschen entfernt überflüssige Nullzeichenfolgen im Rückgabewert und optimiert daher den Rückgabewert. Mit der Funktion Addfilter können Sie zu einer vorhandenen Filterangabe für das Dialogfeld einen weiteren Dateifilter hinzufügen. Wenn Sie keinen Filter angeben, werden alle Dateien angezeigt.

Function Dateiauswahl( _
Optional ByRef Flags As Variant, _
Optional ByVal AnfangsVerzeichnis As Variant, _
Optional ByVal Filter As Variant, _
Optional ByVal FilterIndex As Variant, _
Optional ByVal Erweiterung As Variant, _
Optional ByVal Dateiname As Variant, _
Optional ByVal DialogTitel As Variant, _
Optional ByVal hwnd As Variant, _
Optional ByVal boolOeffnen As Variant) As Variant
Dim OFN As typOFN
Dim strFileName As String
Dim strFileTitel As String
Dim boolErg As Boolean
' Give the dialog a caption Titel.
If IsMissing(AnfangsVerzeichnis) Then AnfangsVerzeichnis = CurDir
If IsMissing(Filter) Then
Filter = AddFilter("", "Alle Dateien (*.*)", "*.*")
End If
If IsMissing(FilterIndex) Then FilterIndex = 1
If IsMissing(Flags) Then Flags = 0&
If IsMissing(Erweiterung) Then Erweiterung = ""
If IsMissing(Dateiname) Then Dateiname = ""
If IsMissing(boolOeffnen) Then boolOeffnen = True
If IsMissing(DialogTitel) Then
If boolOeffnen = True Then
DialogTitel = "Zu öffnende Datei auswählen"
Else
DialogTitel = "Zieldatei bestimmen!"
End If
End If
If IsMissing(hwnd) Then hwnd = Application.hWndAccessApp
strFileName = left(Dateiname & String(256, 0), 256)
strFileTitel = String(256, 0)
With OFN
.lngSize = Len(OFN)
.hwndOwner = hwnd
.strFilter = Filter
.lngFilterindex = FilterIndex
.strFile = strFileName
.lngMaxFile = Len(strFileName)
.strFileTitel = strFileTitel
.lngMaxFileTitel = Len(strFileTitel)
.strTitel = DialogTitel
.lngFlags = Flags
.strDefExt = Erweiterung
.strInitialDir = AnfangsVerzeichnis
.lngInstance = 0
.lngHook = 0
.strCustomFilter = String(255, 0)
.lngMaxCustFilter = 255
End With
If boolOeffnen = True Then
boolErg = apiGOFN(OFN)
Else
boolErg = apiGSFN(OFN)
End If
If boolErg Then
If Not IsMissing(Flags) Then Flags = OFN.lngFlags
Dateiauswahl = NullWerteLoeschen(OFN.strFile)
Else
Dateiauswahl = vbNullString
End If
End Function
Function AddFilter(strFilter As String, _
strBeschreibung As String, Optional varItem As Variant) As String
If IsMissing(varItem) Then varItem = "*.*"
AddFilter = strFilter & _
strBeschreibung & vbNullChar & _
varItem & vbNullChar
End Function
Private Function NullWerteLoeschen(ByVal strItem As String) As String
Dim intPos As Integer
intPos = InStr(strItem, vbNullChar)
If intPos > 0 Then
NullWerteLoeschen = left(strItem, intPos - 1)
Else
NullWerteLoeschen = strItem
End If
End Function

Die Funktionen aufrufen

Möchten Sie nun ein Dialogfeld anzeigen, das den Benutzer zur Auswahl einer Datei beziehungsweise Angabe eines Dateinamens auffordert, müssen Sie dazu nur die Funktion Dateiauswahl aufrufen. Im einfachsten Fall sieht das wie folgt aus

Msgbox Dateiauswahl()

und würde dann den Dialog Datei öffnen anzeigen. Die fehlenden Parameter werden innerhalb der Funktion durch ihre Standardwerte ersetzt (Bild 1).

Bild 1: Der Standard-Öffnen- Dialog.

Wenn Sie beispielsweise das anzuzeigende Verzeichnis oder den Dialogtitel festlegen möchten, können Sie diese genauso als Parameter übergeben wie zusätzliche Dateifilter, die Sie vorab mit der AddFilter-Funktion einer Variablen zuweisen (Listing 3). Die Prozedur in Listing 3 ruft zuerst den Dialog Datei öffnen und danach den Dialog Speichern unter auf.

Bild 2: Der Dialog Datei öffnen.

Function DialogeTesten()
Dim strDateityp As String
Dim lngOptionen As Long
strDateityp = AddFilter(strDateityp, "Access-Datenbanken (*.mda, *.mdb)", _
"*.MDA;*.MDB")
strDateityp = AddFilter(strDateityp, "Text-Dateien (*.txt)", "*.TXT")
strDateityp = AddFilter(strDateityp, "Alle Dateien (*.*)", "*.*")
MsgBox "Ihre Wahl: " & Dateiauswahl(AnfangsVerzeichnis:="C:\", _
Filter:=strDateityp, FilterIndex:=3, Flags:=lngOptionen, _
DialogTitel:="Bitte Datei wählen!")
MsgBox "Ihre Wahl: " & Dateiauswahl(AnfangsVerzeichnis:="C:\", _
Filter:=strDateityp, FilterIndex:=3, Flags:=lngOptionen, _
DialogTitel:="Bitte Speicherziel wählen!", boolOeffnen:=False)
MsgBox Dateiauswahl()
End Function

Konfiguration über Optionen

Der Parameter Flags der Funktion Dateiauswahl erlaubt Ihnen, bestimmte Einstellungen für den Dialog festzulegen. Sie müssen die entsprechenden Konstanten nur addieren und an den Parameter Flags übergeben, beispielsweise indem Sie eine Variable mit der Summe übergeben. Mit dem Code in Listing 4 erreichen Sie beispielsweise, dass Mehrfachauswahl erlaubt ist und der Benutzer keinen Zugriff auf noch nicht verbundene Netzlaufwerke hat, weil der Netzwerk-Button ausgeblendet wird. Das Ergebnis dieses Aufrufs zeigt Bild 3. Das komplett andere Layout des Dialogs kommt daher, dass hier Mehrfachauswahl aktiviert wurde.

Bild 3: Der „angepasste“ Dialog Datei öffnen.

Function OptionenTesten()
Dim strDateityp As String
Dim lngOptionen As Long
lngOptionen = OFN_HIDEREADONLY + OFN_NONETWORKBUTTON + _
OFN_ALLOWMULTISELECT
MsgBox Dateiauswahl(lngOptionen)
End Function