Home > Artikel > Ausgabe 4/2016 > Elemente für die Bildanzeige

Elemente für die Bildanzeige

  PDF ansehen

  Download PDF und Beispieldatenbank

Der Häufigkeit von Fragen in Foren nach zu schließen, scheint der Umgang mit Bildern in Formularen und Berichten für viele Entwickler ein Thema hoher Priorität zu sein. Zwar geht es dort meist um das Laden von Bilddateien über VBA-Routinen, doch dass es neben dem Access-eigenen Bildsteuerelement noch weitere Möglichkeiten zur Darstellung gibt, wird dabei gerne übersehen. Hier ein Überblick über die Alternativen und ihre Vor- und Nachteile.

Beispieldatenbank

Die Beispiele dieses Artikels finden Sie in der Datenbank 1604_ImageCtls.zip.

Bilddateien unter Access

Selbst Microsoft hat erkannt, dass Bilder in Datenbanken eine zunehmend größere Rolle spielen. Ob Fotos von Personen oder Gegenständen, ob Kataloge oder Produktdatenbanken, Privatgebrauch oder Gewerbe, überall finden sich Fälle, in denen Bilder in Datenbanken ein zusätzliches Informationselement darstellen können.

Bis zur Version von Office 2007 beschränkten sich die Möglichkeiten auf das eingebaute Bildsteuerelement oder auf das OLE-Feld oder -Steuerelement. Letzteres war, wenn man von aufwändiger VBA-Programmierung absehen wollte, zugleich die einzige Lösung, um Bilddateien binär direkt in Tabellen abzuspeichern. Deren Anzeige im Formular war dann immer ein Risiko, weil der hierfür erforderliche OLE-Server in Gestalt eines externen Programms, wie PaintBrush, auf dem System vorliegen muss. Auch ein Photoshop-Bild lässt sich auf diesen Weg einbetten, doch das geht dann eben nur mit installierten Photoshop sowohl auf Entwickler-, wie Zielmaschine. Über die Performance dieser Lösung kann auch nichts Positives berichtet werden.

Darum gab es zwei Weiterentwicklungen: Zum einen lässt sich ein Bildsteuerelement nun direkt an ein Tabellenfeld binden, das die Pfade zu den Bilddateien enthält, zum anderen bietet die Kombination von neuem Anlagefeld und Anlagesteuerelement einen komfortablen Ersatz für die in die Jahre gekommene OLE-Lösung. Einst von vielen Entwicklern verschrien, weil Binärformate in Datenbanken angeblich nicht zu suchen hätten, ist das inzwischen ein alter Hut von gestern. Alle DBMS-Systeme haben längst den Support für Binärdaten eingebaut und setzen teilweise darauf noch spezielle Bibliotheken, wie jene der Geoinformationssysteme (GIS) mit ihren komplexen Datenformaten. Klar muss man sich durchaus noch Gedanken darüber machen, ob die großen Dateien wirklich in Tabellen untergebracht sein müssen. Schließlich weist Access ein Limit von 2 GB für eine Datenbank auf. Bei kleineren Fotos in komprimiertem Format und bei überschaubarer Datensatzzahl sollte das jedoch kein Problem darstellen.

Hier geht es nicht um die Anwendungsbereiche für Bilder in Datenbanken. Dazu fällt Ihnen sicher selbst genug ein. Wir nehmen sechs Steuerelementlösungen unter die Lupe und zeigen deren Ansteuerung, sowie deren Eigenschaften. Im Einzelnen sind dies die Folgenden:

  • das Access-Bildsteuerelement,
  • das OLE-Feld,
  • das Anlagesteuerelement,
  • das MS-Forms Image Control,
  • die Access-Schaltfläche und
  • das Webbrowser Control.

Auf einen Blick

Im Formular frmBilder der Beispieldatenbank sind alle sechs Steuerelemente miteinander vereint und zeigen jeweils dasselbe Foto an. So können Sie sie direkt vergleichen und Verhalten, Features und Qualität begutachten. Die Steuerelemente haben alle die gleichen Abmessungen. Quelle für die Fotos sind Bilddateien im Datenbankverzeichnis, beim Anlage- und OLE-Steuerelement jedoch auch direkt in einer Tabelle gespeicherte Bilddaten.

