Möchtest Du den gesamten Artikel lesen? Und vielleicht sogar den Artikel im PDF-Format und die Beispieldateien herunterladen? Dann hole Dir den Artikel gleich hier - völlig kostenlos!
In Access-Anwendungen kann es interessant sein, Ordner und Dateien zu einem Datensatz verfügbar zu machen. Das bietet sich an, wann immer Dateien im Kontext eines Datensatzes in einem bestimmten Bereich im Dateisystem gespeichert sind – etwa zu Kunden, Projekten, Produkten und anderen Tabellen. In diesem Artikel zeigen wir, wie man die Verzeichnisse und Dateien eines Verzeichnisses über ein ListView-Steuerelement einfach in einem Formular anzeigen kann. Die Standardfunktionen zu diesen Elementen sollen direkt über die Einträge dieses ListView-Steuerelements verfügbar sein – zum Beispiel das Öffnen in der jeweiligen Zielanwendung, das Löschen einer Datei oder auch das Navigieren in unter- oder übergeordneten Verzeichnissen.
Wenn wir Ordner und Dateien in einem ListView-Steuerelement anzeigen wollen, haben wir verschiedene Möglichkeiten, diese Elemente einzulesen. Wir können diese in einer Tabellenstruktur mit Tabellen für Verzeichnisse und Dateien speichern und diese Daten in das ListView-Steuerelement einlesen oder einfach die Daten direkt aus dem Verzeichnis holen.
Da wir immer nur die Dateien aus einem Verzeichnis anzeigen wollen und davon ausgehen, dass es sich dabei nicht um Hunderte Elementen handelt, gehen wir den letzteren Weg und lesen die Elemente einfach direkt aus dem Dateisystem ein.
Wir benötigen also keine Tabellen, um die Elemente zwischenzuspeichern, sondern holen diese immer beim Anzeigen eines Datensatzes. So ist auch sichergestellt, dass wir den aktuellen Dateibestand anzeigen.
Datenmodell der Anwendung
Daher fügen wir der Beispielanwendung nur die beiden Tabellen aus Bild 1 hinzu. Die Tabelle tblProdukte enthält als wichtigste Information das Verzeichnis, in dem sich die Dateien zum jeweiligen Produkt befinden.

Bild 1: Tabellen der Beispielanwendung
Formular der Anwendung
Anschließend legen wir ein neues, leeres Formular namens frmProdukte in der Entwurfsansicht an.
Diesem weisen wir über die Eigenschaft Datensatzquelle die Tabelle tblProdukte hinzu und ziehen alle Felder dieser Tabelle aus der Feldliste in den Formularentwurf.
Die Felder ordnen wir anschließend wie in Bild 2 an. Das Textfeld Verzeichnis versehen wir mit dem Namen txtVerzeichnis, außerdem fügen wir neben diesem eine Schaltfläche zum Auswählen des Verzeichnisses hinzu.

Bild 2: Das Formular frmProdukte
Für das Textfeld txtVerzeichnis stellen wir die Eigenschaft Horizontaler Anker auf Beide ein, für die Schaltfläche cmdOrdnerauswahl auf Rechts und für das Bezeichnungsfeld des Textfeldes auf Links. Dadurch vergrößert sich das Textfeld, wenn wir die Breite des Formulars vergrößern.
Ordner auswählen
Für die Schaltfläche hinterlegen wir die Prozedur aus Listing 1.
Private Sub cmdOrdnerauswahl_Click() Dim strInitialFolder As String If Not Len(Nz(Me.txtVerzeichnis, 0)) = 0 Then strInitialFolder = CurrentProject.Path Else strInitialFolder = Me.txtVerzeichnis End If Me.txtVerzeichnis = ChooseFolder(strInitialFolder) End Sub
Listing 1: Prozedur zum Auswählen des Ordners für das aktuelle Produkt
Diese Prozedur prüft, ob bereits ein Verzeichnis im Textfeld gespeichert ist. Falls ja, wird es der Variablen strInitialFolder zugewiesen, anderenfalls erhält strInitialFolder den Pfad zur aktuellen Datenbank (CurrentProject.Path).
Danach ruft die Prozedur die Funktion ChooseFolder auf und übergibt dieser den Wert der Variablen strInitialFolder als Parameter.
Diese verwendet den eingebauten Office-Dialog zum Auswählen von Verzeichnissen. Dazu benötigen wir einen Verweis auf die Bibliothek Microsoft Office 16.0 Object Library, den wir über den Verweise-Dialog hinzufügen (siehe Bild 3).

Bild 3: Verweis auf die Office-Bibliothek
Die Funktion ChooseFolder deklariert eine Objektvariable auf Basis der FileDialog-Klasse und eine Variable zum Zwischenspeichern des gewählten Verzeichnisses (siehe Listing 2).
Public Function ChooseFolder(strInitialFolder As String) Dim objFileDialog As Office.FileDialog Dim strTemp As String Set objFileDialog = Application.FileDialog(msoFileDialogFolderPicker) With objFileDialog .Title = "Verzeichnis auswählen" .ButtonName = "Auswählen" .InitialFilename = strInitialFolder If .Show = True Then strTemp = .SelectedItems(1) End If End With ChooseFolder = strTemp End Function
Listing 2: Funktion zum Auswählen eines Ordners
Dann weisen wir der Variablen eine Instanz der Klasse FileDialog zu und übergeben dabei den Parameter msoFileDialogFolderPicker. Dann tragen wir die Werte für die Eigenschaften Title, ButtonName und InitialFilename ein und rufen die Methode Show auf, um den Dialog anzuzeigen.
Der Code stoppt an dieser Stelle, bis der Benutzer ein Verzeichnis ausgewählt hat, und liest dann das gewählte Verzeichnis aus. Dieses liefert die Funktion schließlich als Ergebnis zurück, sodass das gewählte Verzeichnis von der aufrufenden Prozedur in das Textfeld txtVerzeichnis eingetragen werden kann.
ListView zur Anzeige der Ordner und Dateien hinzufügen
Nun fügen wir unterhalb der bisher angelegten Steuerelemente ein ListView-Steuerelement ein. Dazu wählen wir im Ribbon den Befehl Formularentwurf|Steuerelemente|ActiveX-Steuerelemente aus. Im folgenden Dialog selektieren wir den Eintrag Microsoft ListView Control, version 6.0 (siehe Bild 4), klicken auf OK und passen anschließend die Größe des Steuerlements so an, dass es die vollständige Formularbreite einnimmt.

Bild 4: ListView-Steuerelement hinzufügen
Für das ListView-Steuerelement legen wir den Namen ctlListView fest.
ImageList zum Speichern von Icons hinzufügen
Außerdem fügen wir auf dem gleichen Weg ein ImageList-Steuerelement zum Formular hinzu und nennen es ctlImageList.
Icons einlesen
Wir wollen im ListView-Steuerelement zunächst zwei Spalten anzeigen. Die erste soll das Icon der Anwendung enthalten, mit der die jeweilige Datei standardmäßig geöffnet wird, die zweite den Dateinamen.
Diese Bilder müssen wir allerdings erst einmal ermitteln. Am besten wäre es, wenn diese in der Tabelle MSysResources landen, wo wir sie mit wenigen Codezeilen auslesen und dem ImageList-Steuerelement zuweisen können. Die größere Herausforderung ist jedoch, die Bilder für die verschiedenen Dateitypen zu erhalten.
Wie das gelingt, haben wir in einem eigenen Artikel namens VBA: Datei-Icons einlesen und speichern (www.vbentwickler.de/2) beschrieben.
Das Ergebnis der dort beschriebenen Techniken ist eine Funktion namens SaveFileIconToMSysResources, der wir den Namen der Datei, deren Icon wir erhalten wollen, und einige weitere Informationen übergeben. Als Ergebnis landen die gewünschten Dateien wie in Bild 5 in der Tabelle MSysResources.

Bild 5: Die Tabelle mit den Datei-Icons
Dateien in das ListView-Steuerelement einlesen
Die Dateien sollen immer beim Anzeigen eines Datensatzes im Formular frmProdukte in das ListView-Steuerelement geladen werden.
Deshalb füllen wir die Prozedur, die durch das Ereignis Beim Anzeigen ausgelöst wird, mit dem Aufruf der Funktion FillListView, die wir im Anschluss beschreiben. Dieser Funktion übergeben wir den Pfad aus dem Feld txtVerzeichnis:
Private Sub Form_Current() Call FillListView(Nz(Me.txtVerzeichnis, "")) End Sub
Den ersten Teil der Funktion FillListView finden wir in Listing 3. Nach dem Deklarationsteil referenzieren wir das ListView– und das ImageList-Steuerelement mit den Variablen objListView und objImageList. Dabei greifen wir jeweils über die Object-Eigenschaft auf das eigentliche ActiveX-Objekt zu, um mit allen Eigenschaften und Methoden der MSComctl-Steuerelemente arbeiten zu können.
Private Sub FillListView(strFolder As String) Dim objListView As MSComctlLib.ListView Dim objListItem As MSComctlLib.ListItem Dim objImageList As MSComctlLib.ImageList Dim strElement As String Dim lngElement As Long Dim strExtension As String Dim lngListImage As Long Dim bolVorhanden As Boolean Dim strPath As String Dim strIcon As String Set objListView = Me.ctlListView.Object Set objImageList = Me.ctlImageList.Object Me.Painting = False Set objListView.SmallIcons = Nothing objListView.ListItems.Clear objImageList.ListImages.Clear amvAddIconToImageListFromResourcesByName objImageList, "lvw_folder" With objListView .Appearance = ccFlat .BorderStyle = ccNone .Font.Name = "Calibri" .Font.Size = 10 .View = lvwReport .FullRowSelect = True .HideSelection = False .SmallIcons = objImageList .ColumnHeaders.Clear .ColumnHeaders.Add , "c0", "" .ColumnHeaders.Add , "c1", "Dateiname" End With objListView.ListItems.Clear If Not Len(strFolder) = 0 Then If Not Right(strFolder, 1) = "\" Then strFolder = strFolder & "\" End If strElement = Dir(strFolder, vbDirectory) ...
Listing 3: Funktion zum Füllen des ListView-Steuerelements, Teil 1
Dann schalten wir das Neuzeichnen des Formulars aus, bis das ListView-Steuerelement vollständig gefüllt ist. Für das ListView-Steuerelement nehmen wir anschließend einige grundlegende Einstellungen vor.
Diese könnte man teilweise auch direkt im Eigenschaftenblatt des Steuerelements setzen. Da wir jedoch in vielen Formularen identische Einstellungen benötigen, haben wir uns angewöhnt, diese Konfiguration per VBA vorzunehmen und bei Bedarf in andere Formularmodule zu übernehmen.
Auf diese Weise behalten wir die vollständige Kontrolle über das Verhalten des ListViews im Code.
Bevor wir das ListView konfigurieren, führen wir eine wichtige Initialisierung durch: Zunächst lösen wir eine eventuell bestehende Zuordnung der ImageList zum ListView, indem wir die Eigenschaft SmallIcons auf Nothing setzen.
Anschließend leeren wir sowohl die vorhandenen Einträge im ListView als auch die ListImages-Auflistung der ImageList. Dieser Schritt ist entscheidend, da Änderungen an einer ImageList zur Laufzeit nur dann stabil funktionieren, wenn sie nicht gleichzeitig von einem ListView-Steuerelement verwendet wird.
Da einige Versionen des ListView-Steuerelements keine vollständig leere ImageList akzeptieren, fügen wir anschließend mindestens ein Icon in die ImageList ein. In diesem Fall laden wir ein Ordner-Icon mit dem Namen lvw_folder aus der Tabelle MSysResources in die ImageList. Erst danach weisen wir die ImageList wieder dem ListView zu, indem wir die Eigenschaft SmallIcons entsprechend setzen.
Nun konfigurieren wir das ListView-Steuerelement. Dabei legen wir unter anderem die Darstellungsart, Schriftart und -größe sowie das Auswahlverhalten fest.
Wichtig ist an dieser Stelle auch das Einfügen der beiden Spaltenüberschriften: Zum einen eine leere Zeichenkette für die erste Spalte, in der später ausschließlich die Icons angezeigt werden, und zum anderen die Überschrift Dateiname für die zweite Spalte, in der die Namen der Dateien und Ordner erscheinen.
Anschließend prüfen wir, ob der Parameter strFolder nicht leer ist, also ob ein Verzeichnis übergeben wurde. Ist dies der Fall, stellen wir zunächst sicher, dass der Pfad mit einem Backslash (\) endet. Fehlt dieser, wird er ergänzt, damit sich die weiteren Pfadangaben korrekt zusammensetzen lassen.
Danach ermitteln wir mit der Dir-Funktion das erste Element im angegebenen Verzeichnis und speichern dessen Namen in der Variablen strElement. Dabei übergeben wir explizit den Parameter vbDirectory, um neben Dateien auch Verzeichnisse zu berücksichtigen.
Anschließend beginnt eine Do While-Schleife, die so lange durchlaufen wird, bis Dir eine leere Zeichenkette zurückliefert (siehe Listing 4).
Ende des frei verfügbaren Teil. Wenn Du mehr lesen möchtest, hole Dir ...
den kompletten Artikel im PDF-Format mit Beispieldatenbank
diesen und alle anderen Artikel mit dem Jahresabo
