Bilder in Access, Teil II: Bilder in OLE-Feldern

Für alle, die Bilder flexibel in allen Access-Versionen einbinden und verwenden möchten, bietet sich das OLE-FEld an. Dabei füllen Sie die Daten nicht so hinein, wie es der erste Teil dieser Artikelreihe beschrieben hat, sondern als Byte-Array. Das heißt, dass Sie die komplette Datei, so wie sie auch auf der Festplatte liegt, in das OLE-Feld schreiben. Von dort aus können Sie die Datei beispielsweise wieder auf die Festplatte zurückschreiben oder diese als Bild an verschiedenen Stellen anzeigen – beispielsweise als Icons im TreeView- oder ListView-Steuerelement.

Beispieldatenbank

Die Beispiele dieses Artikels finden Sie in der Datenbank 1309_Bilder.mdb.

Bild binär im OLE-Feld speichern

Bevor wir uns diese Technik ansehen, gleich die schlechte Nachricht: Es gelingt ausschließlich mit VBA. Aber das ist kein Problem, auf diesem Wege erhalten Sie gleich einige interessante Grundlagen. Bevor wir beginnen, erstellen wir eine kleine Beispieltabelle namens tblOLEBilder, welche die drei Felder OLEBildID, OLEBild und Bildname enthält (siehe Bild 1).

Tabelle mit einem OLE-Feld

Bild 1: Tabelle mit einem OLE-Feld

Außerdem erstellen wir ein Formular, mit dem wir den Import und den Export der Bilder steuern. Dieses Formular soll frmOLEBilder heißen. Wir statten es zunächst mit einer Schaltfläche aus, mit der Sie einen Dateiauswahl-Dialog anzeigen können. Diese erhält die Beschriftung Dateien hinzufügen und den Namen cmdDateienHinzufuegen. Eine weitere Schaltfläche mit der Beschriftung Datei exportieren und dem Namen cmdDateiexport legen Sie gleich daneben an. Das Formular enthält außerdem ein Unterformular-Steuerelement, welches das Unterformular sfmOLEBilder aufnimmt. Dieses Formular verwendet die soeben erstellte Tabelle tblOLEBilder als Datenherkunft und zeigt diese in der Datenblatt-Ansicht an. Im Entwurf sieht das Formular wie in Bild 2 aus.

Formular zum Importieren und Exportieren von Bilddateien

Bild 2: Formular zum Importieren und Exportieren von Bilddateien

Einlesen einer Bilddatei

Die Schaltfläche cmdDateiHinzufuegen löst die Prozedur aus Listing 1 aus. Diese deklariert zunächst zwei Variablen: strDatei nimmt eine durch das Tabulator-Zeichen getrennte Liste mehrere Dateien auf, strDateien() ist ein String-Array, dass jeweils einen der durch die Tabulator-Zeichen getrennten Zeichenketten pro Datenfeld aufnimmt. Was steckt dahinter Wir verwenden eine Funktion namens OpenFileNameMultipe zum Anzeigen eines Dateiauswahl-Dialogs, der die Auswahl mehrerer Dateien gleichzeitig erlaubt. Diese Funktion ist so ähnlich aufgebaut wie die aus dem Artikel Dialog zur Auswahl von Dateien anzeigen. Sie finden diese Funktion im Modul mdlTools der Beispieldatenbank.

Private Sub cmdDateienHinzufuegen_Click()
     Dim strDatei As String
     Dim strDateien() As String
     Dim i As Integer
     strDatei = OpenFileNameMultiple(CurrentProject.Path, "Bild auswählen", _
         "Bilddateien (*.png;*.bmp,*.jpg,*.tif,*.gif)|Alle Dateien (*.*)")
     strDateien = Split(strDatei, vbTab)
     For i = LBound(strDateien) To UBound(strDateien)
         DateiEinlesen strDateien(i)
     Next i
End Sub

Listing 1: Vorbereitungen für das Einlesen einer oder mehrerer Dateien in ein OLE-Feld

Der Aufruf der Funktion OpenFileNameMultiple erwartet als Parameter das Startverzeichnis (hier das mit CurrentProject.Path ermittelte aktuelle Anwendungsverzeichnis), einen Titel sowie die Angabe des Filters für die anzuzeigenden Dateien.

Das Ergebnis des Dialogs, der etwa wie in Bild 3 aussieht, ist die erwähnte Zeichenkette, welche Pfad und Name aller ausgewählten Dateien getrennt durch das Tabulator-Zeichen enthält. Wir verwenden nun die Split-Funktion von VBA, um die einzelnen Elemente dieser Zeichenkette auf die Felder eines Arrays aufzuteilen, und zwar genau an den Tabulator-Zeichen, die durch die Zeichenkonstante vbTab identifiziert werden.

Dialog zum Auswählen der zu importierenden Dateien

Bild 3: Dialog zum Auswählen der zu importierenden Dateien

Dieses Array durchlaufen wir nun in einer For…Next-Schleife, die den Index des ersten Elements mit der LBound-Funktion ermittelt und den des letzten Elements mit UBound. Für alle in den Feldern enthaltenen Dateinamen ruft die Prozedur jeweils einmal eine weitere Routine namens DateiEinlesen auf.

Bilddatei einlesen

Diese finden Sie in Listing 2. Die Prozedur erwartet den Dateinamen als Parameter. Sie deklariert ein Database– und ein Recordset-Objekt, um per DAO auf die Tabelle tblOLEBilder zugreifen und das neue Bild in einen neuen Datensatz einfügen zu können. Das dazu erstellte Recordset liefert allerdings keine Datensätze, da es als Kriterium den Ausdruck 1=2 verwendet. Der Grund ist, dass diese Prozedur lediglich einen Datensatz anfügen soll und nicht auf vorhandene Datensätze zugreift. Die Variable lngFileID nimmt die Nummer auf, mit der die später einzulesende Datei beim öffnen gekennzeichnet wird. Damit eine noch nicht verwendete Nummer für den Zugriff verwendet wird, ermitteln wir diese mit der VBA-Funktion FreeFile und speichern sie in lngFileID.

Public Sub DateiEinlesen(strDatei As String)
     Dim db As DAO.Database
     Dim rst As DAO.Recordset
     Dim lngFileID As Long
     Dim Buffer() As Byte
     Dim lngFileLen As Long
     Set db = CurrentDb
     Set rst = db.OpenRecordset("SELECT * FROM tblOLEBilder WHERE 1=2", dbOpenDynaset)
     rst.AddNew
     lngfileid = FreeFile
     Open strDatei For Binary Access Read Lock Read Write As lngFileID
     lngFileLen = LOF(lngFileID)
     ReDim Buffer(lngFileLen)
     rst.AddNew
     rst!OLEBild = Null
     rst!Bildname = Mid(strDatei, InStrRev(strDatei, "\") + 1)
     Get lngfileid, , Buffer
     rst!OLEBild.AppendChunk Buffer
     rst.Update
     rst.Close
     Set rst = Nothing
     Set db = Nothing
     Me!sfmOLEBilder.Form.Requery
End Sub

Listing 2: Einlesen einer Datei in ein OLE-Feld

Möchten Sie weiterlesen? Dann lösen Sie Ihr Ticket!
Hier geht es zur Bestellung des Jahresabonnements des Magazins Access [basics]:
Zur Bestellung ...
Danach greifen Sie sofort auf alle rund 400 Artikel unseres Angebots zu - auch auf diesen hier!
Oder haben Sie bereits Zugangsdaten? Dann loggen Sie sich gleich hier ein:

Schreibe einen Kommentar