Bild 1 zeigt das Formular zur Laufzeit, wobei hier der zweite Datensatz der Tabelle tblBilder eingeblendet ist, welcher auf der Bilddatei piano.jpg basiert. Bis auf das OLE-Steuerelement stimmt die Anzeige mit den Erwartungen überein. Bildsteuerelement, Anlagesteuerelement und MS Forms Image zeigen eine identische Darstellung und Skalierung, während die Schaltfläche und das Webbrowser Control offenbar die Originalgröße des Bilds wiedergeben. Bei genauerem Hinsehen unterscheidet sich allerdings auch die Anzeigequalität. Bild- und Anlagesteuerelement geben das Bild etwas unscharf wieder, was sich auf ein Antialiasing zurückführen ließe. Das MS Forms Control hingegen zeigt beim Skalieren kein Antialiasing, was teilweise zu verpixelten Kanten führt. Den besten Kompromiss liefert das Webbrowser Control ab.

Die sechs Steuerelemente im Formular frmBilder zeigen alle dieselbe Bilddatei an – fast jedenfalls!

Bild 1: Die sechs Steuerelemente im Formular frmBilder zeigen alle dieselbe Bilddatei an – fast jedenfalls!

Warum das gebundene OLE-Feld nur ein Symbol statt des Inhalts anzeigt, führen wir später aus.

Den Entwurf des Formulars erläutern wir später – vorher werfen wir einen Blick auf die Daten, die ihm zugrunde liegen.

Bilddaten

Die Tabelle tblBilder hat den Aufbau aus Bild 2. Bilddatei ist ein Textfeld, welches nur den Dateinamen aufnimmt, etwa piano.jpg. Pfad enthält das Verzeichnis, in dem die Datei liegt. Der Inhalt dieses Felds ist zunächst leer und wird erst beim Start der Datenbank über eine VBA-Anweisung im Intro-Formular mit dem aktuellen Verzeichnis festgesetzt:

Diese fünf Felder stehen im Entwurf der Tabelle tblBilder

Bild 2: Diese fünf Felder stehen im Entwurf der Tabelle tblBilder

CurrentDb.Execute _

    "UPDATE tblBilder SET Pfad='" _

& CurrentProject.Path & "'"

Damit steht in jedem Datensatz der Tabelle in Pfad das Verzeichnis aus CurrentProject.Path.

Bildanlage ist ein Attachment (Anlagefeld) mit der Beschriftung Anlagebild, welches später das Anlagesteuerelement speisen soll. Und BildOLE schließlich ist ein Feld vom Typ OLE-Objekt, an das im Formular das Gebundene OLE-Steuerelement gehängt wird. Die Datenblattansicht der Tabelle zeigt Bild 3. Hier wurden bereits die entsprechenden Bilddateien in das Attachment geladen, und ebenso als OLE-Objekte in das Feld BildOLE. Interessant ist, was Access aus den geladenen Daten im OLE-Feld in der Ansicht macht. Im einen Fall zeigt es die Beschriftung Package, im anderen ein Bitmap Image. Die Vorgehensweise, falls Sie noch nie ein OLE-Objekt in eine Tabelle speicherten: Klicken Sie rechts in die gewünschte Tabellenzelle und wählen aus dem Kontextmenü (Bild 4) den Eintrag Objekt einfügen....

Datenblattansicht der Tabelle tblBilder

Bild 3: Datenblattansicht der Tabelle tblBilder

Kontextmenü Objekt einfügen...

Bild 4: Kontextmenü Objekt einfügen...

Access rechnet dann ein bisschen, um die im System installierten sogenannten OLE-Server zu ermitteln und anschließend in einem Dialog zu präsentieren (Bild 5).

Dialog zum Neuerstellen eines OLE-Objekts

