Home > Artikel > Ausgabe 9/2013 > Bilder in Access, Teil II: Bilder in OLE-Feldern

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

Achtung: Sie sind nicht angemeldet. Wenn Sie Abonnent sind und sich anmelden, lesen Sie den kompletten Artikel, laden das PDF herunter oder probieren die Beispieldatenbank aus (sofern vorhanden).

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

Fehlt noch die Variable Buffer(), die als Array mit dem Datentyp Byte deklariert wird und den Inhalt der einzulesenden Datei aufnehmen soll. Die Prozedur öffnet dann mit der Open-Anweisung die mit strDatei übergebene Datei, und zwar für den binären Zugriff und referenziert diese mit der in lngFileID gespeicherten Dateinummer.

Die LOF-Funktion ermittelt dann die Länge der so geöffneten Datei und speichert die Länge in der Variablen lngFileLen. Damit das Byte-Array Buffer die Datei aufnehmen kann, wird sie mit ReDim auf die entsprechende Anzahl Felder redimensioniert.

Sie haben das Ende des frei verfügbaren Teil dieses Artikels erreicht!

Wenn Sie mehr lesen und auf viele weitere Artikel zugreifen möchten, melden Sie sich als Abonnent unter Login an. Falls nicht, bestellen Sie doch einfach ein Jahresabonnement!