Autor: Klaus Giesen, Wuppertal
Mit Microsoft Access können nicht nur die üblichen Daten wie Nachname, Vorname oder Artikelnummern, sondern beispielsweise auch Bilder gespeichert und mit der entsprechenden Funktionalität verwaltet werden. Typische Anwendungsbeispiele dafür sind beispielsweise Abbildungen zu Artikeln und Produkten oder auch nur ein reines Bildarchiv.
Access stellt Ihnen verschiedene Möglichkeiten zur Speicherung von Bildern bzw. Bildinformationen in unterschiedlichen Steuerelementtypen zur Verfügung, die sich in verschiedener Hinsicht voneinander unterscheiden.
Access speichert Bilder als so genannte OLE-Objekte in einem entsprechenden Felddatentyp.
Zusätzlich tauchen in diesem Zusammenhang auch noch Begriffe wie gebunden und ungebunden, sowie Einbetten bzw. Verknüpfen auf.
Wir wollen uns an dieser Stelle aber nicht mit langen Erklärungen aufhalten, sondern mit einem ganz einfachen Beispiel beginnen. Die wichtigsten Begriffe zum Verständnis des gesamtem Vorgangs werden Sie dann im Verlauf dieses Beitrags näher kennen lernen.
OLE-Objekt in Datenbank speichern
Als Voraussetzung zur Speicherung von OLE-Daten muss ein Tabellenfeld auf den Felddatentyp OLE-Objekt eingestellt sein. Nur dann können verknüpfte oder eingebettete OLE-Objekte auch in einer Tabelle gespeichert werden.
Hinweis
Die folgende Methode ist von Access standardmäßig zum Speichern von OLE-Objekten vorgesehen.
Auch zum Einfügen eines solchen Objekts gibt es mehrere Möglichkeiten, von denen an dieser Stelle nun eine genauer beschrieben werden soll.
Bild 1: Auswahl des Objekttyps
Abb. 2: Objekt aussuchen und einfügen
Bild 3: Anzeige des OLE-Servers im Tabellenfeld
Praxis-Tipp
Das Einfügen eines OLE-Objekts über dieses Dialogfenster ist aus naheliegenden Gründen für den Anwender sehr flexibel: Er kann dort jeden auf seinem Computer vorhandenen OLE-fähigen Dateityp bequem auswählen.
Um weitere Bilder in Ihre Datenbank einzufügen, klicken Sie einfach mit der rechten Maustaste auf das Objektfeld und wählen Sie aus dem Kontextmenü den Befehl Objekt aus. Daraufhin wird wieder das Dialogfenster Objekt einfügen (siehe Bild 1) angezeigt.
Damit ist dieses einfache Beispiel abgeschlossen und das Bild wird im Formular angezeigt (siehe Bild 4).
Einfügen von OLE-Objekten per VBA
Es versteht sich von selbst, dass unter Access das Einfügen eines solchen Bildes auch per VBA möglich ist – beispielsweise über eine Schaltfläche Neu im Formular.
Schon die einzelne Codezeile
Me!oleBild.Action = acOLEInsertObjDlg
innerhalb einer Beim Klicken-Ereignisprozedur öffnet das bereits bekannte Dialogfenster Objekt einfügen.
Allerdings gilt es auch bei dieser einfachen Variante einiges zu beachten. Wenn ein Objekt eingefügt wird, wird auch der Programmcode weiter abgearbeitet. Beim Klick auf die Schaltfläche Abbrechen tritt allerdings ein Laufzeitfehler mit der Fehlernummer 2001 auf.
Bild 4: Bilder einfügen per Schaltfläche
Eine wiederum einfache Lösung ist, die Fehlerbehandlung von Access vollständig zu umgehen. Der Programmcode dazu sieht wie folgt aus:
'' Beim Auftreten eines Laufzeitfehlers '' wird mit der nächsten Anweisung '' fortgefahren On Error Resume Next '' öffnet den Dialog Objekt einfügen Me!oleBild.Action = acOLEInsertObjDlg '' Deaktiviert alle aktivierten '' Fehlerbehandlungsroutinen On Error GoTo 0
Eine ausführlichere und auch elegantere Lösung würde den Laufzeitfehler 2001 explizit abfangen. Weiterhin bietet sich an zu überprüfen, ob in dem OLE-Feld bereits ein Objekt vorhanden ist.
Daraufhin sollte der Anwender entscheiden können, ob dieses Feld überschrieben werden soll oder nicht.
Begriffserläuterungen und Hintergrundinformationen
An dieser Stelle ist es notwendig einige Begriffe zu klären, damit unmissverständlich deutlich wird, was eigentlich geschehen ist und welche Alternativen beim Import von Bildern möglich sind.
Objekttyp
In dem Listenfeld Objekttyp (Schritt 2) werden die Objekte aller OLE-fähigen Anwendungen auf Ihrem Computersystem angezeigt. Mit Hilfe der OLE-Technik können bekanntlich verschiedene Anwendungen innerhalb einer Anwendung miteinander kombiniert werden.
Hierbei ist es jedoch von entscheidender Bedeutung, dass eine Anwendung zur Bearbeitung des OLE-Objektes – in unserem Beispiel ein entsprechendes Grafikprogramm – auf dem Computersystem auch ordnungsgemäß (= lauffähig) installiert ist. Nur dann kann das Objekt auch bearbeitet werden.
Praxis-Tipp
Wenn Sie eine derartige Datenbank weitergeben, müssen Sie auf jeden Fall sicherstellen, dass eine Anwendung zur Bearbeitung des entsprechenden Dateityps auch auf dem betreffenden Computer vorhanden ist.
Neu erstellen – aus bestehender Datei erstellen
Bei unserem Beispiel haben wir in Schritt 2 die Option Aus Datei erstellen ausgewählt. Das setzt allerdings das physikalische Vorhandensein der betreffenden Datei auf einem Datenträger voraus.
Bei Auswahl der Option Neu erstellen braucht – wie die Bezeichnung vermuten lässt – die Datei nicht auf einem Datenträger vorhanden sein. In diesem Fall wird das zugehörige Anwendungsprogramm – beispielsweise das Programm Microsoft Paint – gestartet und Sie können eine Grafik erstellen.
Anschließend kehren Sie über einen entsprechend angepassten Menübefehl von Paint zu Access zurück (siehe Bild 5).
Bei dieser Vorgehensweise ist es wichtig im Hinterkopf zu behalten, dass die neu erstellte Grafikdatei – falls sie nicht ausdrücklich gespeichert wird – nur in der Datenbank und nicht als Datei auf einem Datenträger vorhanden ist.
Bild 5: Erstellen einer Grafik in Paint
Praxis-Tipp
Auf die gleiche Art und Weise kann die in der Datenbank gespeicherte Grafikdatei auch bearbeitet werden.
Einbetten – Verknüpfen
Im Schritt 3 wurde das unscheinbare Kontrollkästchen Verknüpfen im mittleren Teil des Dialogfensters nicht aktiviert.
Das aber impliziert automatisch, dass das Grafikobjekt eingebettet ist.
Doch was bedeutet das genau und wo liegen die Unterschiede zwischen diesen beiden Methoden
Zunächst zum Begriff Einbetten: Einbetten bedeutet vereinfacht ausgedrückt, dass eine Kopie der Herkunftsdatei in der Datenbank gespeichert wird.
Das Original bleibt als solches separat erhalten und kann weiterhin bearbeitet werden. Diese änderungen werden allerdings vom Objekt, welches in der Datenbank gespeichert ist, nicht übernommen. Umgekehrt – für die Bearbeitung des in der Datenbank gespeicherten Objekts – gilt das Gleiche.
Der Speicherplatzbedarf der Datenbank ist bei dieser Methode extrem hoch. Neben der Größe der importierten Grafikdatei ist dafür in erster Linie der so genannte OLE-Overhead verantwortlich, der ein Mehrfaches der Grafikdateigröße beträgt. Kurz gesagt: Die Datenbank wird extrem aufgebläht.
Praxis-Tipp
Je nach Hardwareausstattung Ihres Computers kann die Performance der Datenbank negativ beeinflusst werden.
Dagegen kann sich je nach vorliegendem Fall eine Datensicherung vereinfachen. Bei einem Bildarchiv beispielsweise brauchen so nicht Hunderte von Bilddateien, sondern nur eine Datenbankdatei gesichert werden.
Der Begriff Verknüpfen dagegen bedeutet, dass lediglich ein Hinweis auf ein Objekt erstellt wird. Dabei kann es sich entweder um eine bestehende Datei oder um ein mit der Herkunftsanwendung neu erstelltes Objekt handeln.
Alle änderungen an der verknüpften Datei werden automatisch in der Datenbank sichtbar. Dabei ist unerheblich, ob Sie die für die Durchführung der änderung verwendete Anwendung direkt von der Datenbank aus oder außerhalb von Access öffnen.
Praxis-Tipp
Vor allem in einer Mehrbenutzerumgebung bietet sich diese Methode an, denn so können – falls erforderlich – mehrere Anwender das Herkunftsobjekt bearbeiten.
Die vorhergehenden Ausführungen haben Ihnen hoffentlich deutlich gemacht, dass die Entscheidung für eine dieser beiden Methoden quasi von strategischer Bedeutung ist und in erster Linie vom jeweiligen Anwendungs- bzw. Verwendungszweck abhängt.
Gebunden – Ungebunden
Bei unserem Beispiel ist von Access ohne großes Nachfragen ein gebundenes OLE-Objekt erstellt worden. Grund dafür war, dass unser Ausgangspunkt das OLE-Feld in der Tabelle war. Damit steht auch schon die Definition:
Gebundene OLE-Objekte sind immer an ein entsprechendes Tabellenfeld gebunden. Daraus ergibt sich eben auch, dass die in einem solchen Feld gespeicherten Objekte aus der Datenbank heraus angezeigt und bearbeitet werden können.
Ungebundene OLE-Objekte definieren sich gegenteilig zum eben Beschriebenen: Sie werden nicht in einem Tabellenfeld, sondern lediglich in einem Formular oder Bericht gespeichert. Deswegen kann dieses Thema auch relativ schnell abgehandelt werden.
Eine mögliche Einfügemethode ist der Weg über die Zwischenablage von Windows:
Bild 6: Ungebundenes OLE-Objekt in einem Formular
Ungebundene OLE-Objekte dienen in erster Linie dazu, statische Objekte wie beispielsweise Firmenlogos darzustellen oder auch Sounddateien abzuspielen.
Andererseits eignen sich ungebundene OLE-Felder vorzüglich dazu, mit externen Daten verbunden zu werden. Ein Beispiel dazu finden Sie in Absatz 3.
Ausgewählte Eigenschaften von OLE-Objekten
Die Eigenschaften von gebundenen und ungebundenen OLE-Objekten können sich je nach Herkunfts- und Verknüpfungsart doch recht deutlich voneinander unterscheiden. Deshalb werden an dieser Stelle nur einige ausgewählte Eigenschaften vorgestellt.
Bild 7: Das Eigenschaftsfenster
Größenanpassung
über die Eigenschaft Größenanpassung wird die Darstellung des OLE-Objekts im Formular beeinflusst. Dabei stehen drei Möglichkeiten zur Auswahl: Abschneiden, Dehnen und Zoomen.
Bild 8: Bildanzeige mit der Größenanpassung Dehnen
Wenn als Wert der Eigenschaft Zoomen ausgewählt ist, wird das OLE-Objekt an die Größe des Steuerelements angepasst, wobei sein Seitenverhältnis bei-behalten wird. Dadurch treten keine Verzerrungen auf.
Anzeigeart
über die Eigenschaft Anzeigeart wird festgelegt, auf welche Weise das OLE-Feld seinen Inhalt anzeigen soll. Die beiden möglichen Werte für die Eigenschaften heißen Inhalt und Symbol.
Wenn die Eigenschaft den Wert Inhalt hat, werden die Daten des OLE-Objekts angezeigt. Im Fall des Wertes Symbol wird lediglich das Symbol des OLE-Objekts angezeigt (siehe Bild 9).
Bild 9: Symbol eines OLE-Objekts im Formular
Bild 10: Das Formular Bildarchiv
Diese Einstellung kann aus mehreren Gründen sinnvoll sein.
Zum einen braucht ein Symbol bedeutend weniger Platz auf dem Formular und der Inhalt kann ja auf Doppelklick angezeigt werden.
Zum anderen kann die grafische Darstellung von OLE-Objekten – gerade beim Datensatzwechsel – recht zeitraubend sein.
Falls die grundsätzlichen Eigenschaften gebundener (hoher Speicherplatzbedarf) und ungebundener (mangelnde Flexibilität) OLE-Objekte stören, bietet sich eine interessante Alternative an:
In einer Tabelle werden lediglich Dateinamen und -pfad der Bilder gespeichert. Angezeigt werden die entsprechenden Bilder zur Laufzeit in einem ungebundenen OLE-Objekt. So könnte beispielsweise die Lösung für ein Bildarchiv realisiert werden.
Access wäre nicht Access, wenn alle diese Funktionalitäten nicht auch per VBA-Programmierung erledigt werden könnten.
Das folgende Beispiel setzt dies um und beinhaltet unter anderem auch die Möglichkeit, Bilddateien über ein unter Windows übliches Dialogfeld zur Dateiauswahl auszuwählen und alle Bilder eines Verzeichnisses in einem Rutsch laden zu können.
Bild 11: Das Steuerelement Bild in der Toolbox
Das Steuerelement Bild
Bestandteil dieser Lösung ist das Steuerelement Bild. Dieses Steuerelement ist im Grunde genommen ein ungebundenes OLE-Objekt und speziell für die Anzeige von Bildern entwickelt worden. Sein Vorteil gegenüber einem Objektfeld ist, dass es wesentlich schneller geladen wird.
Der Verwendung dieses Steuerelementes bietet sich allerdings nur dann an, wenn das Bild nicht aktualisiert werden muss. Anderenfalls ist die Verwendung eines gebundenen OLE-Objekts notwendig.
Bild 10 zeigt die Toolbox mit dem Steuerelement Bild. Die Toolbox wird durch einen Klick auf die gleichnamige Schaltfläche der Symbolleiste in der Entwurfsansicht von Formularen angezeigt.
Bild 12: Der Dialog Datei öffnen
Bild 13: Dateiname und -pfad in der Tabelle
Einzelne Bilddatei aus einem Ordner laden
Die fertige Lösung erlaubt zunächst die Auswahl einer einzelnen Grafikdatei.
Beim Klick auf die Schaltfläche Datei laden im Formular frmBildArchiv der Beispieldatenbank BilderImport.mdb (siehe Bild 10) wird die folgende Ereignisprozedur aufgerufen:
Private Sub btnLoad_Click() Dim FName$ FName$ = DateiOeffnen(CurDir$, _ "Bildladen:") If FName$ = "" Then Exit Sub Me.[txtFoto] = FName$ Me.[picFoto].Picture = FName$ DoEvents End Sub
Aus Gründen der übersichtlichkeit fehlen die Fehlerbehandlungsroutinen. Der Ablauf ist relativ simpel.
Zunächst wird die Funktion DateiOeffnen() aus dem Modul modWindowsDialoge aufgerufen, das Sie in der Beispieldatenbank BilderImport.mdb finden.
Daraufhin wird der normale Datei öffnen-Dialog angezeigt, in dem das aktuelle Verzeichnis voreingestellt ist.
Falls keine Datei ausgewählt wird, wird die Routine beendet. Falls doch, wird die Variable FName$ mit Dateiname und Pfad gefüllt und im Feld txtFoto der Tabelle gespeichert. Dann wird mit dem Variableninhalt die Eigenschaft Picture oder Bild des Bild-Steuerelements gesetzt. Das war es schon. Ein Blick in die Tabelle zeigt, dass dort tatsächlich Dateiname und -pfad gespeichert sind.
Damit die Bilder auch beim öffnen des Formulars und beim Datensatzwechsel angezeigt werden, ist noch eine zweite Ereignisprozedur notwendig. Diese wird beim Ereignis Beim Anzeigen oder Current des Formulars ausgeführt (s. Quellcode 1).
Die beiden in diesem Zusammenhang entscheidenden Schritte sind in den beiden folgenden Codezeilen enthalten.
In der Zeile
PicFName$ = Me.[txtFoto]
wird eine Variable mit dem Dateipfad gefüllt, mit dem in der Zeile
Me.[picFoto].Picture = PicFName$
die Eigenschaft Picture des Bild-Steuerelements entsprechend eingestellt wird.
Private Sub Form_Current() Dim PicFName$ On Error Resume Next DoCmd.Hourglass True If Not IsNull(Me.[txtFoto]) Then PicFName$ = Me.[txtFoto] If Dir$(PicFName$) <> "" Then Me.[picFoto].Picture = PicFName$ Else Me.[picFoto].Picture = "" DoEvents Beep MsgBox "Bilddatei nicht gefunden!" End If Else Me.[picFoto].Picture = "" End If DoCmd.Hourglass False End Sub Set DB = CurrentDb() Set rs = DB.OpenRecordset("tabBildArchiv", _ dbOpenDynaset) For i = 1 To MaxTyp DoEvents X$ = Dir$(P$ + BildTyp(i)) While X$ <> "" On Error Resume Next rs.AddNew rs("txtFoto") = P$ + X$ If Err <> 0 Then GoTo Skip rs("txtKategorie") = "Neu" rs("txtStichwort") = "Neues Bild" rs.Update Skip: On Error GoTo 0 X$ = Dir$() Wend Next i rs.Close
Alle Bilddateien aus einem Ordner einlesen
Mit dem Formular frmBildArchiv der Beispieldatenbank BilderImport.mdb ist es möglich, den Inhalt eines kompletten Ordners mit Grafikdateien quasi auf einen Rutsch einzulesen.
Dazu ist ein Klick auf die Schaltfläche Verzeichnis einlesen notwendig. Die daraufhin aufgerufene Ereignisprozedur btnDir_Click finden Sie im Klassenmodul FORM_frmBildArchiv der Beispieldatenbank. Sie wird hier in ihren wesentlichen Passagen erläutert.
Eingrenzung der Dateitypen
Durch den notwendigen Deklarationsteil wird festgelegt, dass nur Dateien mit drei bestimmten Dateiendungen eingelesen werden können. Dies ist deshalb notwendig, weil der weitere Verlauf der Prozedur keine Auswahlmöglichkeit von Dateien vorsieht.
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