Bild 5: Dialog zum Neuerstellen eines OLE-Objekts

Sie haben nun die Wahl, ein Dokument auf Basis der in der Listbox aufgeführten Anwendungen komplett neu zu erstellen, oder aber, nach Klick auf Datei (Bild 6), eine existierende Bilddatei in ein OLE-Objekt zu verwandeln. Windows entscheidet im Hintergrund, welcher OLE-Server dabei zum Einsatz kommt. Dies hängt von den im System eingestellten Dateitypverknüpfungen ab. Statt physischem Speichern der Datei in das Tabellenfeld könnten Sie auch ein Häkchen auf Verknüpfen im Dialog setzen, was dann nur eine Referenz auf die Datei und deren zuständigen OLE-Server hinterlässt.

Dialog zum Erstellen eines OLE-Objekts aus einer Datei

Bild 6: Dialog zum Erstellen eines OLE-Objekts aus einer Datei

Laden Sie etwa eine JPG-Datei in das OLE-Feld, so verwandelt sich diese in ein Package. Das Gleiche gilt für PNG- oder TIFF-Dateien. Lediglich bei BMP-Dateien kommt es zum Eintrag Bitmap Image. Und genau dies ist in der Regel auch der einzige Dateityp, der unmittelbar im Gebundenen OLE-Steuerelement angezeigt werden kann. Denn Windows verknüpft mit den meisten Grafiktypen die Windows-Bildvorschau, welche keinen OLE-Server darstellt.

Bei BMP-Dateien hingegen kommt, warum auch immer, PaintBrush zum Einsatz, welches zur Laufzeit innerhalb des OLE-Steuerelements dann die Grafik anzeigt. Allein damit schon scheidet das OLE-Steuerelement als sinnvolles Mittel zur Bildanzeige aus. Bitmap-Dateien haben wegen ihrer erheblichen Größe in Datenbanken nichts zu suchen!

Zurück zum Entwurf des Formulars, den Sie in Bild 7 finden. Für das Bildsteuerelement links oben finden Sie im Entwurfs-Ribbon zum Einsetzen möglicherweise nicht gleich die passende Schaltfläche. Seit Access 2010 wird hier eine spezielle Dropdown-Box verwendet, die an die Tabelle MSysResources gebunden ist. Sie befindet sich ganz rechts und hat die Aufschrift Bild einfügen. Sie bietet zwei Möglichkeiten: Entweder Sie wählen ein bereits in der Datenbank befindliches Bild aus, das auch gleich als Vorschaubild erscheint, oder Sie gehen auf Durchsuchen... und laden eine Bilddatei. Erst dann wird das Steuerelement im Formular angelegt. Ein leeres lässt sich leider nicht erzeugen. Sie müssen gegebenenfalls ein Dummy-Bild laden und es anschließend im Eigenschaftenblatt des Steuerelements löschen (Eintrag Bild). Dennoch wird dieses Bild dann in der Dropdown-Galerie im Ribbon angezeigt, weil es bereits als Datensatz in MSysResources aufgenommen wurde. Dort allerdings können Sie diesen Datensatz anschließend getrost löschen. Nun ja, nicht gerade der Weisheit letzter Schluss...

Der Entwurf des Formulars frmBilder mit den sechs für die Bildanzeige eingesetzten Steuerelementen

Bild 7: Der Entwurf des Formulars frmBilder mit den sechs für die Bildanzeige eingesetzten Steuerelementen

Das Anlegen der Steuerelemente für das Webbrowser Control, und das Anlagesteuerelement bedarf keiner weiteren Erläuterungen. Im Prinzip auch nicht das Einsetzen der Schaltfläche links unten. Es mag irritierend erscheinen, dass wir zur Bildanzeige auch einen Button heranziehen. Doch auch Schaltflächen erfuhren ab Access 2007 eine umfangreiche Weiterentwicklung, so dass sie für diese Zweckentfremdung geeignet erscheinen. Im Beispielformular ist der Button auf die gleiche Größe dimensioniert, wie die anderen Elemente, und zusätzlich mit einem Design versehen worden (Schattenwurf, runde Ecken).

