Dateipfade im Griff

By , 2. März 2012

Jeder hat sicherlich mal das Problem gehabt in seiner Access-Anwendung mit Dateipfaden klar zu kommen. Sei es der Pfad zu Bildquellen, oder zu externen Datenbanken.

Auf eine Idee dazu hat mich heute eine Frage im Access-o-Mania Forum gebracht, wobei ich spontan an CurrentdbC denken musste. Bei CurrentdbC wird ein Objekt über eine Property zugänglich gemacht, das gleiche geht ja auch mit einer String. darauf hab ich ein bisschen gebastelt und eine sehr brauchbare Lösung erarbeitet die ich euch nicht vorenthalten möchte.

Wie gewohnt erstellt man zuerst eine Tabelle wo die Pfade gespeichert werden:


Das Feld Pfad habe ich als Memo-Feld ausgeführt.

Im zweiten Schritt erstellt man ein Standardmodul und trägt folgenden Code ein:

Option Explicit

Private m_pfad1 As String
Private m_pfad2 As String
Private m_pfad3 As String

Public Property Get getPfad1() As String
    If (m_pfad1 = "") Then
        m_pfad1 = GetVerzeichnis("Pfad1")
    Else
        'Teste ob Pfad noch stimmt
        If Dir(m_pfad1, vbDirectory) = "" Then
            'hole neuen Pfad
            m_pfad1 = GetPath
            'neuen Pfad speichern
            savePath "Pfad1", m_pfad1
        End If
    End If
    getPfad1 = m_pfad1
End Property

Wer CurrentdbC kennt dem wird der Aufbau der Property getPfad1() bekannt vorkommen. Diese Property kopiert ihr (in meinem Beispiel) noch 2x und ändert jeweis Pfad1, m_pfad1 und getPFad1 ab indem ihr einfach aus der 1 eine 2 bzw. eine 3 macht.

Die Property funktioniert so:
Wenn man sie das erste mal aufruft, (m_pfad1 ist „“) GetVerzeichnis(„Pfad1“) aufgerufen. Diese Funktion startet einen Verzeichnisdialog und gibt das ausgewählte Verzeichnis zurück welcher die Property selbst zurück gibt.
Ab dem zweiten Aufruf (m_pfad1 ist gesetzt) wird geprüft ob der Pfad in m_pfad1 noch stimmt. Falls nicht wird die Funktion GetPath aufgerufen welche den Verzeichnis dialog öffnet und das gewählte Verzeichnis zurück gibt. Anschließend wird die Funktion savePath aufgerufen, welche den geänderten Pfad in der Tabelle aktualisiert. Danach gibt die Property den korrekten Pfad zurück.

Kommen wir zuerst zur Funktion GetVerzeichnis. Die Funktion ist vom Typ Private, da sie nur innerhalb des Moduls aufgerufen wird. Übergeben wird der Pfadname, zurückgegeben wird der korrekte Pfad:

Private Function GetVerzeichnis(ByVal Pfadname As String) As String
    Dim t_pfad As String
    t_pfad = Nz(DLookup("Pfad", "Dateipfade", "Pfadname = '" & Pfadname & "'"), "")
    If t_pfad = "" Or Dir(t_pfad, vbDirectory) = "" Then
        t_pfad = GetPath
    End If
    savePath Pfadname, t_pfad
    GetVerzeichnis = t_pfad
End Function

per Dlookup() wird in der Tabelle der gespeicherte Pfad geholt. Danach wird geprüft ob es überhaupt einen Pfad gibt und falls es einen gibt ob er auch noch stimmt. Ist die Prüfung in Ordnung gibt die Funktionden Pfad zurück, falls nicht wird der Verzeichnisdialog mit der Funktion GetPath aufgerufen welche dann einen neuen PFad zurück gibt. In diesem Falle wird auch der neue Pfad in der Tabelle aktualisiert durch die Funktion savePath.

Die Funktion getPath ist ziemlich simple und enthält nur 1 Zeile. Man hätte auch getrost auf sie verzichten können und statt dessen den darin befindlichen Prozeduraufruf verwenden können.

Private Function GetPath() As String
    GetPath = BrowseForFolder("Bitte Verzeichnis auswählen") & "\"
End Function

Die Funktion BrowseForFolder im Modul „FolderBrowse“ stammt nicht von mir selbst, sondern von Ingo Steinhaus. Daher werde ich nur den Link zum Orginal hier veröffentlichen:

Zum Schluss noch die Prozedur savePath. Übergabeparameter sind Pfadname und der Pfad. In der Prozedur wird über Currentdb einfach eine Aktualisierungsabfrage abgeschickt. Da PFadname und Pfad vom Typ String sind dürfen die kleinen Hochkommatas nicht fehlen sonst meckert der Compiler.

Private Sub savePath(ByVal Pfadname As String, ByVal Pfad As String)
    Dim db As DAO.Database
    Set db = CurrentDb
    db.Execute "Update Dateipfade set Pfad = '" & Pfad & "' Where Pfadname = '" & Pfadname & "'"
    set db = Nothing
End Sub

Die Anwendung ist recht einfach. Überall wo Ihr z.B. den Pfad1 benötigt könnt ihr jetzt getPfad1 schreiben.
Beispiel Bild aus Textfeld „Bildname1“ anzeigen: Me.Bild1.Picture = getPfad1 & Me.Bildname1

So das war es. Bedenkt noch zum Schluss dass, wenn Ihr die Felder in der Tabelle anderst benennt, dass auch in den Prozeduren die Bezeichner geändert werden. Wenn ihr eigene Properties für eure Pfade erstellt, denkt daran dass ihr im Deklarationsteil die privaten Variablen erstellt.

Wer mit dem Code Probleme hat kann mir eine Email schicken, er bekommt von mir dann eine Beispiel-Anwendung.

Bis dahin
© Andreas Vogt 2012

Leave a Reply

You must be logged in to post a comment.

OfficeFolders theme by Themocracy