Bildverwaltung in Access

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.

  • öffnen Sie die betreffende Tabelle mit dem OLE-Feld in der Datenblattansicht und klicken Sie in das OLE-Feld.
  • Wählen Sie aus dem Menü Einfügen den Befehl Objekt aus. Wählen Sie aus dem Listenfeld Objekttyp den Eintrag Bitmap-Bild aus und markieren Sie die Option Aus Datei erstellen (siehe Bild 1).
  • Wählen Sie in dem darauf folgenden Dialogfenster mit Hilfe der Schaltfläche Durchsuchen eine Grafikdatei auf Ihrer Festplatte aus (siehe Bild 2). Achten Sie bitte darauf, dass das Kontrollkästchen Verknüpfen nicht aktiviert ist.
  • 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.

  • In dem Tabellenfeld wird daraufhin der OLE-Server des eingefügten Objekttyps angezeigt (siehe Bild 3).
  • öffnen Sie das zur Tabelle gehörende Formular in der Entwurfsansicht und ziehen Sie aus der Feldliste das Objektfeld ins Formular.
  • Wechseln Sie in die Formularansicht, um sich das eingefügte Bild anzusehen.
  • 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:

  • öffnen Sie ein Formular in der Entwurfsansicht.
  • Starten Sie ein Grafikprogramm. öffnen Sie eine Grafikdatei, markieren Sie die Datei und kopieren Sie diese in die Zwischenablage.
  • Wählen Sie in Access aus dem Menü Bearbeiten den Befehl Inhalte einfügen aus und klicken Sie in dem nachfolgenden Dialogfenster Inhalte einfügen auf OK.
  • 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

  • Beim Abschneiden wird das OLE-Objekt in seiner tatsächlichen Größe angezeigt. Wenn es größer als das Steuerelement ist, werden seine Ränder abgeschnitten.
  • Beim Dehnen wird die Größe des OLE-Objekts so angepasst, dass das Steuerelement ganz ausgefüllt ist. Dadurch kann es, wie Bild 8 zeigt, zu unschönen Verzerrungen kommen.
  • 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

    Schreibe einen Kommentar