WebBrowser Control

By , 2. März 2007

Z.Z. entwickel ich ein Offline-Reader von Access-o-Mania und verwende dafür eine Access Datenbank als Backend und ein Access Frontend zur Ausgabe. Um einen nahezu gleichen Look & Feel wie im Forum zu erzeugen schied die Ausgabe mittels Formular aus. Es kam eigentlich nur das WebBrowser Control in Frage.

A) Webbrowser Control

Um das WebBrowser Steuerelement zu verwenden fügt man es unter Einfügen/ActiveX Steuerelement/Microsoft WebBrowser ein. Die erste Handhabung ist ein wenig Tricky, vor dem ersten Speichern des Formulars nach dem Einfügen muss das WebBrowser Steuerelement positioniert und in die gewünschte Größe geändert werden. Man kann es zwar nach dem Speichern noch anderst positionieren aber die Größe bleibt fix. Es soll allerdings mittels API-Programmierung veränderbar sein.

Das Steuerelement zeigt zunächst keinen Inhalt an, es muss erst programmiert werden. Um eine Webseite anzuzeigen verwendet man die Methode .navigate, siehe folgendes Beispiel:

Me!WebBrowser.Navigate http://www.accessblog.de/

Es ist auch möglich offline Dateien zu laden, wichtig ist nur dass die Adresse stimmt und die Datei vorhanden ist. Das WebBrowser Steuerelement verhält sich dabei wie der Internet Explorer, d.h. alle clientseitigen Scriptsprachen wie HTML, CSS und JavaScript funktionieren auf lokaler Ebene. Nicht möglich ist es z.B. eine lokale php-Datei zu laden.

WebBrowser Control in der Entwurfsansicht Microsoft stellt eine Schnittstelle zur Verfügung mittels derer Aktionen innerhalb des Webdokumentes von Access aus Abgefangen werden, wie z.B. eine Formulareingabe. Informationen zu dem sogenannten Tag-Modell des WebBrowsers findet man im Tutorial Tagmodell des WebBrowsers auf http://www.activevb.de/.

1. Klick auf Links im WebBrowser abfangen

Um einen Klick auf einen Link im HTML mit Access auszuwerten muss man im Deklarationsteil des Formulars eine Eventdeklaration machen. Diese sieht dann wie folgt aus:

Private WithEvents Browser As SHDocVw.WebBrowser

Um das Ereigniss vor dem Aufrufen einer URL abzufangen verwendet man die Procedur WebBrowser_BeforeNavigate2. Verwenden sie dafür stets BeforeNavigate2, da dieses das ältere BeforNavigate ersetzt.

Private Sub WebBrowser_BeforeNavigate2(ByVal pDisp As Object, URL As Variant, Flags As Variant, TargetFrameName As Variant, PostData As Variant, Headers As Variant, Cancel As Boolean)
  • pDisp: ein Dispatch-Zeiger auf die Ereignisquelle
  • Url: die Zieladresse die geladen werden soll
  • Flags: ein Integer Ausdruck der das Flag &H0001 für den Internet Explorer 7 oder neuer oder Null enthält
  • TargetFrameName: String Ausdruck, enthält den Namen des Frames in dem die URL geladen werden soll, oder Null für keinen Frame
  • Headers: enthält zusätzliche HTTP Header Informationen
  • Cancel: Boolscher Wert, kann true oder false enthalten, true bricht die Navigations-Operation ab. Standard ist false

2. Formularereignisse abfangen

Ähnlich wie schon beim Abfangen der Klick-Ereignisse funktioniert es bei Formularen. Zuerst muss wieder der Eventhandler deklariert werden:

Private WithEvents myForm As HTMLFormElement

myForm ist ein beliebig wählbarer Ausdruck mit dem wir das Formularevent identifizieren.
Danach muss myForm initialisiert werden damit es auf das richtige Formular zielt welches man auswerten möchte:

Private Sub WebBrowser_DocumentComplete(ByVal pDisp As Object, URL As Variant)
  Set myForm = WebBrowser.Document.Forms(0)
End Sub

Anstatt des ersten Formulares (0) kann man auch bei named Formularen auf den Namen gehen.

Danach können wir den Eventhandler verwenden, z.B. um das Formular-Ereignis „on Submit“, also wenn der Absende-Button geklickt wurde, abzufangen. Angenommen wir haben ein Textfeld für die Suche das den Namen search hat. Um dann beim Abschicken den Inhalt dieses Textfeldes zu ermitteln verwenden wir nachfolgende Funktion:

Private Function myForm_onsubmit() As Boolean
    Dim suchbegriff As String
    suchbegriff = myForm.Item("search").Value
    MsgBox suchbegriff
End Function

B) Access Als HTML Generator

Viele werden sich jetzt sicherlich fragen wie man denn auf diese Weise Dynamische Webseiten Offline erzeugen kann. Nun, der Trick ist ganz einfach, vor dem Anzeigen (Methode Navigate) wird die Webseite neu erzeugt anhand der Klick oder Formular Ereignisse.Die Befehle dazu sind eigentlich ganz einfach. Haltet euch am besten an folgendes Schema:

Open CurrentProject.Path & "index.html" For Output As #1
Print #1, ""
Print #1, ""

Normalerweise verwendet ihr zur Formatierung CSS. Packt eure Formatierungen in eine CSS-Datei und linkt sie wie folgt ein:
Print #1, "<link href=& CurrentProject.Path & " type=text/css rel=stylesheet">"

Habt ihr in der CSS-Datei Links zu Grafiken solltet ihr diese herausnehmen und extra mit einer neutralen Pfadangabe wie z.B. CurrentProject.Path im Code einbinden wenn Ihr die Anwendung weiter geben wollt.

Print #1, ""
Print #1, ""
Close #1

OK, die HTML-Versierten meckern jetzt schon wo bleiben denn die Quotes bzw. Anführungszeichen. Nun, da muss man ebenfalls etwas tricksen denn sonst würde ein Anführungszeichen den String abschließen. Quotes haben den Ascii-Code 34, den wir in der chr() Funktion einsetzen.

Wir ersetzen also das Anführungszeichen durch folgenden String: “ & chr(34) & “ Beispiel:

Print #1, ""
<tr align=" & Chr(34) & "></tr>

Der Einsatz von JavaScript im WebBrowser Control ist prinzipiell möglich – doch meistens macht das Sicherheitssystem von Windows uns einen Strich durch die Rechnung und blockiert die Ausführung der Scripte. Also am besten darauf verzichten. Eine weitere Besonderheit ist, dass Windows die Ausführung von Offline-HTML-Dateien als Sicherheitsrelevant ansieht was zumindest im Internet Explorer zu einer Fehlermeldung führt. Dem kann man Abhelfen indem man folgenden Code direkt unterhalb der Doctype-Angabe bzw. an erster Stelle schreibt:

Print #1, "<!-- saved from url=(0013)about:internet -->"

So, das war jetzt aber mal genug vom WebBrowser Control und der Erstellung von HTML-Seiten. Ausführliche Informationen (auf Englisch) zum WebBrowser Control findet Ihr auf folgender Webseite:
http://msdn.microsoft.com/library/default.asp?url=/workshop/browser/webbrowser/reflist_vb.asp

Aktualisiert 4/2011:
Beispieldownload verfügbar, welche die Interaktion zw. Access und Webbrowser Control aufzeigt.
Siehe Downloadbereich: http://www.accessblog.de/downloads

Aktualisiert 11/2014:
Fehlende initialisierung der WithEvents Variable hinzu

Leave a Reply

You must be logged in to post a comment.

OfficeFolders theme by Themocracy