Das MS Form Image Control schließlich ist als ActiveX-Steuerelement kein Bestandteil von Access, wohl aber der Office-Installation. Sie fügen es über den Entwurfs-Ribbon nach Ausklappen desselben und den Dialog ActiveX-Steuerelemente in das Formular ein, wobei das Element sich dort in der Liste Microsoft Forms 2.0 Image nennt.

Datenbindung

Vier der sechs Bildelemente lassen sich direkt an ein Feld der Datenherkunft des Formulars binden, sodass beim Wechsel des Datensatzes auch jeweils ein neues Bild erscheint. Zwei scheiden aus: die Schaltfläche und das MS Forms Control. Diesen müssen über VBA Bilder zugewiesen werden.

Das Access-Bildsteuerelement benötigt als Steuerelementinhalt ein Textfeld, das die vollständigen Pfade zu den anzuzeigenden Dateien enthält. Da in der Tabelle tblBilder Datei- und Verzeichnisname in getrennten Feldern liegen, wird der Bildpfad in einer Abfrage, wie in Bild 8, zusammengesetzt. An dieses Abfragefeld binden wir das Bildsteuerelement.

Abfrage auf Basis der Tabelle tblBilder als Datenherkunft des Formulars

Bild 8: Abfrage auf Basis der Tabelle tblBilder als Datenherkunft des Formulars

Das Gleiche gilt für das Webbrowsersteuerelement. Auch hier ist Bildpfad das gebunden Feld. Der Browser erkennt den Dateinamen als URL und wandelt ihn intern in eine etwas andere Darstellung um. Aus

e:\bilder\beispiel.jpg

wird so etwa

file:///e/bilder/beispiel.jpg

Was sie im Browser zu sehen bekommen, ist allerdings nicht allein eine Datei, denn er benötigt zum Rendern ein komplettes HTML-Dokument. Das JPG wird automatisch als entsprechender MIME-Typ erkannt, das zugehörige IMG-Tag eingesetzt und ein rudimentäres HTML-Gerüst mit einem body um es herum aufgebaut. Deshalb ist etwa in Bild 1 auch ein weißer Rand um das Bild herum zu sehen. Der Browser hat hier eigenmächtig Werte für leftmargin und topmargin, also die Rändern des Dokuments, gesetzt. Wir kommen noch später darauf zu sprechen, wie sich das abstellen lässt.

Das Anlagesteuerelement kann nur an ein Anlagefeld gebunden werden, welches sich in der Tabelle Bildanlage nennt. Ein einzelnes Feld kann dabei mehrere Bilder aufnehmen, wovon im Formular zunächst immer nur das erste angezeigt wird.

Sie können Bilddateien über das Klammersymbol entweder direkt in der Datenblattansicht einspeisen, oder auch in der Formularansicht. Wer dies nicht zulassen möchte, der stellt die Steuerelementeigenschaft Gesperrt einfach auf Ja.

Das Gebundene OLE-Steuerelement schließlich benötigt ein OLE-Feld (BildOLE), in das ein OLE-Objekt pro Datensatz gespeichert wird, wie bereits beschrieben. Hier kommt nur eine einzelne Datei infrage.

Beim Wechsel der Datensätze über die Navigationsleiste des Formulars wird nun immer das zugehörige Bild in den Steuerelementen dargestellt. Blieben noch die Schaltfläche und das MS Forms Control, die über VBA gesteuert werden müssen. Einfach ist es bei der Schaltfläche cmdImg. Ihre Eigenschaft Picture – im Eigenschaftenblatt Bild genannt, wobei dieses im Entwurf auf (keines) steht ist auf den Bildpfad zu setzen:

Me!cmdImg.Picture = Me!Bildpfad

Diese Zuweisung geschieht an besten in der Ereignisprozedur Beim Anzeigen (Form_Current) des Formulars.

