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).
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.
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.
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: