Datei mit Common-Dialog öffnen
Veröffentlicht am 30.12.2003
Common-Dialoge erlauben das komfortable Durchsuchen und Auswählen einer Datei, die anschließend geöffnet bzw. gespeichert werden kann.
Diese Dialoge können Sie mit Hilfe von API-Funktionen auch in Ihren Access-Anwendungen einsetzen.
Den Dialog zum Öffnen einer Datei erreichen Sie beispielsweise mit der Funktion GetOpenFileName, die Sie folgendermaßen deklarieren:
Declare Function GetOpenFileName Lib "comdlg32.dll" Alias "GetOpenFileNameA" _(pOpenfilename As OPENFILENAME) As Long
Der Parameter pOpenfilename ist ein benutzerdefinierter Datentyp, der Information zur Funktionalität und zum Aussehen des Dialogs enthält. Diesen Datentyp sollten Sie zusammen mit ein Paar nützlichen Konstanten in einem Access-Modul definieren:
Public Const OFN_FILEMUSTEXIST = &H1000
Public Const OFN_READONLY = &H1
Public Const OFN_HIDEREADONLY = &H4
Type OPENFILENAME
lStructSize As Long ' Länge des Datentyps OPENFILENAME
hwndOwner As Long ' Fenster, unter dem Dialog erscheint
hInstance As Long ' nicht setzen
lpstrFilter As String ' Zeichenkette von Anzeigenfiltern im Dialog
lpstrCustomFilter As String ' nicht setzen
nMaxCustFilter As Long ' nicht setzen
nFilterIndex As Long ' 1 zum Benutzen der FIlter
lpstrFile As String ' String, der ausgewählte Datei bekommt
nMaxFile As Long ' Länge von lpstrFile
lpstrFileTitle As String ' Dateiname ohne Pfad
nMaxFileTitle As Long ' nicht setzen
lpstrInitialDir As String ' Standardordner
lpstrTitle As String ' Titel des eigentlichen Dialogfensters
Flags As Long ' verschiedene Optionen
nFileOffset As Integer ' nicht setzen
nFileExtension As Integer ' nicht setzen
lpstrDefExt As String ' Standarderweiterung
lCustData As Long ' nicht setzen
lpfnHook As Long ' nicht setzen
lpTemplateName As Long ' nicht setzen
End Type
Einige Elemente dieses Typs sind für unsere Zwecke nicht interessant bzw. können unter Access nicht eingesetzt werden.
Bei der Übergabe von Zeichenketten an Elemente des Typs String ist es sehr wichtig, dass Sie einen NULL-Wert an den String anhängen. Dies erledigen Sie mit Hilfe des Ausdrucks
Chr$(0): MyString = MyString & Chr$(0)
Das Element lpstrFilter repräsentiert einen Zeiger auf einen String, den Sie mit einer Beschreibung des Filters und dem eigentlichen Filter aufbauen. Der String darf auch mehrere Filter beinhalten, solange sie durch NULL-Werte getrennt werden. Das Ende des Strings wird von zwei NULL-Werten abgerundet.
Nehmen Sie beispielsweise an, Sie möchten folgende Filter in Ihrem Dialog zur Verfügung stellen:
Beschreibungstext | Filter |
Datenbanken | *.mdb, *.mda |
Word-Dokumente | *.doc |
Alle Dateien | *.* |
Den Filter-String setzen Sie dann wie folgt zusammen:
Filter:="Datenbanken" & Chr$(0) & "*.MDB;*.MDA" & Chr$(0) & _
"Word-Dokumente" & Chr$(0) & "*.DOC" & Chr$(0) & _
"Alle Dateien" & Chr$(0) & "*.*" & Chr$(0) & Chr$(0))
Die vollständige Funktion, die einen Dialog zum Öffnen einer Datei anzeigt und die ausgewählte Datei zurückgibt, könnte wie folgt aufgebaut sein:
Public Function DateiÖffnen(Optional Titel, Optional Filter, Optional DefExtension, Optional AktDir) As String
Dim strDateiName As String, strDlgTitel As String
Dim strFilter As String, strDefExtension As String
Dim strAktDir As String, OpenDlg As OPENFILENAME
Dim strNull as String
strNull = Chr$(0)
'der String sollte lang genug für einen Win-95 Pfad sein
strDateiName = String$(512, 0)
If IsMissing(Filter) Then
'alle Dateien anzeigen
strFilter = "Alle Dateien" & strNull & "*.*" & strNull & strNull
Else
strFilter = Filter
End If
If IsMissing(DefExtension) Then
strDefExtension = strNull ' keine Default-Erweiterung
Else
strDefExtension = DefExtension & strNull
End If
If IsMissing(AktDir) Then
strAktDir = CurDir$ & strNull ' aktuelles Verzeichnis ermitteln
Else
strAktDir = AktDir & strNull
End If
With OpenDlg
.lStructSize = Len(OpenDlg)
.hwndOwner = Screen.ActiveForm.Hwnd
.lpstrFilter = strFilter
.nFilterIndex = 1
.lpstrFile = strDateiName
.nMaxFile = Len(strDateiName)
.lpstrInitialDir = strAktDir
.lpstrTitle = strDlgTitel
.Flags = OFN_FILEMUSTEXIST Or OFN_READONLY
.lpstrDefExt = strDefExtension
If GetOpenFileName(OpenDlg) <> 0 Then
' restliche NULL-Werte abschneiden
DateiÖffnen = Left$(.lpstrFile, InStr(.lpstrFile, strNull) - 1)
Else
DateiÖffnen = ""
End If
End With
End Function
If IsMissing(Titel) Then
strDlgTitel = "Datei öffnen" & strNull ' Standardtitel verwenden
Else strDlgTitel = Titel & strNull
End If
Ein typischer Aufruf der Funktion könnte ungefähr so aussehen:
Private Sub btnDateiÖffnen_Click()
Dim fn As String
fn = DateiSpeichern(Titel:="Testdialog - Öffnen", DefExtension:="txt", _
Filter:="Datenbanken" & strNull & "*.MDB;*.MDA" & strNull & _
"Word-Dokumente" & strNull & "*.DOC" & strNull & _
"Alle Dateien" & strNull & "*.*" & strNull & strNull)
End Sub