Das MS Forms Image kann leider mit Bilddateien direkt nichts anfangen. Es kann nur Bildobjekte vom Typ stdole.Picture anzeigen. Ein solches Objekt muss also erst aus der Datei erzeugt werden. Dazu verwenden Sie die in Access eingebaute Funktion LoadPicture:

Set Me!ctlImgForms = _

LoadPicture (Me!Bildpfad)

Auch diese Zeile bauen Sie in die Ereignisprozedur Beim Anzeigen ein.

Bilddateitypen

Nicht jedes Steuerelement kann die gleichen Dateitypen rendern.

Wie weiter oben schon erwähnt, beschränkt sich das OLE-Steuerelement auf lediglich BMP-Dateien, wenn das OLE-Objekt über den Dialog geladen wird und in Windows kein spezieller OLE-Server etwa für JPG-Dateien eingestellt wurde.

Hingegen kommt das Bildsteuerelement mit den gängigen Typen zurecht: BMP, JPG, PNG, GIF, TIF, ICO, EMF.

Man sollte erwarten, dass auch die Schaltfläche mit diesen umgehen könnte. Dem ist nicht so. Seiner Picture-Eigenschaft können Sie nur Bilder der folgenden Typen zuweisen: BMP, JPG, ICO. Das ist umso erstaunlicher, da etwa auch PNG-Grafiken sich im Entwurf in einen Button laden lassen, selbst dann, wenn der Modus auf Verknüpft steht. Warum dies nicht auch über VBA geht, bleibt rätselhaft.

Das MS Forms Control kann nur Picture-Objekte anzeigen. LoadPicture kommt leider nur mit BMP, JPG und ICO zurecht. Andere Typen müssten über aufwändigere VBA-Routinen geladen werden, die die Funktionen des WIN32-API oder von GDIPLUS verwendeten. Das liegt eindeutig außerhalb der Basics dieses Beitrags.

Das Anlagesteuerelement erlaubt das Laden und Rendern der gleichen Dateitypen, wie das Bildsteuerelement, also BMP, JPG, PNG, GIF, TIF, ICO und EMF. Nur eben können diese Dateien direkt in eine Tabelle gespeichert werden. Der Clou besteht darin, dass Typen ohne Komprimierung, wie etwa BMP und EMF, intern automatisch mit einem ZIP-ähnlichen Format komprimiert werden, sodass ein Aufblähen der Datenbank auch bei diesen Typen unterbleibt.

Am flexibelsten ist das Webbrowsersteuerelement. Neben den gängigen Bilddateien hängt es vom System ab, was der Browser aus den spezielleren Dateien macht. Bei uns klappte es etwa auch mit TGA-Dateien. Für PCX hingegen fand der Browser keinen Renderer, was dazu führte, dass er einen Download der Datei vorschlug. Mit welchen Dateien das Steuerelement zurechtkommt, ermitteln Sie, indem Sie verschiedene Dateitypen in den Internet Explorer laden.

Skalierung

Für das Bildsteuerelement können Sie über die Eigenschaft Größenanpassung einstellen, ob das Bild abgeschnitten, gedehnt oder gezoomt werden soll. Beim Abschneiden bleibt das Bild in der Originalgröße erhalten und positioniert sich dabei zunächst in der Mitte. Das Dehnen ergibt selten einen Sinn, denn dabei wird das Bild genau auf die Größe des Steuerelements skaliert, wodurch in der Regel die Seitenverhältnisse des Bilds verloren gehen. Beim Zoomen wird das Bild so hoch- oder herunterskaliert, dass es sich genau in das Steuerelement einpasst. Überstehende Ränder werden in der eingestellten Hintergrundfarbe dargestellt.

Über die Eigenschaft Bildausrichtung können Sie weiter festlegen, ob ein abgeschnittenes oder gezoomtes Bild in der Mitte des Elements erscheinen soll, oder links oben, links unten, und so weiter.

Genau die gleichen Modi stehen auch für das Anlagesteuerelement zur Verfügung.

