Datei mit Common-Dialog öffnen

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

Weiterführende Links:

Weitere Tipps & Tricks

30.12.2003

Datei mit Common-Dialog schließen

Genauso, wie Sie durch den Einsatz der Common-Dialoge Dateien zum Öffnen selektieren können, so können Sie auch Dialoge zum Speichern einer Datei verwenden.

Tipp/Trick

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.

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.