{"id":55000705,"date":"2010-02-01T00:00:00","date_gmt":"2020-05-22T22:11:03","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=705"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"HTMLEditorSteuerelement","status":"publish","type":"post","link":"https:\/\/access-im-unternehmen.de\/HTMLEditorSteuerelement\/","title":{"rendered":"HTML-Editor-Steuerelement"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg06.met.vgwort.de\/na\/5c0aea8722a74c9da0cf55145d1f6094\" width=\"1\" height=\"1\" alt=\"\"><\/p>\n<p><b>Eine Access-Textbox, in einem Formular an ein Memo-Feld gebunden, ist eine spr&ouml;de Angelegenheit, wenn es darum geht, ihren Inhalt ansprechend zu gestalten. Denn alle Formatierungsm&ouml;glichkeiten beziehen sich immer nur auf das ganze Feld, den gesamten Text. Ein einzelnes Wort etwa fett hervorzuheben, ist nicht m&ouml;glich. Erst mit Access 2007 kam Farbe ins Spiel und der Richtext-Modus f&uuml;r Textfelder hielt Einzug, &uuml;ber den man Texte rudiment&auml;r formatieren kann. In allen fr&uuml;heren Access-Versionen bleibt man f&uuml;r diesen Zweck jedoch auf Fremdsteuerelemente angewiesen.<\/b><\/p>\n<p>Die Anforderung, Texte zu formatieren, stellt sich auch in Datenbanken oft. Es m&uuml;ssen nicht gleich komplette Dokumente sein, die mit einem Datensatz verkn&uuml;pft sind &#8211; es reichen bereits die ber&uuml;chtigten Notiz- und Anmerkungsfelder, die man gern f&uuml;r Zusatzinformationen in Formulare einbaut, damit der Anwender dort alles unterbringen kann, was nicht in das Raster der vorgegebenen Eingabefelder passt.<\/p>\n<p>Von dieser M&ouml;glichkeit wird dann erfahrungsgem&auml;&szlig; auch reichlich Gebrauch gemacht, was nicht selten zu un&uuml;bersichtlichen Textw&uuml;sten f&uuml;hrt. Dabei w&uuml;rde nur wenig Formatierung bereits ausreichen, um eine gegliederte Darstellung des Textes zu erm&ouml;glichen.<\/p>\n<p>In der Regel kommt ein Richtext-ActiveX-Steuerelement (<b>richtx32.ocx<\/b>) zum Einsatz, um dem Mangel abzuhelfen. Abgesehen davon jedoch, dass der Entwickler dann noch viel Arbeit vor sich hat, um das Steuerelement zus&auml;tzlich etwa mit einer Symbolleiste auszustatten, die es dem Anwender erm&ouml;glicht, den Text komfortabel zu editieren, kommen hier mindestens zwei Probleme ins Spiel.<\/p>\n<p>Einmal ist das entsprechende OCX von Microsoft eigentlich nicht frei erh&auml;ltlich, sondern entweder mit der Developer Edition von Access gebundelt, oder mit verschiedenen Entwicklungsumgebungen, wie Visual Basic 6.<\/p>\n<p>Allerdings gibt es auch freie Alternativen, wie etwa das Steuerelement von Stephen Lebans oder das von vbAccelerator [1]. Zweitens muss man solch ein OCX mit der Datenbank weitergeben und ruft im Zweifelsfall Scherereien mit seiner Registrierung und den Verweisen im VBA-Projekt hervor.<\/p>\n<p>Microsoft wurde sich dieser Unzul&auml;nglichkeit zum Formatieren offenbar bewusst und stellte mit Access 2007 den sogenannten Richtext-Modus f&uuml;r Textboxen bereit.<\/p>\n<p>Unter der Voraussetzung, dass ein Memofeld einer Tabelle als Datenherkunft des Steuerelements dient, das seinerseits bereits in den Richtext-Modus versetzt wurde, kann in einer beliebigen Textbox der Inhalt &uuml;ber eine Popup-Toolbar formatiert werden (siehe Bild 1). <\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2010_01\/Webbrowser-web-images\/A2007_toolbar_opt.jpeg\" alt=\"A2007_toolbar.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 1: Textformatierung in Access 2007 (Richtext) &uuml;ber Popup-Toolbar<\/span><\/b><\/p>\n<p>Leider ist dieses Popup-Men&uuml;, das nur beim Markieren von Text erscheint, auch schon die einzige M&ouml;glichkeit, auf die Formatierung des Textes Einfluss zu nehmen, und seine Bedienung erfordert etwas Geschicklichkeit im Umgang mit der Maus. Eine programmgesteuerte Einflussnahme ist nicht gegeben und das Men&uuml; l&auml;sst sich auch nicht abschalten.<\/p>\n<p>Intern wird die Formatierung dann &uuml;ber HTML-Tags gespeichert, weshalb die Bezeichnung Richtext irref&uuml;hrend ist. Theoretisch ist es m&ouml;glich, diese HTML-Tags anschlie&szlig;end &uuml;ber VBA-Code zu ver&auml;ndern.<\/p>\n<p>Indessen darf man allerdings nicht erwarten, dass im Richtext-Modus nun beliebige HTML-Auszeichnungen genauso angezeigt w&uuml;rden, wie in einem Webbrowser; die Access 2007-Textbox beherrscht tats&auml;chlich nur jene, die sich auch &uuml;ber das Popup-Men&uuml; erzeugen lassen.<\/p>\n<p>Gen&uuml;gend Gr&uuml;nde also, sich nicht nur f&uuml;r die Versionen vor Access 2007 Gedanken &uuml;ber alternative L&ouml;sungen zu machen &#8230;<\/p>\n<p><b>Webbrowser-Steuerelement<\/b><\/p>\n<p>Das <b>Microsoft Webbrowser Control<\/b>, welches Sie &uuml;ber die Liste der ActiveX-Steuerelemente in ein Formular einf&uuml;gen k&ouml;nnen, stellt einen Mini-Browser f&uuml;r HTML-Dokumente bereit. Im kommenden Access 2010 wird ein solches Steuerelement &uuml;brigens standardm&auml;&szlig;ig zur Bordausstattung von Access geh&ouml;ren.<\/p>\n<p>Es hat dort den Vorteil, sich direkt an ein Memofeld einer Tabelle binden zu lassen, was mit dem normalen Webbrowser-ActiveX zwar nicht m&ouml;glich ist, uns andererseits aber, wie sp&auml;ter noch ausgef&uuml;hrt wird, nicht gerade vor weltbewegende Programmierprobleme stellt.<\/p>\n<p>Das Webbrowser-Steuerelement hat den entscheidenden Vorteil, dass es grunds&auml;tzlich auf jedem Windows-System vorhanden ist und mit der Installation von Access oder Office gar nichts zu tun hat. Der Internet-Explorer selbst stellt es zur Verf&uuml;gung. Verweis- oder Registrierungsprobleme gibt es hier nicht.<\/p>\n<p>Das Steuerelement ist tats&auml;chlich identisch mit dem Anzeigebereich des Internet-Explorers und l&auml;sst sich daher auch auf gleiche Weise &uuml;ber dessen Objektmodell <b>MSHTML<\/b>, auch <b>DOM<\/b> genannt, steuern.<\/p>\n<p>Dieses <b>Document Object Model <\/b>ist enorm umfangreich und leistungsf&auml;hig. Entwickler, die auch Webseiten mit Javascript erstellen, werden das wissen. Man kann auf jegliches Element eines HTML-Dokumentes sowohl zugreifen und dessen Eigenschaften &auml;ndern oder Aktionen darauf ausf&uuml;hren, wie auch neue Elemente erzeugen.<\/p>\n<p>Stellen wir also fest, dass mit dem Webbrowser Control ein geeignetes und unkompliziertes Steuerelement bereitsteht, mit dem durchformatierter Text angezeigt werden kann.<\/p>\n<p>Wie aber k&ouml;nnen wir den in diesem Steuerelement angezeigten Text editieren &#8211; der Internet Explorer bietet ja selbst auch keine M&ouml;glichkeit f&uuml;r manuelle &auml;nderungen<\/p>\n<p><b>Webbrowser im Design-Mode<\/b><\/p>\n<p>Die Tatsache, dass sich der Internet-Explorer mit nur einer Codezeile in einen Modus versetzen l&auml;sst, der das Dokument bearbeitbar macht, ist nur wenig bekannt.<\/p>\n<p>Dabei kann Text nicht nur gel&ouml;scht oder hinzugef&uuml;gt, sondern es k&ouml;nnen auch ohne viel Aufwand Formatierungen ver&auml;ndert werden. Der &#8222;echte&#8220; Internet-Explorer birgt aber nat&uuml;rlich keine Steuer- oder Men&uuml;elemente, &uuml;ber die sich das realisieren lie&szlig;e. Mit wenigen Zeilen VBA erwecken wir jedoch das Webbrowser-Steuerelement unter Access zum Leben, wie die folgende Anleitung zeigt:<\/p>\n<ul>\n<li class=\"aufz-hlung\">Erstellen Sie ein neues Formular unter einer beliebigen Access-Version.<\/li>\n<li class=\"aufz-hlung\">F&uuml;gen Sie im Formularentwurf &uuml;ber die Men&uuml;leiste (<b>Einf&uuml;gen|ActiveX-Steuerelement&#8230;<\/b>) oder &uuml;ber das Ribbon (<b>Entwurf|Steuerelemente<\/b>), ein Microsoft Webbrowser-Steuerelement ein und nennen es <b>ctlHTML<\/b>.<\/li>\n<li class=\"aufz-hlung\">Versionsabh&auml;ngig: Bevor Sie das Formular speichern, sollten Sie das Steuerelement in Access-Versionen vor Access 2003 auf seine endg&uuml;ltigen Abmessungen bringen. Leider ist es in fr&uuml;heren Versionen nicht m&ouml;glich, die Gr&ouml;&szlig;e des Elements nachtr&auml;glich zu &auml;ndern &#8211; weder im Entwurf noch zur Laufzeit. Zwar l&auml;sst sich durchaus der Container-Rahmen &auml;ndern, der enthaltene Browser zeigt sich davon jedoch unbeeindruckt und beh&auml;lt seine einmal gespeicherte Gr&ouml;&szlig;e bei.<\/li>\n<li class=\"aufz-hlung\">Schreiben Sie in die <b>Form_Load<\/b>-Ereignisprozedur (<b>Beim Laden<\/b>) folgende Zeile:<\/li>\n<\/ul>\n<pre>Me!ctlHTML.Object.Navigate2 &quot;http:\/\/www.access-im-unternehmen.de&quot;<\/pre>\n<p>Nach dem &Ouml;ffnen des Formulars zeigt dieses die gew&uuml;nschte Webseite an. Die <b>Navigate2<\/b>-Methode ist daf&uuml;r verantwortlich und erledigt das Gleiche, wie die Eingabe einer URL in die Adresszeile des Internet-Browsers.<\/p>\n<p>Unser Ziel ist es jedoch nicht, eine x-beliebige Webseite anzuzeigen, sondern neue HTML-Dokumente zu erzeugen und mit HTML-Strings aus einem Tabellenfeld zu speisen. Um ein solches neues Dokument im Steuerelement aufzubauen, reicht diese einfache Anweisung:<\/p>\n<pre>Me!ctlHTML.Object.Navigate2 &quot;about:blank&quot;<\/pre>\n<p>Diese Zeile ist unbedingt erforderlich, denn ohne sie zeigt das Steuerelement schlicht eine wei&szlig;e Fl&auml;che an. Erst ein Rechtsklick zur Laufzeit offenbart den Unterschied: Mit <b>about:blank <\/b>gibt es ein Kontextmen&uuml;, ohne gibt es keines.<\/p>\n<p>W&auml;hlen Sie im Kontextmen&uuml; dann den Eintrag <b>Quelltext anzeigen<\/b>, tritt dieser Inhalt zutage: <b>&lt;HTML&gt;&lt;\/HTML&gt;<\/b> und manchmal auch <b>&lt;BODY&gt;&lt;\/BODY&gt;<\/b>.<\/p>\n<p>Jetzt wird es interessant. Wie kann man das neue HTML-Dokument mit weiterem Inhalt, etwa aus einer Tabelle, f&uuml;llen<\/p>\n<p>Auch das l&auml;sst sich erstaunlich einfach realisieren: Man schreibt den HTML-Text &uuml;ber die <b>write<\/b>-Methode des Dokuments. Zuvor aber noch ein kurzer Ausflug in das DOM-Modell.<\/p>\n<p><b>DOM und MSHTML<\/b><\/p>\n<p>Auf das Webbrowser-Steuerelement selbst haben Sie, wie oben angef&uuml;hrt, &uuml;ber dessen <b>Object<\/b>-Eigenschaft Zugriff.<\/p>\n<p>&Ouml;ffnen Sie im VBA-Editor den Objektkatalog, so finden Sie dort unter der Bibliothek <b>SHDocVw<\/b>, auf welche automatisch beim Einf&uuml;gen eines Webbrowser-Controls verwiesen wird, das Klassenmodell zum Steuerelement. Die Klasse, die dem Control entspricht, nennt sich hier <b>Webbrowser<\/b>.<\/p>\n<p>Sie zeigt allerlei Eigenschaften und Methoden, mit denen sich etwa die Gestalt des Steuerelements selbst einstellen l&auml;sst &#8211; unter anderem die bereits erw&auml;hnte <b>Navigate2<\/b>-Methode. Augenscheinlich findet sich jedoch nichts, was einen direkten Bezug zum HTML-Inhalt des gehosteten Dokuments h&auml;tte.<\/p>\n<p>Die Bibliothek enth&auml;lt derlei tats&auml;chlich nicht. Daf&uuml;r ist eine andere Bibliothek zust&auml;ndig, die Sie manuell in die Verweise aufnehmen sollten und die ebenfalls vom Internet-Explorer-System bereitgestellt wird: <b>MSHTML<\/b>.<\/p>\n<p>&Ouml;ffnen Sie die Liste der Verweise (VBA-Editor, Men&uuml; <b>Extras|Verweise&#8230;<\/b>) und aktivieren Sie die Bibliothek <b>Microsoft HTML Object Library<\/b>.<\/p>\n<p>Wenn Sie sich diese Bibliothek im Objektkatalog zu Gem&uuml;te f&uuml;hren, dann steht vermutlich die Frage im Raum, wie deren erschlagender Umfang von Klassen zu b&auml;ndigen sei und wie die Verbindung zwischen dem Webbrowser-Control und der <b>MSHTML<\/b>-Bibliothek zustande kommt.<\/p>\n<p>Das geschieht &uuml;ber genau eine Eigenschaft des Web-Controls, n&auml;mlich <b>Document<\/b>. Diese gibt ein Objekt der <b>MSHTML<\/b>-Klasse <b>HTMLDocument <\/b>zur&uuml;ck, welche im Grunde die oberste Ebene des <b>DOM<\/b>-Modells darstellt. Ein <b>HTMLDocument <\/b>enth&auml;lt dann zahlreiche Unterobjekte, die ihrerseits haufenweise Eigenschaften und Auflistungen beheimaten. Nur ein exemplarisches Beispiel:<\/p>\n<p>Das <b>HTMLDocument <\/b>enth&auml;lt eine <b>body<\/b>-Eigenschaft, welche ein <b>HTMLBody<\/b>-Objekt zur&uuml;ckgibt. Das <b>HTMLBody<\/b>-Objekt kennt eine <b>style<\/b>-Eigenschaft in Form der <b>HTMLStyle<\/b>-Klasse. <b>HTMLStyle <\/b>wiederum zeigt eine Eigenschaft <b>fontSize<\/b>, die die Schriftgr&ouml;&szlig;e einstellt oder zur&uuml;ckgibt.<\/p>\n<p>Wollten wir also die Schriftgr&ouml;&szlig;e des gesamten Bodys eines im Webcontrol geladenen Dokuments auf <b>11pt <\/b>setzen, so lie&szlig;e sich das auch ohne <b>MSHTML <\/b>&uuml;ber folgenden Ausdruck erledigen:<\/p>\n<pre>Me!ctlHTML.Object.Document.body.style.fontSize = &quot;11pt&quot;<\/pre>\n<p>Hier wird deutlich, dass der Verzicht auf die <b>MSHTML<\/b>-Bibliothek zu sehr langen Ausdr&uuml;cken und zur Un&uuml;bersichtlichkeit f&uuml;hrt.<\/p>\n<p>Einfacher ist es, wenn man das Dokument direkt einer Objektvariablen zuweist und dann alle weiteren Aktionen mit deren Hilfe ausf&uuml;hrt:<\/p>\n<pre>Dim objDoc As MSHTML.HTMLDocument\r\nSet objDoc = Me!ctlHTML.Document\r\nWith objDoc\r\n    .body.style.fontSize = &quot;11pt&quot;\r\nEnd With\r\nEine Alternative w&auml;re auch dieser Code:\r\nDim objDoc As HTMLDocument\r\nDim objBody As HTMLBody\r\nSet objDoc = Me!ctlHTML.Document\r\nSet objBody = objDoc.body\r\nWith objBody\r\n    .style.fontSize = &quot;11pt&quot;\r\n    .style.font = &quot;Arial&quot;\r\nEnd With<\/pre>\n<p>Dies soll lediglich verdeutlichen, wie verschachtelt das <b>DOM<\/b>-Modell ist und wie man mithilfe von Objektvariablen mehr Struktur in den Code bringen kann.<\/p>\n<p>V&ouml;llig unverzichtbar wird <b>MSHTML<\/b>, wenn man auf Ereignisse reagieren will. Ein Objekt des Typs <b>HTMLDocument <\/b>etwa kann fast 40 Ereignisse ausl&ouml;sen.<\/p>\n<p>Markiert man beispielsweise im angezeigten Dokument eine Passage, so l&ouml;st dies ein Ereignis <b>onselectionchange <\/b>aus. Um auf dieses reagieren zu k&ouml;nnen, ben&ouml;tigt man eine Objektvariable mit dem Zusatz <b>WithEvents<\/b>:<\/p>\n<pre>Private WithEvents objDoc As MSHTML.HTMLDocument\r\n...\r\nSet objDoc = Me!ctlHTML.Document\r\n...\r\nPrivate Sub objDoc_onselectionchange()\r\n    Debug.Print &quot; Textauswahl wurde ge&auml;ndert&quot;\r\nEnd Sub<\/pre>\n<p>Die komplette Referenz zu <b>DOM<\/b> und <b>MSHTML <\/b>finden Sie unter [3] im Internet. An dieser Stelle soll es bei den wenigen grunds&auml;tzlichen Anregungen zur Arbeit mit der Bibliothek bleiben. Notiz am Rande: Die <b>MSHTML<\/b>-Bibliothek erweitert sich st&auml;ndig im selbem Ma&szlig;e wie der Internet-Explorer.<\/p>\n<p>Deshalb finden sich in der aktuellen Version etwa auch Klassen zum Phishing darin. Das gibt es aber erst seit Version 7. Wenn Sie mit der Bibliothek arbeiten, sollten Sie folglich genau darauf achten, dass keine Methoden Anwendung finden, die es auf einem etwaigen Zielsystem noch gar nicht gibt, weil dort vielleicht noch der Internet Explorer 6 installiert ist.<\/p>\n<p>In der Referenz zu <b>MSHTML <\/b>ist jeweils angegeben, seit welcher Version eine Methode g&uuml;ltig ist.<\/p>\n<p><b>HTML-Dokument bearbeiten<\/b><\/p>\n<p>Kommen wir zur urspr&uuml;nglichen Aufgabe zur&uuml;ck, ein Dokument im Web-Control in den bearbeitbaren Zustand zu versetzen.<\/p>\n<p>Bisher sehen Sie nach dem Laden eines Dokuments &uuml;ber <b>about:blank <\/b>ja nur eine leere Fl&auml;che. Mit einer weiteren Zeile schreiben Sie nun HTML-Code hinein:<\/p>\n<pre>Dim strHTML As String\r\nstrHTML = &quot;&lt;body&gt;&lt;strong&gt;TEST&lt;\/strong&gt;&lt;\/body&gt;&quot;\r\nctlHTML.Document.write strHTML<\/pre>\n<p>Und schon erscheint die Ausgabe <b>TEST<\/b> im Steuerelement. Falls Sie hier auf die Idee kommen sollten, wie oben angeregt, eine Objektvariable einzusetzen, werden Sie keinen Erfolg haben:<\/p>\n<pre>Dim objDoc As HTMLDocument\r\nSet objDoc = Me!ctlHTML.Document\r\nobjDoc.write strHTML<\/pre>\n<p>Dies f&uuml;hrt zu einem Fehler, weil ausgerechnet die <b>write<\/b>-Methode von <b>MSHTML.HTMLDocument <\/b>nicht VBA-komform ist und als Parameter einen <b>Variant<\/b>-Typ vorsieht, den es unter VBA im Unterschied zu C++ nicht gibt.<\/p>\n<p>Die <b>Document.write<\/b>-Methode &#8211; siehe oben &#8211; des Controls selbst hat damit aber offenbar keine Probleme und f&uuml;hrt intern die notwendige Konvertierung durch.<\/p>\n<p>Der hier hartkodierte Inhalt des Dokuments aus einer <b>String<\/b>-Variablen l&auml;sst sich selbstverst&auml;ndlich genauso gut aus einem Tabellenfeld auslesen, das wegen der m&ouml;glichen L&auml;nge des Inhalts als Memofeld deklariert sein sollte. Im Formular k&ouml;nnte das mit nur einer Zeile so aussehen:<\/p>\n<pre>ctlHTML.Document.write Me!HTML_Memofeld.Value<\/pre>\n<p><!--30percent--><\/p>\n<p>Der Clou: Mit ebenfalls nur einer Zeile l&auml;sst sich das Dokument editierbar machen:<\/p>\n<pre>ctlHTML.Document.designMode = &quot;On&quot;<\/pre>\n<p>Nach dieser Anweisung k&ouml;nnen Sie den Cursor nun an eine beliebige Stelle im Dokument setzen und Text dazu schreiben oder l&ouml;schen &#8211; gerade so, wie in einem Texteditor.<\/p>\n<p>Den Inhalt des ge&auml;nderten Dokuments lesen Sie anschlie&szlig;end aus dem Control aus und k&ouml;nnen ihn wieder im Datensatz speichern:<\/p>\n<pre>Me!HTML_Memofeld.Value = ctlHTML.Document.body.outerHTML<\/pre>\n<p>Hier wird nur der Body des Dokuments ausgelesen, aber mehr ben&ouml;tigen Sie auch nicht, weil das <b>&lt;HTML&gt;<\/b>-Tag ja bereits von einem neu per <b>about:blank <\/b>erzeugten Dokument angelegt wird. <b>outerHTML <\/b>bedeutet dabei, dass der HTML-Code inklusive des <b>body<\/b>-Tags und m&ouml;glicher Attribute selbst zur&uuml;ckgegeben wird, w&auml;hrend etwa <b>innerHTML <\/b>nur den eigentlichen Inhalt des Bodys enthielte.<\/p>\n<p>M&ouml;chten Sie das Dokument schlie&szlig;lich wieder in den normalen Zustand versetzen, so schalten Sie den Design-Mode einfach wieder ab:<\/p>\n<pre>ctlHTML.Document.designMode = &quot;Off&quot;\r\nSet objDoc = ctlHTML.Document<\/pre>\n<p>Wichtige Anmerkung dazu: Sollten Sie das Dokument einer Objektvariablen zugewiesen haben, so ist diese nach dem &auml;ndern des Design-Modes in der Regel nicht mehr g&uuml;ltig. Sie sollten deshalb nach jedem Wechsel des Design-Modes die Zuweisung erneut vornehmen.<\/p>\n<p><b>HTML-Dokument formatieren<\/b><\/p>\n<p>Mit dem bisher Beschriebenen sind Sie in der Lage, im HTML-Dokument des Steuerelements Text hinzuzuf&uuml;gen oder zu l&ouml;schen. Was nun noch fehlt ist die M&ouml;glichkeit, ihn zu formatieren. <\/p>\n<p>Dazu ist es f&uuml;r die wichtigsten Funktionen gar nicht notwendig, die HTML-Auszeichnungen per Code zu modifizieren. Normalerweise muss ja ein Text mit Formatierungs-Tags versehen werden, damit er sich in ver&auml;nderter Gestalt pr&auml;sentiert.<\/p>\n<p>So braucht es etwa das Tag <b>&lt;em&gt;<\/b>, um ein Wort fett wiederzugeben: <b>&lt;em&gt;TEST&lt;\/em&gt;<\/b>. Diese Tags muss man jedoch nicht in den HTML-Code hineinflicken, sondern bedient sich einer komfortablen Methode von <b>MSHTML<\/b>, die das automatisch macht, n&auml;mlich der Anweisung <b>execCommand<\/b>.<\/p>\n<p>Diese Methode eines <b>HTMLDocument<\/b>-Objekts erwartet in der Regel lediglich einen Anweisungs-String als Parameter und wirkt sich dann auf die aktuelle Auswahl im Dokument aus. Um eine mit der Maus markierte Passage fett zu formatieren, setzen Sie diese Anweisung ab:<\/p>\n<pre>objDoc.execCommand &quot;Bold&quot;<\/pre>\n<p>Manchmal wird auch ein zus&auml;tzlicher Parameter ben&ouml;tigt, der neben der Formatierungsanweisung noch einen Wert &uuml;bergibt, wie etwa beim &auml;ndern der Schriftart:<\/p>\n<pre>objDoc.execCommand &quot;Fontname&quot;, &quot;Courier New&quot;<\/pre>\n<p>Damit k&ouml;nnen Sie nun beispielsweise eine Schaltfl&auml;che mit der Aufschrift <b>Fett <\/b>versehen und in deren <b>Click<\/b>-Ereignisprozedur die Anweisung von oben schreiben. Sie erhalten somit einen einfachen WYSIWYG-HTML-Editor.<\/p>\n<p>Eine gute Demo f&uuml;r einen solchen auf der <b>execCommand<\/b>-Methode beruhenden Editor unter Access finden Sie bei Stephen Lebans [2].<\/p>\n<p>Wenn Sie erfahrem m&ouml;chten, welche Kommandos die <b>execCommand<\/b>-Methode unterst&uuml;tzt und wie die genaue Syntax auszusehen hat, so finden Sie eine ersch&ouml;pfende Zusammenstellung unter [4].<\/p>\n<p>Nicht f&uuml;r jeden Zweck allerdings reicht diese Methode allein aus und der HTML-Code muss manchmal direkt modifiziert werden. Auch hier gibt es jedoch Unterst&uuml;tzung durch <b>MSHTML <\/b>in Gestalt der Anweisung <b>pasteHTML<\/b>.<\/p>\n<p>Sie ersetzt den augenblicklich markierten Text durch einen im Parameter &uuml;bergebenen HTML-Code. Das k&ouml;nnte etwa so aussehen:<\/p>\n<pre>objDoc. selection.createRange.pasteHTML &quot;&lt;em&gt;TEST&lt;\/em&gt;&quot;<\/pre>\n<p>Hier wird zun&auml;chst die aktuelle Auswahl im Dokument als <b>selection<\/b>-Objekt erhalten. Mit diesem selbst kann man aber noch nicht viel anfangen. Seine Funktion <b>createRange <\/b>erst gibt das markierte Element oder eine ganze Auflistung von Elementen zur&uuml;ck.<\/p>\n<p>In der Regel wird das ein Objekt der <b>MSHTML<\/b>-Klasse <b>IHTMLTxtRange <\/b>sein. Und eben diese kennt die Methode <b>pasteHTML<\/b>, die genau dasselbe tut, als w&uuml;rden Sie HTML-Code aus der Zwischenablage ins Dokument einf&uuml;gen. Die aktuelle Auswahl wird also durch den neuen HTML-Code ersetzt. Ist kein Text ausgew&auml;hlt, so wird der HTML-String an jener Stelle eingef&uuml;gt, an der sich der Cursor befindet.<\/p>\n<p>Nun m&ouml;chten Sie allerdings weniger einen komplett neuen HTML-Code einf&uuml;gen, als vielmehr vorhandenen Text mit Formatierungs-Tags &#8222;umrahmen&#8220;. Dazu muss im ersten Schritt der ausgew&auml;hlte Text erhalten werden, was ebenfalls &uuml;ber das <b>selection<\/b>-Objekt m&ouml;glich ist:<\/p>\n<pre>strHTML = objDoc.selection.createRange.Text<\/pre>\n<p>Nun kann der Text mit den gew&uuml;nschten Formatierungs-Tags zusammengesetzt werden:<\/p>\n<pre>strHTML = &quot;&lt;em&gt;&quot; &amp; strHTML &amp; &quot;&lt;\/em&gt;&quot;\r\nobjDoc. selection.createRange.pasteHTML strHTML<\/pre>\n<p>Dieses Beispiel ist an sich &uuml;berfl&uuml;ssig, da ja bereits die <b>execCommand<\/b>-Methode mit dem Parameter <b>Bold<\/b> zum gleichen Ergebnis f&uuml;hrt. Es demonstriert aber die grunds&auml;tzliche Vorgehensweise auch f&uuml;r kompliziertere Operationen.<\/p>\n<p>Sie m&ouml;chten eventuell erfahren, wie ein im Dokument markiertes Wort formatiert ist<\/p>\n<p>Auch dazu reicht ein einzige Funktion aus, n&auml;mlich die <b>queryCommandValue<\/b>-Methode des <b>selection<\/b>-Objekts:<\/p>\n<pre>Wert = objDoc.selection.createRange.queryCommandValue (&quot;Bold&quot;)<\/pre>\n<p>Hier wird abgefragt, ob die Auswahl fett formatiert ist. Der Ausdruck gibt <b>True <\/b>zur&uuml;ck, wenn das der Fall ist. Eine R&uuml;ckgabe aller Formatierungen im Form eines Arrays oder einer Collection ist allerdings nicht m&ouml;glich &#8211; es muss schon nach jeder m&ouml;glichen Formatierung einzeln gefragt werden.<\/p>\n<p>Die R&uuml;ckgabe ist vom Datentyp <b>Variant <\/b>und kann je nach Kommando ein Bool-, Integer- oder String-Typ sein.<\/p>\n<p>N&uuml;tzlich ist das etwa, wenn Sie die Formatierung &uuml;ber den Zustand eines Formatierungs-Buttons signalisieren m&ouml;chten. Die erw&auml;hnte Schaltfl&auml;che <b>Fett <\/b>k&ouml;nnte etwa als Umschaltfl&auml;che daher kommen und bei fett markiertem Text in gedr&uuml;cktem Zustand erscheinen, so wie das auch in Textverarbeitungen geschieht.<\/p>\n<p>Damit Ihre Anwendung erkennt, wann sich die aktuelle Markierung ge&auml;ndert hat und somit die Liste der Formatierungen erneut abgefragt werden muss, machen Sie sich das <b>onselectionchange<\/b>-Ereignis des <b>HTMLDocument<\/b>-Objekts zunutze. In dieser Ereignisprozedur ermitteln Sie einfach alle vorgesehenen Formatierungen und stellen den Zustand der Schaltfl&auml;chen entsprechend ein.<\/p>\n<p>Aber damit w&auml;ren wir eigentlich schon bei der Beschreibung der Beispieldatenbank zu diesem Beitrag, die sich <b>htmlform.mdb<\/b> nennt und unter Access 2000 und h&ouml;her lauff&auml;hig ist.<\/p>\n<p><b>Datengebundenes HTML-Steuerelement<\/b><\/p>\n<p>In Bild 2 sehen Sie das Beispielformular der Anwendung <b>htmlform.mdb<\/b>, welches eine ziemlich einfache Adresskartei darstellt, gebunden an die Tabelle <b>tblPersonen<\/b>. <\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2010_01\/Webbrowser-web-images\/demo_form_opt.jpeg\" alt=\"demo_form.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 2: Formular der Beispieldatenbank mit formatierbarem Anmerkungenfeld<\/span><\/b><\/p>\n<p>Neben den g&auml;ngigen Datenfeldern ist ein Anmerkungen-Feld enthalten, dessen Inhalt sich wie in einer Textverarbeitung formatieren l&auml;sst &#8211; das Webbrowser-Steuerelement wird daf&uuml;r verwendet.<\/p>\n<p>Damit die L&ouml;sung allgemein verwendbar ist, kommt f&uuml;r dieses Feld ein Unterformular zum Einsatz, das auch den ganzen ben&ouml;tigten VBA-Code einh&auml;lt. Sie k&ouml;nnen dieses Unterformular (<b>sfrmHTML<\/b>) auch in Ihre eigenen Anwendungen integrieren.<\/p>\n<p>Was Sie dann noch mitimportieren m&uuml;ssen, ist das Modul <b>mdl_sfrmHTML<\/b>, welches einige Hilfsroutinen enth&auml;lt, die leider nicht direkt in den Formular-Code aufgenommen werden k&ouml;nnten, weil API-Callbacks zur Enumeration der Schriftarten im System zum Einsatz kommen, die den Operator <b>AddressOf <\/b>erforderlich machen. Dieser Operator l&auml;sst sich nicht f&uuml;r Prozeduren in Klassenmodulen verwenden.<\/p>\n<p>Daneben m&uuml;ssen in der Zielanwendung noch Verweise auf die <b>MSHTML<\/b>-Bibliothek sowie auf <b>SHDocVw<\/b> gesetzt sein. Diese Bibliothek finden Sie in der Liste der Verweise unter <b>Microsoft Internet Controls<\/b>; sie wird auch automatisch beim Einf&uuml;gen eines <b>Webbrowser Controls <\/b>gesetzt.<\/p>\n<p>Das Unterformular l&auml;sst sich dann wie ein eigenes Steuerelement einsetzen und an ein Datenfeld des Hauptformulars binden. Lediglich einige Eigenschaften des Unterformulars m&uuml;ssen eingestellt werden, alles Weitere l&auml;uft voll automatisch ab &#8211; sp&auml;ter mehr dazu.<\/p>\n<p>Im Rohzustand, aber edtierbar, zeigt sich das Unterformular wie in Bild 3.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2010_01\/Webbrowser-web-images\/editmode_true_opt.jpeg\" alt=\"editmode_true.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 3: HTML-Editor-Unterformular in unber&uuml;hrtem Zustand<\/span><\/b><\/p>\n<p>Neben dem Webbrowser-Control zur Eingabe des Textes findet sich in der rechten oberen Ecke noch ein unscheinbarer Button, der zum Ein- und Ausschalten der Formatierungen-Toolbars dient. Ein Klick auf ihn, und schon &auml;ndert sich das Erscheinungsbild des Unterformulars wie in Bild 4.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2010_01\/Webbrowser-web-images\/toolbar_opt.jpeg\" alt=\"toolbar.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 4: HTML-Editor mit eingeschalteter Toolbar zur Textformatierung<\/span><\/b><\/p>\n<p>Sie k&ouml;nnen nun Text in das Webbrowser-Feld eingeben, Passagen markieren und Formatierungen &uuml;ber die Schaltfl&auml;chen der Toolbar vornehmen, wie in Bild 5.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2010_01\/Webbrowser-web-images\/edit_text_opt.jpeg\" alt=\"edit_text.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 5: HTML-Editor-Unterformular im Einsatz<\/span><\/b><\/p>\n<p>Es w&auml;re m&uuml;&szlig;ig, hier die Formatierungsm&ouml;glichkeiten im Einzelnen zu erl&auml;utern. &Ouml;ffnen Sie einfach die Beispielanwendung und fahren Sie mit der Maus &uuml;ber die Schaltfl&auml;chen der Toolbar &#8211; im erscheinenden Tipptext wird dann die Bedeutung des Buttons angezeigt. <\/p>\n<p>Sie k&ouml;nnen selbstverst&auml;ndlich das Unterformular noch weiter aufbohren und mit zus&auml;tzlichen M&ouml;glichkeiten versehen, in der aktuellen Ausf&uuml;hrung d&uuml;rfte es jedoch den meisten Anforderungen gerecht werden &#8211; schlie&szlig;lich geht es hier um ein einfaches Pseudo-Textfeld, nicht um den Nachbau von MS Word.<\/p>\n<p>Unter Access 2000 erhalten Sie beim &Ouml;ffnen des Formulars m&ouml;glicherweise eine Fehlermeldung, die vom Bef&uuml;llen der Combobox mit den Schriftartennamen herr&uuml;hrt.<\/p>\n<p>Dieses Kombinationsfeld ist auf Werteliste als Datenherkunft eingestellt und wird &uuml;ber eine Hilfsfunktion <b>GetFonts <\/b>mit einem semikolonseparierten String der Schriftartennamen best&uuml;ckt.<\/p>\n<p>Unter Access 2000 darf diese Werteliste nicht l&auml;nger als 2.048 Zeichen lang sein, was hier schnell &uuml;berschritten ist. Daf&uuml;r ist in der Beispieldatenbank kein Workaround eingebaut.<\/p>\n<p>Denkbar w&auml;re etwa die Zuweisung einer Hilfstabelle an das Kombinationsfeld, die zuvor &uuml;ber die <b>GetFonts<\/b>-Prozedur mit den Fontsnamen bef&uuml;llt wurde, also eine direkte Datenbindung der Combobox.<\/p>\n<p>Auf einige Spezialit&auml;ten des Editor soll hier doch noch eingegangen werden.<\/p>\n<p>Als Schriftgr&ouml;&szlig;e werden die Zahlen <b>1 <\/b>bis <b>7 <\/b>verwendet, was nicht etwa als Gr&ouml;&szlig;e in Punkt zu verstehen ist, sondern die in HTML &uuml;bliche Gr&ouml;&szlig;enanweisung darstellt.<\/p>\n<p>An sich lassen sich &uuml;ber <b>Style<\/b>-Angaben Schriftgr&ouml;&szlig;en auch in Punkt angeben (<b>style=&#8220;font-size:11pt&#8220;<\/b>), das w&uuml;rde dann aber wieder eine umfangreichere Programmierung erforderlich machen, weil die <b>execCommand<\/b>-Methode im Verein mit der Anweisung <b>FontSize<\/b> solche Angaben nicht erlaubt.<\/p>\n<p>Ersatzweise m&uuml;sste also das HTML &uuml;ber <b>pasteHTML<\/b>, wie oben bereits ausgef&uuml;hrt, modifiziert werden.<\/p>\n<p>Hyperlinks werden erzeugt, indem man den gew&uuml;nschten Text markiert und auf die Hyperlink-Schaltfl&auml;che klickt. Dabei &ouml;ffnet sich eine Inputbox zur Eingabe der Zieladresse. Sie wird anschlie&szlig;end &uuml;ber das <b>&lt;a href&gt;<\/b>-Tag in den HTML-Code eingesetzt. Dieser Link funktioniert dann allerdings nicht im Design-Modus <b>on<\/b>.<\/p>\n<p>Erst wenn der Bearbeitungsmodus abgeschaltet wird, reagiert der Mauszeiger auf den Link-Text. Wird der Link nun angeklickt, so &ouml;ffnet sich die URL in einem externen Browser. Der Grund daf&uuml;r ist sicher plausibel: Normalerweise w&uuml;rde das Webbrowser-Control selbstst&auml;ndig zur gew&uuml;nschten URL navigieren.<\/p>\n<p>Dann aber h&auml;tte man statt des editierten Textes ganz anderen Inhalt im Control und w&uuml;rde diesen unter Umst&auml;nden f&auml;lschlicherweise abspeichern. Auch ein <b>Zur&uuml;ck<\/b> zum vorigen per <b>write<\/b>-Methode angelegten Text ist nicht m&ouml;glich &#8211; dieser schwebt bereits im Nirvana.<\/p>\n<p>Um das Navigieren zur Link-Adresse zu unterbinden, wird dieser Vorgang abgefangen. Dazu kann man sich des <b>BeforeNavigate<\/b>-Ereignisses des Webbrowser-Controls bedienen. Das Ereignis gibt als Parameter unter anderem die URL an, zu der das Control navigieren m&ouml;chte, und einen Parameter <b>Cancel<\/b>, der den Vorgang dann abbricht, wenn er in der Ereignisprozedur auf <b>True <\/b>gesetzt wird.<\/p>\n<p>Die entsprechende Prozedur des Unterformulars vergleicht nun, ob es sich bei der Link-Adresse um <b>about:blank<\/b> handelt, also das eigene Dokument, oder um einen externen Link. In letzterem Fall wird <b>Cancel <\/b>auf <b>True <\/b>gesetzt und stattdessen die Adresse einem externen Browser per <b>Shellexecute <\/b>&uuml;bergeben.<\/p>\n<p>Umbr&uuml;che sind ein spezielles Thema in HTML. Zwar entspricht die Eingabetaste, die zu einem <b>&lt;p&gt;<\/b>-Tag (<b>paragraph<\/b>) f&uuml;hrt, schon dem gleichen Vorgang etwa unter Word.<\/p>\n<p>Nur ist der Abstand der Abs&auml;tze im Browser dann so gro&szlig;, dass es wie eine Leerzeile wirkt. Deshalb wird im HTML-Unterformular das <b>ENTER <\/b>zu einem Zeilenumbruch gemacht (<b>&lt;br&gt;<\/b>) und die Kombination <b>STRG-ENTER <\/b>zu einem Absatzwechsel (<b>&lt;p&gt;<\/b>). Das kommt dem Verhalten g&auml;ngiger Textverarbeitungen einfach n&auml;her.<\/p>\n<p>Technisch ist die Sache ohnehin eine Speziall&ouml;sung. Denn ein ActiveX-Steuerelement erh&auml;lt unter Access die Eingabetaste grunds&auml;tzlich erst gar nicht mitgeteilt &#8211; auch dann nicht, wenn es den Fokus besitzt.<\/p>\n<p>Warum Microsoft das so gestaltete, ist unklar. Deshalb ist es notwendig, im Formular die <b>Tastenvorschau<\/b>-Eigenschaft auf <b>Ja <\/b>zu stellen und alle <b>KeyDown<\/b>-Events abzufangen. Alle Tasten-Codes bleiben unber&uuml;hrt bis auf den Wert <b>13<\/b>, der die <b>ENTER<\/b>-Taste identifiziert.<\/p>\n<p>Sobald dieser auftaucht, wird dem Dokument je nach m&ouml;glichem Zustand der Kontrolltasten ein <b>&lt;br&gt; <\/b>oder ein Absatzwechsel verpasst &#8211; Letzteres &uuml;ber die <b>execCommand<\/b>-Methode <b>InsertParagraph<\/b>.<\/p>\n<p>Hier unterscheidet sich die L&ouml;sung &uuml;brigens deutlich von jener, die Stephen Lebans in seiner Demo verbaute. Stephen f&auml;ngt zwar ebenfalls die <b>ENTER<\/b>-Taste ab, ermittelt dann aber etwas umst&auml;ndlich per API das Browser-Fenster-Handle, um ihm dann mit <b>SendKeys <\/b>die Tastencodes zu senden &#8211; eine in meinen Augen unn&ouml;tige Verrenkung.<\/p>\n<p>In der Toolbar des Unterformulars ist eine Schaltfl&auml;che mit einem H&auml;kchen zu finden, die das Speichern des HTML-Inhalts in den Datensatz des Hauptformulars erwirkt. Eigentlich w&auml;re dies &uuml;berfl&uuml;ssig, denn bereits das Verlassen des HTML-Unterformulars zieht explizit dasselbe nach sich.<\/p>\n<p>Da die Schaltfl&auml;che aber beim Webcontrol auch den Design-Modus abschaltet, ist eine Kontrolle des Ergebnisses m&ouml;glich, solange man sich noch im Unterformular befindet.<\/p>\n<p>Das Seitenlayout im Browser &auml;ndert sich n&auml;mlich teilweise etwas (Umbr&uuml;che!), wenn man zwischen beiden Modi umschaltet &#8211; zumindest l&auml;sst sich das beim Internet-Explorer 8 feststellen.<\/p>\n<p class=\"zwischen-berschrift-oberer-spaltenrand\">Code-Fragmente<\/p>\n<p>Wie das HTML-Unterformular eingesetzt werden kann, sehen Sie am Formular <b>frmPersonen <\/b>der Beispieldatenbank <b>htmlform.mdb<\/b>. In seiner <b>Load<\/b>-Prozedur werden alle Einstellungen f&uuml;r die Unterformularklasse vorgenommen:<\/p>\n<pre>With Me!sfrmAnmerkungen.Form\r\n    .BoundField = &quot;Anmerkungen&quot;\r\n    Set .ParentControl = Me!sfrmAnmerkungen\r\n    .BackColor = Me.Section(acDetail).BackColor\r\n    .ToolbarTimeout = 0\r\n    .AllowEditMode = False\r\nEnd With<\/pre>\n<p>Die wichtigste &ouml;ffentliche Property ist <b>BoundField<\/b>. Ihr &uuml;bergibt man den Namen des Tabellen- oder Abfragefeldes, an das man den HTML-Text binden m&ouml;chte. Im Beispiel ist dies das Memo-Feld <b>Anmerkungen <\/b>der Formulartabelle <b>tblPersonen<\/b>. <\/p>\n<p>Weiter ist zwingend der Name des Unterformulars selbst in <b>ParentControl <\/b>anzugeben, damit die Unterformularklasse dessen Ereignisse <b>Beim Hineingehen <\/b>und <b>Beim Verlassen <\/b>abfangen kann, um darauf mit dem Wechsel des Design-Modus reagieren zu k&ouml;nnen. (Offenbar gibt es aus einem Unterformular heraus keinen einfachen Weg, den Steuerelementnamen zu ermitteln, unter dem es im Hauptformular eingesetzt ist.)<\/p>\n<p>Mit <b>BackColor <\/b>kann man optional die Hintergrundfarbe f&uuml;r die Toolbar bestimmen. Im Beispiel wird daf&uuml;r die gleiche Farbe genommen, die auch der Detailbereich aufweist.<\/p>\n<p><b>ToolbarTimeout <\/b>ist ein <b>Long<\/b>-Wert, der angibt, nach welcher Zeitspanne (in Millisekunden) sich die Toolbar automatisch ausblendet, wenn im HTML-Unterformular nichts passiert.<\/p>\n<p>Wird er, wie im Beispiel, auf <b>0 <\/b>gesetzt, so bleibt der Toolbar dauerhaft sichtbar.<\/p>\n<p><b>AllowEditMode <\/b>bestimmt, ob der Text im Steuerelement &uuml;berhaupt bearbeitbar sein darf. Wird hier <b>False <\/b>zugewiesen, wie oben, dann erscheint die Formatierungs-Toolbar erst gar nicht und die HTML-Anzeige befindet sich quasi im <b>Readonly<\/b>-Modus. <\/p>\n<p>Die Eigenschaft kann aber jederzeit neu gesetzt werden, was im Beispielformular dann geschieht, wenn der Button mit der Aufschrift <b>Bearbeiten <\/b>ausgel&ouml;st wird (<b>cmdEdit_Click<\/b>). Die Toolbar erscheint nun automatisch und der Design-Mode ist eingeschaltet.<\/p>\n<p>Im <b>Form_Resize<\/b>-Event wird das HTML-Unterformular auf brauchbare Breite und H&ouml;he gebracht, sodass es immer den unteren Teil des Hauptformulars ausf&uuml;llt:<\/p>\n<pre>With Me!sfrmAnmerkungen\r\n    .Width = Me.InsideWidth - 600\r\n    .Height = Me.InsideHeight -.Top - 120\r\nEnd With<\/pre>\n<p>Unter Access 2007 kann man diesen Teil weglassen und stattdessen das Unterformular mit den Eigenschaften <b>Horizontaler Anker <\/b>und <b>Vertikaler Anker<\/b> verankern.<\/p>\n<p>Unter Access 2000 funktioniert, wie erw&auml;hnt, zwar die Gr&ouml;&szlig;en&auml;nderung f&uuml;r das Unterformular und das integrierte Webcontrol, der darin enthaltene Browser verbleibt jedoch in seinen einmal gespeicherten Abmessungen. Daf&uuml;r gibt es bisher keine bekannte L&ouml;sung. Zwar kann er mit API-Funktionen vergr&ouml;&szlig;ert werden, funktioniert dann aber nicht mehr korrekt. Das bedeutet, dass unter Access 2000 das HTML-Unterformular eine feste Gr&ouml;&szlig;e haben muss und man die <b>Resize<\/b>-Prozedur auskommentieren kann.<\/p>\n<p>Wenn Sie im Web-Control ein neues Dokument anlegen (<b>about:blank<\/b>) oder zu einer neuen Seite navigieren (<b>Navigate2<\/b>), dann ist es zun&auml;chst mit dieser Aufgabe besch&auml;ftigt, das jedoch in einem eigenen Thread, weshalb der VBA-Code sofort fortf&auml;hrt. Auf den Inhalt des Controls, also das <b>Document<\/b>-Objekt, k&ouml;nnen Sie aber erst zugreifen, wenn der Vorgang abgeschlossen ist. Zum Gl&uuml;ck gibt es eine <b>Status<\/b>-Eigenschaft im Web-Control, die Auskunft dar&uuml;ber gibt, ob ein Dokument fertig geladen ist, sodass man sie in einer Schleife abfragen kann:<\/p>\n<pre>Sub WaitForReady(Optional lState As Long = _\r\n    READYSTATE_INTERACTIVE)\r\n    If objHTML Is Nothing Then Exit Sub\r\n    Do\r\n        DoEvents\r\n    Loop Until objHTML.ReadyState &gt;= lState\r\nEnd Sub<\/pre>\n<p>Diese Hilfsprozedur wird erst verlassen, wenn der gew&uuml;nschte <b>ReadyState <\/b>erreicht ist. G&uuml;ltig ist das Dokument in der Regel dann, wenn der Status <b>READYSTATE_INTERACTIVE = 3 <\/b>entspricht. Diese Prozedur wird an verschiedenen Stellen im HTML-Unterformularcode aufgerufen.<\/p>\n<p>In der Toolbar von <b>sfrmHTML <\/b>finden Sie einen Button, durch den ein Rahmen um die im Dokument markierte Passage gezogen wird. Dabei wird nicht etwa eine Tabelle angelegt, sondern per <b>Style<\/b>-Eigenschaft ein <b>border<\/b>-Attribut gesetzt (Prozedur <b>cmdFrame_Click<\/b>). Derlei l&auml;sst sich nicht per <b>execCommand <\/b>bewerkstelligen, sondern muss durch Modifikation des HTML-Codes erfolgen:<\/p>\n<pre>objDoc.selection.createRange.pasteHTML _\r\n&quot;&lt;span style=&quot;&quot;border-width:1px;border-style:solid&quot;&quot;&gt;&quot; _\r\nobjDoc.selection.createRange.Text &amp; &quot;&lt;\/span&gt;&quot;<\/pre>\n<p>Hier wird der Text mit einem <b>SPAN<\/b>-Tag umrahmt und dessen <b>Style <\/b>mit einem <b>border<\/b>-Attribut versehen. Damit taucht ein kleines Problem auf: Diese Formatierung kann nicht &uuml;ber die Funktion <b>queryCommandValue <\/b>abgefragt werden. Die entsprechende Umschaltfl&auml;che wird also nicht aktiv, wenn man sp&auml;ter die Markierung auf diesen Bereich setzt. Auch das Entfernen der Formatierung (<b>cmdDelFormat_Click<\/b>) klappt damit nicht mehr. In diesem Fall hilft nur das L&ouml;schen der kompletten Textpassage und Neueingabe.<\/p>\n<p>Wollte man diesen Umstand &auml;ndern, so w&auml;re einiges mehr an Programmierung n&ouml;tig. Der HTML-Code des <b>selection<\/b>-Objekts m&uuml;sste analysiert und das <b>SPAN<\/b>-Tag daraus gel&ouml;scht werden. Den HTML-Code der markierten Stelle erhalten Sie mit dieser Anweisung:<\/p>\n<pre>strHTML = objDoc.selection.createRange.htmlText<\/pre>\n<p>Schrift- und Hintergrundfarbe des ausgew&auml;hlten Bereichs k&ouml;nnen mit Klick auf die daf&uuml;r vorgesehenen Toolbar-Elemente ge&auml;ndert werden.<\/p>\n<p>Es handelt sich dabei nicht um Schaltfl&auml;chen, sondern um Bildsteuerelemente, deren <b>Click<\/b>-Prozedur zum Aufruf des per API erzeugten Farbauswahldialogs von Windows f&uuml;hrt (<b>mdl_sfrmHTML<\/b>). Der Farbwert, den dieser Dialog zur&uuml;ckgibt, ist ein RGB-Long-Wert, der f&uuml;r HTML erst in die im Web &uuml;bliche Hexadezimal-Syntax &uuml;berf&uuml;hrt werden muss, was &uuml;ber die Hilfsroutine <b>MakeColorCode <\/b>geschieht:<\/p>\n<pre>Function MakeColorCode(AColor As Long) As String\r\n    Dim strColor As String\r\n    strColor = Hex(AColor)\r\n    strColor = String(6 - Len(strColor), &quot;0&quot;) &amp; strColor\r\n    strColor = Mid(strColor, 5) &amp; Mid(strColor, 3, 2) &amp; Left(strColor, 2)\r\n    MakeColorCode = &quot;#&quot; &amp; strColor\r\nEnd Function<\/pre>\n<p>Der Wert f&uuml;r <b>Rosa <\/b>(<b>13158655<\/b>) wird so zu <b>#FFC8C8<\/b>.<\/p>\n<p>Beim Wechsel eines Datensatzes im Hauptformular soll dem Web-Control der neue Inhalt des zugeh&ouml;rigen Tabellenfeldes zugewiesen werden. Damit das Unterformular diesen Wechsel &uuml;berhaupt mitbekommt, muss es auf das <b>Current<\/b>-Ereignis des Hauptformulars reagieren.<\/p>\n<p>Zwar k&ouml;nnte man gleich im Hauptformular und dessen <b>Current<\/b>-Ereignis den daf&uuml;r ben&ouml;tigten Code platzieren, m&uuml;sste ihn dann aber in jedem Formular wiederholen, welches ein HTML-Unterformular hostet. Um hier unabh&auml;ngiger zu bleiben, wurde dieser Code in das Unterformular integriert.<\/p>\n<p>Daf&uuml;r ist ein Verweis auf das Hauptformular in Form der per <b>WithEvents <\/b>deklarierten Objektvariablen <b>frmParent <\/b>vorgesehen. Deren <b>Current<\/b>-Ereignis wird aber nur ausgel&ouml;st, wenn die zugeh&ouml;rige Ereigniseigenschaft auch aktiviert ist:<\/p>\n<pre>frmParent.OnCurrent = &quot;[Event Procedure]&quot;<\/pre>\n<p>Die Ereignis-Routine sieht dann so aus:<\/p>\n<pre>Private Sub frmParent_Current()\r\n    Dim strHTML As String\r\n    objHTML.Navigate2 &quot;about:blank&quot;\r\n    WaitForReady\r\n    If Not frmParent.NewRecord Then\r\n        strHTML = Nz(frmParent.Controls(m_Field))\r\n    End If\r\n    If Len(strHTML) &gt; 0 Then\r\n        objHTML.Document.write strHTML\r\n    End If\r\n    Set objDoc = objHTML.Document\r\nEnd Sub<\/pre>\n<p>Als Erstes wird ein neues Dokument im Control &uuml;ber <b>about:blank<\/b> angelegt und auf dessen G&uuml;ltigkeit mit der besprochenen Hilfsfunktion <b>WaitForReady <\/b>gewartet. Dann wird, falls es sich nicht um einen neuen Hauptdatensatz handelt (<b>NewRecord<\/b>-Eigenschaft), der Inhalt des Tabellenfeldes ausgelesen. Um welches Feld es sich dabei handelt, wurde zuvor beim Initialisieren des Unterformulars als String in der Membervariablen <b>m_Field <\/b>abgelegt. Schlie&szlig;lich wird der HTML-Text mit der <b>write<\/b>-Methode in das Dokument geschrieben und ein Verweis auf das nun fertige Dokument in der Objektvariablen <b>objDoc <\/b>abgelegt, die nun f&uuml;r weitere Verwendung und Formatierungen zur Verf&uuml;gung steht.<\/p>\n<p>Der Code f&uuml;r den umgekehrten Vorgang, das Auslesen des Dokuments und Speichern im Tabellen-feld, wird ausgef&uuml;hrt, sobald das Unterformular verlassen wird, was &uuml;ber ein ebenfalls abgefangenes Ereignis geschieht:<\/p>\n<pre>Private Sub ctlParent_Exit(Cancel As Integer)\r\n    Dim strHTML As String\r\n    strHTML = objDoc.body.outerHTML\r\n    If m_AllowEdit Then _\r\n        frmParent.Controls(m_Field).Value = strHTML\r\n        objDoc.designMode = &quot;Off&quot;\r\n    End Sub<\/pre>\n<p>Aus der Dokumentvariablen wird &uuml;ber die <b>body.outerHTML<\/b>-Eigenschaft der HTML-Text ermittelt und nur dann in das Tabellenfeld gespeichert, wenn dies &uuml;ber die Eigenschaft <b>AllowEditMode <\/b>erlaubt wurde. Anschlie&szlig;end wird im Browser-Control der Bearbeitungsmodus abgeschaltet.<\/p>\n<p><b>Zusammenfassung<\/b><\/p>\n<p>&Uuml;ber das immer verf&uuml;gbare Webbrowser-Control wird die M&ouml;glichkeit geschaffen, Texte unter Access formatierbar zu machen. Die vorgestellte L&ouml;sung &uuml;ber ein HTML-Unterformular l&auml;sst sich leicht in beliebige eigene Datenbanken &uuml;bertragen.<\/p>\n<p>F&uuml;r den Produktiveinsatz sollten Sie sich allerdings den Code genauer ansehen. M&ouml;glicherweise ben&ouml;tigen Sie nicht alle der enthaltenen Formatierungsanweisungen oder Sie m&ouml;chten vielleicht das Verhalten der <b>ENTER<\/b>-Taste &auml;ndern.<\/p>\n<p>Die Fehlerbehandlung im Klassenmodul ist auch nur ziemlich rudiment&auml;r gestaltet, weshalb gerade mal 350 Zeilen Code f&uuml;r das Projekt ausreichten. Trauen Sie sich und machen Sie Ihren eigenen Editor daraus!<\/p>\n<p>Letzte Anmerkung: Versuchen Sie erst gar nicht, das Webbrowser-Control in einen Bericht einzubauen &#8211; es funktioniert nicht, und es gibt auch sonst kein ActiveX-Control, welches die Anzeige von HTML in Berichten leisten k&ouml;nne. Es bleibt nur der direkte Ausdruck des HTML-Dokuments, etwa &uuml;ber die <b>execCommand<\/b>-Methode <b>Print<\/b>. <\/p>\n<p><b>Links<\/b><\/p>\n<p class=\"quellen\">[1] Freie Richtext-ActiveX-Steuerelemente von Stephen Lebans und von vbAccelerator: http:\/\/www.lebans.com\/richtext.htm, http:\/\/www.vbaccelerator.com\/codelib\/richedit\/richedit.htm<\/p>\n<p class=\"quellen\">[2] HTML-Editor-Demodatenbank von Stephen Lebans: http:\/\/www.lebans.com\/htmleditor.htm<\/p>\n<p class=\"quellen\">[3] Referenz zur Internet-Explorer-Programmierung von Microsoft: http:\/\/msdn.microsoft.com\/en-us\/library\/aa752038%28VS.85%29.aspx<\/p>\n<p class=\"quellen\">[4] Formatierung im Webbrowser per execCommand-Methode: http:\/\/msdn.microsoft.com\/en-us\/library\/aa220275%28office.11%29.aspx<\/p>\n<h3>Downloads zu diesem Beitrag<\/h3>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>htmlform.zip<\/p>\n<p><a href=\"..\/fileadmin\/beispiele\/{A1921292-22ED-4B95-80B9-36F4DC05CAB7}\/aiu_705.zip\">Download<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Eine Access-Textbox, in einem Formular an ein Memo-Feld gebunden, ist eine spr&ouml;de Angelegenheit, wenn es darum geht, ihren Inhalt ansprechend zu gestalten. Denn alle Formatierungsm&ouml;glichkeiten beziehen sich immer nur auf das ganze Feld, den gesamten Text. Ein einzelnes Wort etwa fett hervorzuheben, ist nicht m&ouml;glich. Erst mit Access 2007 kam Farbe ins Spiel und der Richtext-Modus f&uuml;r Textfelder hielt Einzug, &uuml;ber den man Texte rudiment&auml;r formatieren kann. In allen fr&uuml;heren Access-Versionen bleibt man f&uuml;r diesen Zweck jedoch auf Fremdsteuerelemente angewiesen.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"om_disable_all_campaigns":false,"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"_uf_show_specific_survey":0,"_uf_disable_surveys":false,"footnotes":""},"categories":[66012010,662010,44000030,44000023],"tags":[],"class_list":["post-55000705","post","type-post","status-publish","format-standard","hentry","category-66012010","category-662010","category-Internet","category-Mit_Formularen_arbeiten"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.9 (Yoast SEO v27.4) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>HTML-Editor-Steuerelement - Access im Unternehmen<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/access-im-unternehmen.de\/HTMLEditorSteuerelement\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"HTML-Editor-Steuerelement\" \/>\n<meta property=\"og:description\" content=\"Eine Access-Textbox, in einem Formular an ein Memo-Feld gebunden, ist eine spr&ouml;de Angelegenheit, wenn es darum geht, ihren Inhalt ansprechend zu gestalten. Denn alle Formatierungsm&ouml;glichkeiten beziehen sich immer nur auf das ganze Feld, den gesamten Text. Ein einzelnes Wort etwa fett hervorzuheben, ist nicht m&ouml;glich. Erst mit Access 2007 kam Farbe ins Spiel und der Richtext-Modus f&uuml;r Textfelder hielt Einzug, &uuml;ber den man Texte rudiment&auml;r formatieren kann. In allen fr&uuml;heren Access-Versionen bleibt man f&uuml;r diesen Zweck jedoch auf Fremdsteuerelemente angewiesen.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-im-unternehmen.de\/HTMLEditorSteuerelement\/\" \/>\n<meta property=\"og:site_name\" content=\"Access im Unternehmen\" \/>\n<meta property=\"article:published_time\" content=\"2020-05-22T22:11:03+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/vg06.met.vgwort.de\/na\/5c0aea8722a74c9da0cf55145d1f6094\" \/>\n<meta name=\"author\" content=\"Andr\u00e9 Minhorst\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Verfasst von\" \/>\n\t<meta name=\"twitter:data1\" content=\"Andr\u00e9 Minhorst\" \/>\n\t<meta name=\"twitter:label2\" content=\"Gesch\u00e4tzte Lesezeit\" \/>\n\t<meta name=\"twitter:data2\" content=\"30\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/HTMLEditorSteuerelement\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/HTMLEditorSteuerelement\\\/\"},\"author\":{\"name\":\"Andr\u00e9 Minhorst\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\"},\"headline\":\"HTML-Editor-Steuerelement\",\"datePublished\":\"2020-05-22T22:11:03+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/HTMLEditorSteuerelement\\\/\"},\"wordCount\":5553,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/HTMLEditorSteuerelement\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg06.met.vgwort.de\\\/na\\\/5c0aea8722a74c9da0cf55145d1f6094\",\"articleSection\":[\"1\\\/2010\",\"2010\",\"Internet\",\"Mit Formularen arbeiten\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/HTMLEditorSteuerelement\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/HTMLEditorSteuerelement\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/HTMLEditorSteuerelement\\\/\",\"name\":\"HTML-Editor-Steuerelement - Access im Unternehmen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/HTMLEditorSteuerelement\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/HTMLEditorSteuerelement\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg06.met.vgwort.de\\\/na\\\/5c0aea8722a74c9da0cf55145d1f6094\",\"datePublished\":\"2020-05-22T22:11:03+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/HTMLEditorSteuerelement\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/HTMLEditorSteuerelement\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/HTMLEditorSteuerelement\\\/#primaryimage\",\"url\":\"http:\\\/\\\/vg06.met.vgwort.de\\\/na\\\/5c0aea8722a74c9da0cf55145d1f6094\",\"contentUrl\":\"http:\\\/\\\/vg06.met.vgwort.de\\\/na\\\/5c0aea8722a74c9da0cf55145d1f6094\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/HTMLEditorSteuerelement\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"HTML-Editor-Steuerelement\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\",\"name\":\"Access im Unternehmen\",\"description\":\"Das Magazin f\u00fcr Datenbankentwickler auf Basis von Microsoft Access\",\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/access-im-unternehmen.de\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"de\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\",\"name\":\"Andr\u00e9 Minhorst Verlag\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/wp-content\\\/uploads\\\/2019\\\/09\\\/aiu_wp.png\",\"contentUrl\":\"https:\\\/\\\/access-im-unternehmen.de\\\/wp-content\\\/uploads\\\/2019\\\/09\\\/aiu_wp.png\",\"width\":370,\"height\":111,\"caption\":\"Andr\u00e9 Minhorst Verlag\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/logo\\\/image\\\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\",\"name\":\"Andr\u00e9 Minhorst\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"caption\":\"Andr\u00e9 Minhorst\"}}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"HTML-Editor-Steuerelement - Access im Unternehmen","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/access-im-unternehmen.de\/HTMLEditorSteuerelement\/","og_locale":"de_DE","og_type":"article","og_title":"HTML-Editor-Steuerelement","og_description":"Eine Access-Textbox, in einem Formular an ein Memo-Feld gebunden, ist eine spr&ouml;de Angelegenheit, wenn es darum geht, ihren Inhalt ansprechend zu gestalten. Denn alle Formatierungsm&ouml;glichkeiten beziehen sich immer nur auf das ganze Feld, den gesamten Text. Ein einzelnes Wort etwa fett hervorzuheben, ist nicht m&ouml;glich. Erst mit Access 2007 kam Farbe ins Spiel und der Richtext-Modus f&uuml;r Textfelder hielt Einzug, &uuml;ber den man Texte rudiment&auml;r formatieren kann. In allen fr&uuml;heren Access-Versionen bleibt man f&uuml;r diesen Zweck jedoch auf Fremdsteuerelemente angewiesen.","og_url":"https:\/\/access-im-unternehmen.de\/HTMLEditorSteuerelement\/","og_site_name":"Access im Unternehmen","article_published_time":"2020-05-22T22:11:03+00:00","og_image":[{"url":"http:\/\/vg06.met.vgwort.de\/na\/5c0aea8722a74c9da0cf55145d1f6094","type":"","width":"","height":""}],"author":"Andr\u00e9 Minhorst","twitter_card":"summary_large_image","twitter_misc":{"Verfasst von":"Andr\u00e9 Minhorst","Gesch\u00e4tzte Lesezeit":"30\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/access-im-unternehmen.de\/HTMLEditorSteuerelement\/#article","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/HTMLEditorSteuerelement\/"},"author":{"name":"Andr\u00e9 Minhorst","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f"},"headline":"HTML-Editor-Steuerelement","datePublished":"2020-05-22T22:11:03+00:00","mainEntityOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/HTMLEditorSteuerelement\/"},"wordCount":5553,"commentCount":0,"publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/HTMLEditorSteuerelement\/#primaryimage"},"thumbnailUrl":"http:\/\/vg06.met.vgwort.de\/na\/5c0aea8722a74c9da0cf55145d1f6094","articleSection":["1\/2010","2010","Internet","Mit Formularen arbeiten"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/access-im-unternehmen.de\/HTMLEditorSteuerelement\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/access-im-unternehmen.de\/HTMLEditorSteuerelement\/","url":"https:\/\/access-im-unternehmen.de\/HTMLEditorSteuerelement\/","name":"HTML-Editor-Steuerelement - Access im Unternehmen","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/HTMLEditorSteuerelement\/#primaryimage"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/HTMLEditorSteuerelement\/#primaryimage"},"thumbnailUrl":"http:\/\/vg06.met.vgwort.de\/na\/5c0aea8722a74c9da0cf55145d1f6094","datePublished":"2020-05-22T22:11:03+00:00","breadcrumb":{"@id":"https:\/\/access-im-unternehmen.de\/HTMLEditorSteuerelement\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/access-im-unternehmen.de\/HTMLEditorSteuerelement\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/HTMLEditorSteuerelement\/#primaryimage","url":"http:\/\/vg06.met.vgwort.de\/na\/5c0aea8722a74c9da0cf55145d1f6094","contentUrl":"http:\/\/vg06.met.vgwort.de\/na\/5c0aea8722a74c9da0cf55145d1f6094"},{"@type":"BreadcrumbList","@id":"https:\/\/access-im-unternehmen.de\/HTMLEditorSteuerelement\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/access-im-unternehmen.de\/"},{"@type":"ListItem","position":2,"name":"HTML-Editor-Steuerelement"}]},{"@type":"WebSite","@id":"https:\/\/access-im-unternehmen.de\/#website","url":"https:\/\/access-im-unternehmen.de\/","name":"Access im Unternehmen","description":"Das Magazin f\u00fcr Datenbankentwickler auf Basis von Microsoft Access","publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/access-im-unternehmen.de\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"de"},{"@type":"Organization","@id":"https:\/\/access-im-unternehmen.de\/#organization","name":"Andr\u00e9 Minhorst Verlag","url":"https:\/\/access-im-unternehmen.de\/","logo":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/logo\/image\/","url":"https:\/\/access-im-unternehmen.de\/wp-content\/uploads\/2019\/09\/aiu_wp.png","contentUrl":"https:\/\/access-im-unternehmen.de\/wp-content\/uploads\/2019\/09\/aiu_wp.png","width":370,"height":111,"caption":"Andr\u00e9 Minhorst Verlag"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f","name":"Andr\u00e9 Minhorst","image":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","caption":"Andr\u00e9 Minhorst"}}]}},"_links":{"self":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55000705","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/comments?post=55000705"}],"version-history":[{"count":0,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55000705\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/media?parent=55000705"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/categories?post=55000705"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/tags?post=55000705"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}