Komplette Fehlanzeige hingegen bei der Schaltfläche. Hier ist keine Skalierung oder Positionierung vorgesehen. Sie müssen bei dieser dafür sorgen, dass die Bilder im Original nicht größer sind, als das Steuerelement. Dafür kann man der Schaltfläche Designs verabreichen und die Ecken des Steuerelements etwa abgerundet gestalten. Allerdings geht diese Gestaltung verloren, wenn das geladene Bild gleich groß, oder größer, als das Steuerelement ist. Dann füllt sich seine ganze rechteckige Fläche aus.

Beim MS Forms Image finden Sie im Eigenschaftenblatt unter dem Reiter Andere ähnliche Modi. Statt Größenanpassung nennt sich die Eigenschaft hier PictureSizeMode mit ihren Einträgen Clip, Stretch und Zoom, während die Bildausrichtung hier PictureAlignment heißt. Die Effekte sind mit denen das Bildsteuerelements vergleichbar.

Das Webbrowsersteuerelement zeigt das Bild immer links oben in Originalgröße an. Immerhin entstehen bei zu großen Bildern, im Unterschied zu den anderen Elementen, dabei Scrollbalken, damit Sie das gesamte Bild durchsuchen können.

Mit einigen VBA-Tricks kann aber, wie wir noch sehen, auch eine Skalierung erzwungen werden.

Eine interessante Besonderheit zeigt übrigens die Schaltfläche. Ist ihre Eigenschaft Aktiviert auf Nein gestellt, so ergraut das angezeigte Bild. Im Beispielformular können Sie das mit der Checkbox Disabled (chkDisable) überprüfen. Sie setzt per VBA die Enabled-Eigenschaft der Schaltfläche im AfterUpdate-Ereignis auf False:

Private Sub chkDisable_AfterUpdate()

Me!cmdImg.Enabled = _

     Not chkDisable.Value

End Sub

Sie schalten damit die Farbe des Bilds ein und aus (siehe Bild 9).

Beim Deaktivieren der Schaltfläche ergraut das geladene Bild

Bild 9: Beim Deaktivieren der Schaltfläche ergraut das geladene Bild

Dynamisches Laden ohne Bindung

So komfortabel die Bindung an ein Tabellenfeld ist, manchmal möchten Sie ein Bild auch direkt aus einem Verzeichnis laden, ohne es in einem Datensatz zu haben. Je nach Steuerelement ist das unter Umständen gar nicht so einfach. Der Button Anderes Bild laden ganz oben im Formularkopf stößt eine Prozedur an, über die das Bild horn.jpg im Datenbankverzeichnis in die Steuerelemente gelangen soll.

Am leichtesten gelingt dies bei der Schaltfläche. Zunächst wird in der Variablen sPic der Pfad zum Bild abgespeichert:

Dim sPic As String

sPic = _

CurrentProject.Path & "\horn.jpg"

Diesen Pfad verabreichen Sie der Schaltfläche cmdImg:

Me!cmdImg.Picture = sPic

Nicht schwieriger ist die Sache beim Webbrowsersteuerelement ctlWeb, nur dass hier die Methode Navigate2 zum Einsatz kommt:

Me!ctlWeb.Object.Navigate2 sPic

Beim MS Forms Image benötigen Sie ebenfalls nur eine Zeile, in der Sie das gewünschte Bild über LoadPicture laden:

Set Me!ctlImgForms.Picture = _

LoadPicture(sPic)

Kopfzerbrechen hingegen macht ausgerechnet das Bildsteuerelement von Access. Eigentlich würde es auch hier reichen seiner Eigenschaft Bild (Picture) wie bei der Schaltfläche den Bildpfad zuzuweisen:

Me!ctlImg.Picture = sPic

Das funktioniert so auch, aber unter einer Bedingung: das Steuerelement ist nicht an ein Datenfeld gebunden. Dann nämlich passiert durch diese Zeile rein gar nichts! Eine Fehlermeldung tritt auch nicht auf.

Nun könnten Sie auf die Idee kommen, die Bindung an das Datenfeld temporär aufzuheben, indem sie die Eigenschaft Steuerelementinhalt (ControlSource) auf Null setzten:

