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:

BeschreibungstextFilter
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

Weiterführende Links:

Unsere Dienstleistungen

Als starker Partner an Ihrer Seite unterstützen wir Sie in folgenden Breichen:

Access-Programmierung

Benötigen Sie Unterstützung bei der Programmierung von Access-Anwendungen? Wir bieten die gesamte Bandbreite von der Access-Programmierung auf Stundenbasis bis zur Durchführung eines Software-Projektes als Auftragsarbeit an. Kontaktieren Sie uns für ein kostenloses Erstgespräch.

JETZT KONTAKTIEREN

Software-Beratung

Haben Sie ein Software-Projekt und Sie wissen nicht, ob Access die richtige Plattform ist? Wir haben über 20 Jahre Erfahrung beim Erstellen von Windows-, Web und mobilen Anwendungen. Kontaktieren Sie uns für eine kostenlose Erstberatung.

JETZT KONTAKTIEREN