Me!ctlImg.ControlSource = ""

Irgendetwas hat Microsoft hier im Objektmodell jedoch falsch gemacht. VBA meldet, dass das Element die Eigenschaft ControlSource nicht kennen würde.

Seltsamerweise klappt es jedoch über einen anderen Weg:

With Me!ctlImg

     .Properties("ControlSource") = ""

     .Picture = sPic

End With

Dies wird nicht beanstandet, die Feldbindung wird aufgehoben, und das Element zeigt nun auch das geladene Bild an. Komisch, komisch...

Richtig unangenehm wird es beim Anlagesteuerelement. Dieses ist ja auch gar nicht dafür gedacht, Dateien oder Dokumente von externen Quellen anzuzeigen. Seine Quelle ist immer und ausschließlich eine Anlage aus dem gebundenen Tabellenfeld. Also muss der zugrundeliegende Datensatz temporär modifiziert werden. Listing 1 zeigt die komplette Ereignisprozedur beim Anklicken des Buttons cmdNew. Der fett gedruckte Teil übernimmt das Ändern des Anlagefelds.

Private Sub cmdNew_Click()

     Dim sPic As String

     

     sPic = CurrentProject.Path & "\horn.jpg"

     

     Set Me!ctlImgForms.Picture = LoadPicture(sPic)

     Me!cmdImg.Picture = sPic

     Me!ctlWeb.Object.Navigate2 sPic

     

     Me!ctlImg.Properties("ControlSource") = ""

     Me!ctlImg.Picture = sPic

     

     Dim rs As DAO.Recordset2

     Me.Recordset.Edit

     Set rs = Me.Recordset!Bildanlage.Value

     rs.Edit

     rs!FileData.LoadFromFile sPic

     rs.Update

     Me!ctlAttachment.Requery

End Sub

Listing 1: Routine zum Laden einer externen Bilddatei in alle Steuerelemente

Das Formular-Recordset wird über Edit in den Editiermodus versetzt. Und nun wird es kompliziert. Der Wert (Value) eines Anlagefelds ist kein String und keine Zahl, sondern wieder ein Recordset! Dieses wird der Variablen rs zugewiesen. Auch dieses Recordset schalten Sie nun per Edit in den Modus zum Ändern. Das interne Feld FileData des Recordsets schließlich weist eine Methode LoadFromFile auf, über die eine Datei in das Attachment geladen werden kann. Ein Update bestätigt die Änderung, und das Requery auf das Steuerelement bringt nun das neue Bild tatsächlich zur Ansicht.

Falls Sie aufmerksam sind, so fällt Ihnen auf, dass zwar das Feld-Recordset in rs einem Update unterzogen wurde, nicht jedoch das Formular-Recordset. Das führ dazu, dass das neue Bild zwar für die Laufzeit des Formulars im Datensatz steht, nicht jedoch danach. An der Tabelle selbst ändert sich im Anlagedatensatz nichts!

Bild im Browser ändern

Über dem Webbrowser-Steuerelement befindet sich eine Schaltfläche mit der Aufschrift Resize!. Ein Klick auf sie ändert zweierlei: Zum einen wird das Bild im Steuerelement entsprechend den Dimensionen skaliert, zum anderen werden die weißen Ränder um es herum entfernt, so dass es schließlich so erscheint, wie im Bildsteuerelement. Der VBA-Code dafür ist nicht trivial und erfordert ein wenig Wissen über Webprogrammierung. Listing 2 zeigt den relevanten Teil. Verantwortlich für sein Funktionieren ist die Bibliothek Microsoft HTML Object Library (MSHTML), die Sie am besten in die Verweise Ihres VBA-Projekts aufnehmen.

...

     Dim w As Long, h As Long

     Dim w0 As Long, h0 As Long

     Dim f As Double

             

     w0 = Me!ctlWeb.Width \ 15

     h0 = Me!ctlWeb.Height \ 15

             

     With Me!ctlWeb.Object.Document.body

         .setAttribute "topMargin", "0"

         .setAttribute "leftMargin", "0"

         .setAttribute "scroll", "no"

     End With

             

     With Me!ctlWeb.Object.Document.images(0)

         w = .getAttribute("width")

         h = .getAttribute("height")

         If (w0 / h0) > (w / h) Then f = h0 / h Else f = w0 / w

         .setAttribute "width", CLng(w * f)

         .setAttribute "height", CLng(h * f)

     End With

...o

Listing 2: Modifizieren des Bilds im Webbrowsersteuerelement

Die Variablen w0 und h0 nehmen zunächst die Abmessungen des Steuerelements ctlWeb in Pixeln auf. Sie berechnen sich aus dessen Eigenschaften Width und Height, dividiert durch 15. Anschließend geht es an Änderungen des HTML-Dokuments selbst. Das Dokument ergibt sich aus der Eigenschaft Document des Webbrowsers. Von diesem wiederum interessiert und nur der HTML-Body, welcher als Objekt für einen With-Block steht. Seine Style-Attribute topMargin und leftMargin werden über die Methode setAttribute auf 0 gesetzt, was die Ränder um das Bild verschwinden lässt. Da nach Anpassung der Bildgröße auch keine Scrollbalken mehr erwünscht sind, wird das Body-Attribut scroll zusätzlich auf no gestellt.

Im weiteren Verlauf geht es um die Änderung des Bilds. Ein HTML-Document hat eine Auflistung images, die auf alle im Dokument enthaltenen Bilder verweist. Da hier nur ein einziges Bild vorliegt, können wir es über images(0) referenzieren.

Das Auslesen der Abmessungen des Bildobjekts übernimmt seine Funktion getAttribute, die für height und width die Ausdehnung in Pixeln zurückgibt. Die If-Bedingung überprüft, ob das Bild Hoch- oder Querformat besitzt. Je nachdem, ob dieses Format von dem des Steuerelements abweicht, wird der Skalierungsfaktor f aus der Division von Steuerelementbreite zur Bildbreite oder über Steuerelementhöhe zur Bildhöhe errechnet. Nachdem dieser Faktor feststeht, werden Breite und Höhe des HTML-Bildobjekts über dessen Methode setAttribute neu bestimmt, was zur augenblicklichen Skalierung der Anzeige führt.

Zusammengefasst

Wer es einfach haben will, der nimmt das Bildsteuerelement von Access zum Laden externer Bilddateien. Wer diese direkt in der Datenbank gespeichert haben will, der greift zum Anlagesteuerelement. Das OLE-Steuerelement scheidet wegen seiner Beschränkungen ganz aus.

Eine Schaltfläche verwenden Sie nur dann, wenn Sie kleineren Bildern einen gestylten Rahmen verpassen, oder wenn Sie über seine Enabled-Eigenschaft automatisch ein Graustufenbild erzeugen möchten. Das MS Forms Image kommt immer dann infrage, wenn bereits ein OLE-Picture-Objekt vorliegt. Viele VBA-Bibliotheken zur Bildverarbeitung liefern genau so ein Objekt zurück. Keines der anderen Steuerelemente kann mit diesem etwas anfangen!

Der heimliche Spitzenreiter aber ist für uns das Webbrowsersteuerelement, auch wenn diese Zweckentfremdung im Web im Verein mit Access bisher nur wenig dokumentiert wurde. Es lädt nicht nur eine Vielzahl von Bildtypen und weist eine ordentliche Darstellungsqualität auf, sondern eröffnet über Programmierung zudem quasi Bildverarbeitungsmöglichkeiten, wie das Beispiel des letzten Absatzes zeigte.

Dort wurde lediglich das Bild skaliert. Über weitere Attribut- und Style-Eigenschaften lässt sich das noch erheblich ausweiten. Rotieren, Umfärben, Randeffekte und sogar richtige Bildbearbeitungen über Render-Effekte sind realisierbar. Mit keiner anderen Zusatzbibliothek lässt sich das so einfach machen, wie über den Browser, und mit VBA-Bordmitteln geht schon gar nicht.