{"id":55001029,"date":"2016-04-01T00:00:00","date_gmt":"2020-05-22T19:01:59","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=1029"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"HTMLListe_mit_AccessDaten","status":"publish","type":"post","link":"https:\/\/access-im-unternehmen.de\/HTMLListe_mit_AccessDaten\/","title":{"rendered":"HTML-Liste mit Access-Daten"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg09.met.vgwort.de\/na\/787ccf6908bf4ae1b197b2092011c188\" width=\"1\" height=\"1\" alt=\"\"><\/p>\n<p><b>Die Datenblatt-Ansicht und das Endlosformular sind gute Helfer, wenn es um die Anzeige mehrerer Datens&auml;tze einer Tabelle oder Abfrage geht. Allerdings haben beide einen gravierenden Nachteil: Sie zeigen alle Datens&auml;tze immer in der gleichen H&ouml;he an. Wenn also ein Datensatz etwa eine Notiz enth&auml;lt, die nur eine Zeile lang ist, eine andere aber zehn Zeilen, m&uuml;ssen Sie die Formularh&ouml;he nach dem l&auml;ngsten Inhalt auslegen. Dadurch verlieren Sie wiederum eine Menge Platz, da die H&ouml;he ja auch f&uuml;r kurze Inhalte beansprucht wird. Dieser Beitrag zeigt, wie Sie das Problem mithilfe von HTML und dem Webbrowser-Steuerelement beheben.<\/b><\/p>\n<h2>Beispieltabelle<\/h2>\n<p>Als Beispiel f&uuml;r die Anzeige und Bearbeitung von Daten in einem Webbrowser-Steuerelement verwenden wir die Tabelle <b>tblNotizen<\/b>. Diese enth&auml;lt neben dem Prim&auml;rschl&uuml;sselfeld <b>NotizID <\/b>noch die beiden Felder <b>Notiz <\/b>mit dem eigentlichen Inhalt (ausgelegt als Memo-Feld, also mit ausreichend Platz) sowie ein Feld namens <b>AngelegtAm<\/b>.<\/p>\n<h2>Webbrowser-Steuerelement einbauen<\/h2>\n<p>Das Formular mit dem ersten Beispiel soll <b>frmNotizen <\/b>hei&szlig;en. Dass das Formular seine Daten in einem Webbrowser-Steuerelement anzeigen soll und keine eigenen Datens&auml;tze, k&ouml;nnen Sie die Eigenschaften <b>Datensatzmarkierer<\/b>, <b>Navigationsschaltfl&auml;chen<\/b>, <b>Bildlaufleisten <\/b>und <b>Trennlinien <\/b>auf den Wert <b>Nein <\/b>einstellen.<\/p>\n<p>F&uuml;gen Sie dem Formular dann das Webbrowser-Steuerelement hinzu und nennen Sie es <b>ctlWebbrowser<\/b> (s. Bild 1).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2016_02\/pic_1029_001.png\" alt=\"Einf&uuml;gen und Anpassen des Webbrowser-Steuerelements\" width=\"599,4715\" height=\"441,9919\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: Einf&uuml;gen und Anpassen des Webbrowser-Steuerelements<\/span><\/b><\/p>\n<p>Stellen Sie seine Eigenschaften <b>Horizontaler Anker <\/b>und <b>Vertikaler Anker <\/b>jeweils auf den Wet <b>Beide <\/b>ein. Auf diese Weise passt es seine Gr&ouml;&szlig;e automatisch an die Gr&ouml;&szlig;e des Formulars an.<\/p>\n<p>Bevor wir richtig loslegen, f&uuml;gen Sie dem VBA-Projekt der Datenbank noch einen Verweis auf die Bibliothek <b>Microsoft HTML Object Library <\/b>hinzu (s. Bild 2). Den <b>Verweise<\/b>-Dialog des VBA-Editors &ouml;ffnen Sie mit dem Men&uuml;befehl <b>Extras|Verweise<\/b>.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2016_02\/pic_1029_002.png\" alt=\"Zus&auml;tzlicher Verweis auf die Bibliothek Microsoft HTML Object Library\" width=\"424,6255\" height=\"330,2643\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 2: Zus&auml;tzlicher Verweis auf die Bibliothek Microsoft HTML Object Library<\/span><\/b><\/p>\n<p>Diese Bibliothek steuert die Elemente f&uuml;r die VBA-Programmierung des HTML-Dokuments bei &#8211; wir k&ouml;nnen damit vollst&auml;ndige Internetseiten nicht nur definieren, sondern auch steuern, also beispielsweise auf die Ereignisse der einzelnen Elemente der HTML-Seite reagieren. Dies ist wichtig, wenn wir etwa durch einen Mausklick auf einen Datensatz ein Detailformular zum Bearbeiten der Daten dieses Datensatzes aufrufen m&ouml;chten.<\/p>\n<p>Bevor wir mit der Programmierung des Formulars und des Webbrowser-Steuerelements beginnen, wollen wir noch die Tabelle <b>tblNotizen<\/b> mit einigen Datens&auml;tzen f&uuml;llen. Die Tabelle sieht anschlie&szlig;end wie in Bild 3 aus.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2016_02\/pic_1029_003.png\" alt=\"Beispieldaten f&uuml;r die Tabelle tblNotizen\" width=\"599,4715\" height=\"464,3524\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 3: Beispieldaten f&uuml;r die Tabelle tblNotizen<\/span><\/b><\/p>\n<h2>Programmierung des Webbrowser-Steuerelements<\/h2>\n<p>Das Webbrowser-Steuerelement soll die Daten der Tabelle <b>tblNotizen <\/b>anzeigen und bei Bet&auml;tigen der Taste <b>F5 <\/b>wie ein herk&ouml;mmliches Formular seine Daten aktualisieren. Wenn Sie also das Formular ge&ouml;ffnet haben und dann beispielsweise im Hintergrund einen Datensatz direkt in der Tabelle ver&auml;ndern, soll die Taste <b>F5 <\/b>zur Anzeige der ge&auml;nderten Daten im Webbrowser-Steuerelement f&uuml;hren.<\/p>\n<p>Damit wir auf alle Ereignisse rund um das Webbrowser-Steuerelement und das enthaltene Dokument in Form der Implementierung geeigneter Ereignisprozeduren reagieren k&ouml;nnen, deklarieren wir sowohl f&uuml;r das Webbrowser-Steuerelement als auch f&uuml;r das darin angezeigte Dokument je eine Variable mit dem Schl&uuml;sselwort <b>WithEvents<\/b>:<\/p>\n<pre><span style=\"color:blue;\">Private <\/span>WithEvents objWebbrowser<span style=\"color:blue;\"> As <\/span>WebBrowser\r\n<span style=\"color:blue;\">Private <\/span>WithEvents objDocument<span style=\"color:blue;\"> As <\/span>MSHTML.HTMLDocument<\/pre>\n<p>Beim Laden des Formulars sind einige vorbereitende Aktionen durchzuf&uuml;hren. Diese implementieren wir in Form einer Ereignisprozedur, die durch das Ereignis <b>Beim Laden <\/b>des Formulars ausgel&ouml;st wird. Diese Prozedur sieht wie folgt aus:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>Form_Load()\r\n     <span style=\"color:blue;\">Set<\/span> objWebbrowser = Me!ctlWebbrowser.Object\r\n     WebbrowserLeeren\r\n     objWebbrowser.Document.Write \"&lt;p&gt;&lt;\/p&gt;\"\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Die erste Anweisung setzt die Objektvariable <b>objWeb-brow-ser<\/b> auf das im Webbrowser-Steuerelement enthaltene Objekt. Die zweite ruft eine Prozedur namens <b>Web-browserLeeren <\/b>auf, die das Steuerelement mit einer leeren HTML-Seite f&uuml;llt und erst zur aufrufenden Prozedur zur&uuml;ckwechselt, wenn dieser Vorgang ausgef&uuml;hrt wurde. Dazu durchl&auml;uft die Prozedur eine <b>Do While<\/b>-Schleife, deren Abbruchbedingung die Eigenschaft <b>ReadyState <\/b>des Webbrowser-Steuerelements mit dem Wert <b>READYSTATE_COMPLETE <\/b>vergleicht:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>WebbrowserLeeren()\r\n     objWebbrowser.Navigate \"about:blank\"\r\n     <span style=\"color:blue;\">Do While<\/span> <span style=\"color:blue;\">Not<\/span> objWebbrowser.ReadyState =  READYSTATE_COMPLETE\r\n         DoEvents\r\n     <span style=\"color:blue;\">Loop<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Diese Bedingung wird erf&uuml;llt, wenn die Seite von der angegebenen Adresse, hier <b>about:blank <\/b>f&uuml;r eine leere Seite, vollst&auml;ndig geladen wurde. Danach f&uuml;gt die Prozedur <b>Form_Load <\/b>noch eine einzelne, leere Zeile zum Dokument hinzu (<b>objWebbrowser.Document.Write &#8222;&#8220;<\/b>).<\/p>\n<h2>Daten im Webbrowser-Steuerelement anzeigen<\/h2>\n<p>Das waren bereits die Vorbereitungen und wir k&ouml;nnen mit dem F&uuml;llen der Seite mit den eigentlichen Inhalten beginnen, damit diese wie in Bild 4 im Webbrowser-Steuer-element erscheinen. Aber wann sollen diese nun geladen werden &#8211; und welches Ereignis l&ouml;st diesen Vorgang aus Da wir, wie weiter oben beschrieben, den Inhalt des Webbrowser-Steuerelements beim Bet&auml;tigen von <b>F5 <\/b>ebenfalls aktualisieren wollen, w&auml;re die durch das Ereignis <b>Beim Anzeigen <\/b>ausgel&ouml;ste Prozedur der richtige Ort. Also f&uuml;gen wir dort den Aufruf der Routine zum Anzeigen der Daten ein:<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2016_02\/pic_1029_004.png\" alt=\"Anzeige der Daten im Webbrowser-Steuerelement\" width=\"700\" height=\"369,4444\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 4: Anzeige der Daten im Webbrowser-Steuerelement<\/span><\/b><\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>Form_Current()\r\n     DatenAnzeigen\r\n     <span style=\"color:blue;\">Debug.Print<\/span> objDocument.documentElement.innerHTML\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Au&szlig;erdem hinterlegen wir dort noch einen Befehl, der nach F&uuml;llen des Webbrowser-Steuerelements einmal den HTML-Inhalt des angezeigten Dokuments im Direktfenster ausgibt &#8211; einfach, damit Sie einmal kontrollieren k&ouml;nnen, wie der erzeugte Code aussieht. Mit dem Kontextmen&uuml;-befehl <b>Quellcode anzeigen <\/b>des Webbrowser-Steuerelements erhalten Sie n&auml;mlich lediglich den Text <b><html><\/html><\/b>, was wenig hilfreich ist.<\/p>\n<p>Die Prozedur <b>DatenAnzeigen<\/b> finden Sie in Listing 1. Sie deklariert zun&auml;chste einige Elemente, welche die im Webbrowser-Steuerelement angezeigten Objekte repr&auml;sentieren. Als Erstes ben&ouml;tigen wir, um die Struktur einer Tabelle abzubilden, ein Objekt des Typs <b>HTMLTable<\/b>, das wir mit der Variablen <b>objTable <\/b>deklarieren. Au&szlig;erdem ben&ouml;tigen wir ein <b>HTMLTableRow<\/b>-Objekt (<b>objRow<\/b>) und ein <b>HTMLTableCell<\/b>-Objekt (<b>objCell<\/b>).<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>DatenAnzeigen()\r\n     <span style=\"color:blue;\">Dim <\/span>objTable<span style=\"color:blue;\"> As <\/span>MSHTML.HTMLTable\r\n     <span style=\"color:blue;\">Dim <\/span>objRow<span style=\"color:blue;\"> As <\/span>MSHTML.HTMLTableRow\r\n     <span style=\"color:blue;\">Dim <\/span>objCell<span style=\"color:blue;\"> As <\/span>MSHTML.HTMLTableCell\r\n     <span style=\"color:blue;\">Dim <\/span>strBackgroundColor<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strBorderColor<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>db<span style=\"color:blue;\"> As <\/span>DAO.Database\r\n     <span style=\"color:blue;\">Dim <\/span>rst<span style=\"color:blue;\"> As <\/span>DAO.Recordset\r\n     <span style=\"color:blue;\">Set<\/span> objWebbrowser = Me!ctlWebbrowser.Object\r\n     <span style=\"color:blue;\">Set<\/span> objDocument = objWebbrowser.Document\r\n     <span style=\"color:blue;\">Set<\/span> db = CurrentDb\r\n     <span style=\"color:blue;\">Set<\/span> rst = db.OpenRecordset(\"SELECT * FROM tblNotizen\", dbOpenDynaset)\r\n     WebbrowserLeeren\r\n     objWebbrowser.Document.Clear\r\n     <span style=\"color:blue;\">Set<\/span> objTable = objDocument.createElement(\"Table\")\r\n     objDocument.Body.appendChild objTable\r\n     objTable.Style.borderCollapse = \"collapse\"\r\n     <span style=\"color:blue;\">Set<\/span> objRow = objTable.insertRow\r\n     <span style=\"color:blue;\">Set<\/span> objCell = objRow.insertCell\r\n     <span style=\"color:blue;\">With<\/span> objCell\r\n         FormatHeader objCell\r\n         .innerText = \"Datum:\"\r\n     End <span style=\"color:blue;\">With<\/span>\r\n     <span style=\"color:blue;\">Set<\/span> objCell = objRow.insertCell\r\n     <span style=\"color:blue;\">With<\/span> objCell\r\n         FormatHeader objCell\r\n         .innerText = \"Notiz:\"\r\n     End <span style=\"color:blue;\">With<\/span>\r\n     <span style=\"color:blue;\">Do While<\/span> <span style=\"color:blue;\">Not<\/span> rst.EOF\r\n         <span style=\"color:blue;\">If <\/span>rst.AbsolutePosition <span style=\"color:blue;\">Mod<\/span> 2 = 0<span style=\"color:blue;\"> Then<\/span>\r\n             strBackgroundColor = \"#FFFFFF\"\r\n             strBorderColor = \"#EEEEEE\"\r\n         <span style=\"color:blue;\">Else<\/span>\r\n             strBackgroundColor = \"EEEEEE\"\r\n             strBorderColor = \"#FFFFFF\"\r\n         <span style=\"color:blue;\">End If<\/span>\r\n         <span style=\"color:blue;\">Set<\/span> objRow = objTable.insertRow\r\n         <span style=\"color:blue;\">Set<\/span> objCell = objRow.insertCell\r\n         <span style=\"color:blue;\">With<\/span> objCell\r\n             FormatCell objCell, strBackgroundColor, strBorderColor\r\n             .ID = rst!NotizID\r\n             .innerText = rst!AngelegtAm\r\n         End <span style=\"color:blue;\">With<\/span>\r\n         <span style=\"color:blue;\">Set<\/span> objCell = objRow.insertCell\r\n         <span style=\"color:blue;\">With<\/span> objCell\r\n             FormatCell objCell, strBackgroundColor, strBorderColor\r\n             .ID = rst!NotizID\r\n             .innerText = rst!Notiz\r\n         End <span style=\"color:blue;\">With<\/span>\r\n         rst.Move<span style=\"color:blue;\">Next<\/span>\r\n     <span style=\"color:blue;\">Loop<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 1: F&uuml;llen des Webbrowser-Steuerelements mit den Daten der Tabelle tblNotizen<\/span><\/b><\/p>\n<p>Daneben m&uuml;ssen wir nat&uuml;rlich auf die aktuelle Datenbank sowie die Tabelle <b>tblNotizen <\/b>zugreifen, daher deklarieren wir ein entsprechendes Objekt des Typs <b>Database <\/b>(<b>db<\/b>) und eines des Typs <b>Recordset <\/b>(<b>rst<\/b>).<\/p>\n<p>Das Webbrowser-Steuerelement referenzieren wir hier nur aus dem Grund erneut mit der Variablen <b>objWebbrowser<\/b>, weil sich dies bei Experimenten und den dabei auftretenden unbehandelten Fehlern schon einmal leert und dies dann zu einem weiteren Fehler f&uuml;hrt. Dann f&uuml;llen wir die Variable <b>objDocument <\/b>mit einem Verweis auf das im Webbrowser angezeigte Dokument (<b>objWebbrowser.Document<\/b>).<\/p>\n<p>Die Vorbereitungen f&uuml;r den Zugriff auf die Tabelle <b>tblNotizen <\/b>enthalten das F&uuml;llen der Variablen <b>db <\/b>mit dem <b>Database<\/b>-Objekt der aktuellen Datenbank mit <b>CurrentDb<\/b>, und die <b>OpenRecordset<\/b>-Methode versieht die Variable <b>rst <\/b>mit einem Recordset auf Basis der Tabelle <b>tblNotizen<\/b>.<\/p>\n<p>Danach ruft die Prozedur erneut die Routine <b>WebbrowserLeeren <\/b>auf und leert auch noch das <b>Document<\/b>-Objekt mit der <b>Clear<\/b>-Methode.<\/p>\n<p>Schlie&szlig;lich beginnt das eigentliche F&uuml;llen des Dokuments, zun&auml;chst mit einem <b>Table<\/b>-Element. Das Element erstellt die Prozedur mit der <b>createElement<\/b>-Methode und dem Namen des zu erstellenden Objekts als Parameter (Table). Dieses Element f&uuml;gt die <b>appendChild<\/b>-Methode des <b>Body<\/b>-Elements des Dokuments dann in den Body des Dokuments ein. Der HTML-Code sieht an dieser Stelle wie folgt aus:<\/p>\n<pre>&lt;HEAD&gt;&lt;\/HEAD&gt;\r\n&lt;BODY&gt;\r\n     &lt;TABLE&gt;&lt;\/TABLE&gt;\r\n&lt;\/BODY&gt;<\/pre>\n<p>Nun stellen wir die Eigenschaft <b>Style.borderCollapse <\/b>auf <b>collapse<\/b> ein, was bewirkt, dass die Rahmen der verschiedenen Zellen der Tabelle miteinander verschmelzen und nicht jede Zelle einen eigenen Rahmen erh&auml;lt.<\/p>\n<p>Nun kommt die Prozedur zu den Zeilen und Spalten, zuerst mit der Kopfzeile, welche die Spalten&uuml;berschriften enthalten und anders formatiert sein soll. Diese f&uuml;gen wir mit der <b>insertRow<\/b>-Methode des <b>HTMLTable<\/b>-Objekts aus <b>objTable <\/b>ein und referenzieren es mit der Variablen <b>objRow<\/b>. Wir ben&ouml;tigen zwei Spalten, eine f&uuml;r das Feld <b>AngelegtAm <\/b>und eine f&uuml;r das Feld <b>Notiz<\/b>. Die Zelle der Kopfzeile f&uuml;r das Feld <b>AngelegtAm <\/b>f&uuml;gt die Prozedur mit der Methode <b>insertCell <\/b>des soeben erzeugten Elements <b>objRow <\/b>an und speichert den Verweis darauf in der Variablen <b>objCell<\/b>. F&uuml;r dieses Objekt rufen wir einmal die Routine <b>FormatHeader <\/b>auf und &uuml;bergeben dieser den Verweis auf die Zelle, dann f&uuml;gen wir der Eigenschaft <b>innerText <\/b>den Ausdruck <b>Datum: <\/b>hinzu, also den Text f&uuml;r die Spalten&uuml;berschrift.<\/p>\n<p>Die Routine <b>FormatHeader <\/b>nimmt den Verweis auf die zu formatierende Zelle entgegen und weist dann verschiedenen Eigenschaften des <b>Style<\/b>-Objekts der Zelle die gew&uuml;nschten Werte zu. <b>BorderColor <\/b>und <b>BackgroundColor <\/b>erhalten die Schrift- und die Hintergrundfarbe, <b>BorderWidth <\/b>die Rahmendicke, <b>BorderStyle <\/b>die Rahmenart (hier <b>solid <\/b>f&uuml;r einen durchgezogenen Rahmen).<\/p>\n<p>Die horizontale Ausrichtung stellt die Eigenschaft <b>TextAlign <\/b>mit <b>center <\/b>als zentriert ein, die vertikale Ausrichtung &uuml;bernimmt die Eigenschaft <b>verticalAlign <\/b>mit dem Wert <b>top<\/b>. <b>FontSize<\/b>, <b>FontFamily <\/b>und <b>FontWeight <\/b>definieren das Aussehen der Schrift. <b>Padding <\/b>legt schlie&szlig;lich fest, dass der Text einen Abstand von <b>5 <\/b>zum linken, oberen, rechten und unteren Rand erhalten soll:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>FormatHeader(objCell<span style=\"color:blue;\"> As <\/span>HTMLTableCell)\r\n     <span style=\"color:blue;\">With<\/span> objCell.Style\r\n         .BorderColor = \"#999999\"\r\n         .BackgroundColor = \"#CCCCCC\"\r\n         .BorderWidth = \"1px\"\r\n         .BorderStyle = \"solid\"\r\n         .TextAlign = \"center\"\r\n         .VerticalAlign = \"top\"\r\n         .FontSize = \"9pt\"\r\n         .FontFamily = \"Calibri\"\r\n         .FontWeight = \"bold\"\r\n         .Padding = \"5,5,5,5\"\r\n     End <span style=\"color:blue;\">With<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Die Prozedur <b>DatenAnzeigen <\/b>f&uuml;hrt dann den gleichen Vorgang f&uuml;r die Spalten&uuml;berschrift mit dem Text <b>Notiz: <\/b>durch und ruft auch hier wieder die Routine <b>FormatHeader <\/b>auf.<\/p>\n<p>Danach folgen die eigentlichen Daten, welche die Prozedur in einer <b>Do While<\/b>-Schleife &uuml;ber alle Datens&auml;tze des Recordsets <b>rst <\/b>durchl&auml;uft. Dabei trifft die Prozedur zun&auml;chst die Vorbereitung f&uuml;r die Anzeige der einzelnen Zeilen mit wechselnden Hintergrundfarben. Dies betrifft nicht nur die Hintergrundfarbe, sondern auch die Rahmenfarbe, weshalb wir die zu verwendenden Farben in zwei Variablen namens <b>strBackgroundColor <\/b>und <b>strBorderColor <\/b>speichern. Hier stehen die beiden Farben <b>#FFFFFF <\/b>(wei&szlig;) und <b>#EEEEEE <\/b>(hellgrau) zur Auswahl, wobei diese wechselseitig zum Einsatz kommen sollen (also wei&szlig;er Hintergrund\/hellgrauer Rahmen und hellgrauer Hintergrund\/wei&szlig;er Rahmen).<\/p>\n<p>Ob die erste oder die zweite Variante gew&auml;hlt werden soll, ermitteln wir mit dem Ausdruck <b>rst.AbsolutePosition Mod 2 = 0<\/b>. Dies ergibt bei geraden Werten f&uuml;r <b>rst.AbsolutePosition <\/b>(also der aktuellen Position des Datensatzzeigers mit dem Wert <b>0 <\/b>f&uuml;r den ersten Datensatz) den Wert <b>True <\/b>und bei ungeraden Werten den Wert <b>False<\/b>, sodass die beiden Variablen <b>strBackgroundColor <\/b>und <b>strBorderColor <\/b>abwechselnd mit den Werten <b>#FFFFFF <\/b>und <b>#EEEEEE <\/b>gef&uuml;llt werden.<\/p>\n<p>Nach dem Anlegen der Zeile f&uuml;r den aktuellen Datensatz mit der <b>insertRow<\/b>-Methode und dem Erstellen der Zelle f&uuml;r das Anlagedatum mit <b>insertCell <\/b>ruft die Prozedur diesmal die Routine <b>FormatCell <\/b>auf. Diese finden Sie in Listing 2. Die Routine erwartet nicht nur einen Verweis auf die zu formatierende Zelle, sondern optional noch Werte f&uuml;r die beiden Parameter <b>strBackgroundColor <\/b>und <b>strBorderColor<\/b>. Sie pr&uuml;ft zuerst, ob der Parameter <b>strBackgroundColor <\/b>gef&uuml;llt ist. Falls ja, erh&auml;lt die Eigenschaft <b>BackgroundColor <\/b>den Wert dieses Parameters, anderenfalls den Standardwert <b>#FFFFFF<\/b>. Das Gleiche erledigt die Prozedur f&uuml;r den Parameter <b>strBorderColor <\/b>und die Eigenschaft <b>BorderColor <\/b>der Zelle. Schlie&szlig;lich stellt sie die &uuml;brigen Eigenschaften der Zelle ein, die Sie bereits weiter oben kennen gelernt haben (mit kleinen Unterschieden &#8211; zum Beispiel soll die Schrift nicht fett dargestellt werden, daf&uuml;r aber links ausgerichtet).<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>FormatCell(objCell<span style=\"color:blue;\"> As <\/span>HTMLTableCell, <span style=\"color:blue;\">Optional<\/span> strBackgroundColor _\r\n        <span style=\"color:blue;\"> As String<\/span>, <span style=\"color:blue;\">Optional<\/span> strBorderColor<span style=\"color:blue;\"> As String<\/span>)\r\n     <span style=\"color:blue;\">With<\/span> objCell.Style\r\n         <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Len<\/span>(strBackgroundColor) &gt; 0<span style=\"color:blue;\"> Then<\/span>\r\n             .backgroundColor = strBackgroundColor\r\n         <span style=\"color:blue;\">Else<\/span>\r\n             .backgroundColor = \"#FFFFFF\"\r\n         <span style=\"color:blue;\">End If<\/span>\r\n         <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Len<\/span>(strBorderColor) &gt; 0<span style=\"color:blue;\"> Then<\/span>\r\n             .BorderColor = strBorderColor\r\n         <span style=\"color:blue;\">Else<\/span>\r\n             .BorderColor = \"#CCCCCC\"\r\n         <span style=\"color:blue;\">End If<\/span>\r\n         .BorderWidth = \"1px\"\r\n         .BorderStyle = \"solid\"\r\n         .TextAlign = \"left\"\r\n         .FontSize = \"9pt\"\r\n         .verticalAlign = \"top\"\r\n         .fontFamily = \"Calibri\"\r\n         .padding = \"5,5,5,5\"\r\n     End <span style=\"color:blue;\">With<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 2: Formatieren der Zellen mit den Daten der Tabelle tblNotizen<\/span><\/b><\/p>\n<p>Die Eigenschaft <b>innerText <\/b>f&uuml;llt die Prozedur mit dem Wert des Feldes <b>AngelegtAm<\/b>. Au&szlig;erdem schreibt sie den Prim&auml;rschl&uuml;sselwert des aktuellen Datensatzes in die Eigenschaft <b>ID <\/b>der Zelle &#8211; dies ist eine vorbereitende Ma&szlig;nahme f&uuml;r weitere Funktionen. Das Erstellen und F&uuml;llen der Zelle mit dem Inhalt des Feldes <b>Notiz <\/b>verl&auml;uft analog zum F&uuml;llen der Zelle mit dem Anlagedatum. Diese Schritte wiederholt die Prozedur f&uuml;r alle Datens&auml;tze des Recordsets <b>rst <\/b>und f&uuml;llt so die Tabelle mit den gew&uuml;nschten Daten.<\/p>\n<h2>Auf die Taste F5 reagieren<\/h2>\n<p>Wenn der Benutzer die Taste <b>F5 <\/b>bet&auml;tigt, sollen die im Webbrowser-Steuerelement angezeigten Daten aktualisiert werden. Dies ist der erste Fall, in dem wir ein Ereignis des <b>HTMLDocument<\/b>-Objekts implementieren wollen. Es handelt sich um das Ereignis <b>Bei Taste ab<\/b>, das Sie anlegen, indem Sie im Codefenster des Klassenmoduls des Formulars mit dem linken Kombinationsfeld den Eintrag <b>objDocument<\/b> und mit dem rechten den Wert <b>onkeydown <\/b>ausw&auml;hlen (s. Bild 5). Die nun im Codefenster erscheinende Prozedur <b>objDocument_onkeydown <\/b>f&uuml;llen Sie wie folgt:<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2016_02\/pic_1029_005.png\" alt=\"Anlegen eines Ereignisses f&uuml;r das Objekt objDocument\" width=\"599,4715\" height=\"461,8568\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 5: Anlegen eines Ereignisses f&uuml;r das Objekt objDocument<\/span><\/b><\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>objDocument_onkeydown()\r\n     <span style=\"color:blue;\">Dim <\/span>Cancel<span style=\"color:blue;\"> As Boolean<\/span>\r\n     Cancel = <span style=\"color:blue;\">False<\/span>\r\n     <span style=\"color:blue;\">With<\/span> objDocument.parentWindow.event\r\n         <span style=\"color:blue;\">If <\/span>.keyCode = 116<span style=\"color:blue;\"> Then<\/span>\r\n             Cancel = <span style=\"color:blue;\">True<\/span> ''F5\r\n         <span style=\"color:blue;\">End If<\/span>\r\n         <span style=\"color:blue;\">If <\/span>Cancel<span style=\"color:blue;\"> Then<\/span>\r\n             DatenAnzeigen\r\n         <span style=\"color:blue;\">End If<\/span>\r\n     End <span style=\"color:blue;\">With<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><!--30percent--><\/p>\n<p>Die Prozedur pr&uuml;ft, ob der Benutzer die Taste <b>F5 <\/b>gedr&uuml;ckt hat, was dem Wert <b>116 <\/b>f&uuml;r den Wert <b>keyCode <\/b>des Objekts <b>objDocument.parentWindow.event <\/b>entspricht. In diesem Fall ruft die Prozedur erneut die Routine <b>DatenAnzeigen <\/b>auf und f&uuml;llt das Webbrowser-Steuerelement erneut.<\/p>\n<p>Der mit dieser Prozedur erzeugte HTML-Quellcode des im Webbrowser-Steuerelement angezeigten Dokuments sieht nun in gek&uuml;rzter Fassung wie in Listing 3 aus.<\/p>\n<pre>&lt;HEAD&gt;&lt;\/HEAD&gt;\r\n&lt;BODY&gt;\r\n   &lt;TABLE style=\"BORDER-COLLAPSE: collapse\"&gt;\r\n     &lt;TBODY&gt;\r\n       &lt;TR&gt;\r\n         &lt;TD style=\"BORDER-BOTTOM: #999999 1px solid; TEXT-ALIGN: center; BORDER-LEFT: #999999 1px solid; \r\n           PADDING-BOTTOM: 5px; BACKGROUND-COLOR: #cccccc; PADDING-LEFT: 5px; PADDING-RIGHT: 5px; \r\n           FONT-FAMILY: Calibri; FONT-SIZE: 9pt; VERTICAL-ALIGN: top; BORDER-TOP: #999999 1px solid; \r\n           FONT-WEIGHT: bold; BORDER-RIGHT: #999999 1px solid; PADDING-TOP: 5px\"&gt;Datum:&lt;\/TD&gt;\r\n         &lt;TD style=\"...\" id=1&gt;Notiz:&lt;\/TD&gt;\r\n       &lt;\/TR&gt;\r\n       &lt;TR&gt;\r\n         &lt;TD style=\"...\" id=1&gt;01.03.2016&lt;\/TD&gt;\r\n         &lt;TD style=\"...\" id=1&gt;Dies ist eine kurze Notiz.&lt;\/TD&gt;&lt;\/TR&gt;\r\n       &lt;TR&gt;\r\n         &lt;TD style=\"...\" id=2&gt;02.03.2016&lt;\/TD&gt;\r\n         &lt;TD style=\"...\" id=2&gt;Dies ist eine lange Notiz. Dies ist eine lange Notiz. ... Dies ist eine lange Notiz. &lt;\/TD&gt;\r\n       &lt;\/TR&gt;\r\n       &lt;TR&gt;\r\n         &lt;TD style=\"...\" id=3&gt;02.03.2016&lt;\/TD&gt;\r\n         &lt;TD style=\"...\" id=3&gt;Dies ist eine kurze Notiz.&lt;\/TD&gt;\r\n       &lt;\/TR&gt;\r\n       &lt;TR&gt;\r\n         &lt;TD style=\"...\" id=4 &gt;02.03.2016&lt;\/TD&gt;\r\n         &lt;TD style=\"...\" id=4&gt;Dies ist eine lange Notiz. Dies ist eine lange Notiz. ... Dies ist eine lange Notiz. &lt;\/TD&gt;\r\n       &lt;\/TR&gt;\r\n       &lt;TR&gt;\r\n         &lt;TD style=\"...\" id=5 &gt;02.03.2016&lt;\/TD&gt;\r\n         &lt;TD style=\"...\" id=5&gt;Dies ist eine kurze Notiz.&lt;\/TD&gt;\r\n       &lt;\/TR&gt;\r\n       &lt;TR&gt;\r\n         &lt;TD style=\"...\" id=6 &gt;06.03.2016&lt;\/TD&gt;\r\n         &lt;TD style=\"...\" id=6&gt;Dies ist eine lange Notiz. Dies ist eine lange Notiz. ... Dies ist eine lange Notiz. &lt;\/TD&gt;\r\n       &lt;\/TR&gt;\r\n     &lt;\/TBODY&gt;\r\n   &lt;\/TABLE&gt;\r\n&lt;\/BODY&gt;<\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 3: Quellcode der erzeugten HTML-Seite<\/span><\/b><\/p>\n<h2>Erweiterung: Anzeigen eines Detailformulars<\/h2>\n<p>Nun hilft uns die Anzeige der reinen Daten insofern weiter, als dass wir diese nun ohne unn&ouml;tige Zwischenr&auml;ume pr&auml;sentiert bekommen, die durch die unterschiedlich langen Inhalte des Feldes Notiz auftreten. Allerdings k&ouml;nnen wir im Datenblatt als auch im Endlosformular immer noch die Daten bearbeiten. Diese M&ouml;glichkeit wollen wir auch hier anbieten &#8211; allerdings in etwas anderer Form, n&auml;mlich &uuml;ber ein Detailformular, das beim Anklicken eines bestimmten Bereichs des zu bearbeitenden Datensatzes ge&ouml;ffnet wird. Das Detailformular ist ein einfaches Formular, das einen Datensatz der zugrunde liegenden Tabelle zum Bearbeiten &ouml;ffnet.<\/p>\n<p>Nun m&uuml;ssen wir uns nur noch entscheiden, wie der Benutzer das Detailformular mit dem gew&uuml;nschten Datensatz &ouml;ffnen soll.<\/p>\n<p>Am intuitivsten w&auml;re wohl eine kleine Schaltfl&auml;che mit einem Bearbeiten-Symbol f&uuml;r jeden einzelnen Datensatz. Zus&auml;tzlich k&ouml;nnen wir dem Benutzer auch noch erm&ouml;glichen, den zu bearbeitenden Datensatz durch einen Doppelklick auf eine der Zellen des betroffenen Datensatzes im Detailformular anzuzeigen. Au&szlig;erdem ben&ouml;tigen wir nat&uuml;rlich noch eine Schaltfl&auml;che, mit der wir das Detailformular zum Anlegen eines neuen Datensatzes &ouml;ffnen k&ouml;nnen, und eine Schaltfl&auml;che je Datensatz, &uuml;ber die der Benutzer den Datensatz l&ouml;schen kann.<\/p>\n<h2>HTML-Ansicht mit Aktion f&uuml;llen<\/h2>\n<p>Wir haben ja bereits die beiden Objekte <b>HTMLTableRow <\/b>und <b>HTMLTableCell <\/b>mit den Objektvariablen <b>objRow <\/b>und <b>objCell <\/b>referenziert. Diese Variablen k&ouml;nnen wir auch mit dem Schl&uuml;sselwort <b>WithEvents <\/b>versehen und damit daf&uuml;r sorgen, dass wir deren Ereignisse unter VBA implementieren k&ouml;nnen. Wir k&ouml;nnen dann so beispielsweise ein Ereignis behandeln, das durch einen Doppelklick auf ein <b>HTMLTableCell<\/b>-Objekt ausgel&ouml;st wird. Oder wir f&uuml;gen der Tabelle noch ein oder zwei Spalten hinzu, die Icons beziehungsweise Schaltfl&auml;chen zum Ausf&uuml;hren von Aktionen wie dem Bearbeiten oder L&ouml;schen aufnehmen.<\/p>\n<p>Im Detail sieht das so aus wie in Bild 6. Hier haben wir etwa durch einen Doppelklick auf eines der <b>HTMLTableCell<\/b>-Objekte ein Ereignis ausgel&ouml;st, f&uuml;r das wir eine <b>MsgBox<\/b>-Anweisung hinterlegt haben. Die Schaltfl&auml;chen rechts l&ouml;sen beim einfachen Anklicken Ereignisprozeduren aus.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2016_02\/pic_1029_006.png\" alt=\"Anzeigen eines Meldungsfensters beim Doppelklick auf einen Eintrag\" width=\"599,4715\" height=\"370,0916\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 6: Anzeigen eines Meldungsfensters beim Doppelklick auf einen Eintrag<\/span><\/b><\/p>\n<p>Nun w&auml;re es einfach, eine einzelne Zelle mit einer mit dem Schl&uuml;sselwort <b>WithEvents <\/b>gekennzeichneten Variablen zu referenzieren und daf&uuml;r eine Ereignisprozedur zu hinterlegen. Wir haben aber bereits in dieser einfachen Darstellung in jeder Zeile zwei Zellen, die wir mit Doppelklick-Ereignissen ausstatten m&uuml;ssten &#8211; und noch je zwei weitere Icons, die bei einem einfachen Mausklick ihre Ereignisse ausl&ouml;sen sollen. Und da wir diese Menge Objektvariablen auch noch f&uuml;r jeden einzelnen Datensatz ben&ouml;tigen, obwohl wir noch nicht einmal wissen, um wie viele Datens&auml;tze es sich hier handelt, k&ouml;nnen wir kaum mit statischem Code arbeiten: Wir m&uuml;ssen zur Laufzeit beim F&uuml;llen des Webbrowser-Steuerelements f&uuml;r jedes zu ber&uuml;cksichtigende Steuerelement ein Objekt auf Basis einer Klasse erstellen, die alle notwendigen Eigenschaften aufnimmt und die Ereignisprozeduren enth&auml;lt. Diese sollen nach dem Erstellen in einer Collection landen, damit sie nicht im Nirwana verschwinden. Dieses <b>Collection<\/b>-Objekt deklarieren wir wie folgt im Kopf des Klassenmoduls des Formulars (die fortgeschrittene Version finden Sie im Formular <b>frmNotizenMitDetailformular<\/b>):<\/p>\n<pre><span style=\"color:blue;\">Dim <\/span>colObjects<span style=\"color:blue;\"> As <\/span>Collection<\/pre>\n<p>Da nun einige Zusatzaufgaben zu erledigen sind, haben wir die Prozedur <b>DatenAnzeigen <\/b>stark angepasst (s. Listing 4). Die Prozedur deklariert weitgehend die gleichen Variablen, einige fallen aber weg. Dann initialisiert sie das <b>Collection<\/b>-Objekt <b>colObjects<\/b>, welches alle Wrapperklassen f&uuml;r die Zellen und Icons der Tabelle aufnehmen soll. Die Definition der Tabellenzeile mit den Spalten&uuml;berschriften erfolgt wieder wie in der vorherigen Version. Innerhalb der <b>Do While<\/b>-Schleife zum Durchlaufen der Datens&auml;tze der Tabelle <b>tblNotizen <\/b>ermittelt die Prozedur weiterhin die Hintergrund- und Rahmenfarben f&uuml;r die einzelnen Zeilen. Dann legt sie das <b>HTMLTableRow<\/b>-Objekt an und f&uuml;gt das erste <b>HTMLTableCell<\/b>-Objekt ein. Die <b>FormatCell<\/b>-Methode haben wir hier etwas erweitert, denn wir &uuml;bergeben dieser mit dem letzten Parameter auch gleich den anzuzeigenden Text, der dann in der Eigenschaft <b>InnerText <\/b>landen soll. Nun folgt ein wichtiger Schritt: Wir rufen die Routine <b>CreateCellWrapper <\/b>auf, die wie in Listing 5 aussieht, und &uuml;bergeben dieser den Verweis auf das soeben erstellte <b>HTMLTableCell<\/b>-Objekt <b>objCell<\/b>.<\/p>\n<pre><span style=\"color:blue;\">Private Function <\/span>CreateCellWrapper(objCell<span style=\"color:blue;\"> As <\/span>HTMLTableCell, _\r\n         varID<span style=\"color:blue;\"> As Variant<\/span>, frm<span style=\"color:blue;\"> As <\/span>Form)\r\n     <span style=\"color:blue;\">Dim <\/span>objCellWrapper<span style=\"color:blue;\"> As <\/span>clsCellWrapper\r\n     <span style=\"color:blue;\">Set<\/span> objCellWrapper = <span style=\"color:blue;\">New<\/span> clsCellWrapper\r\n     <span style=\"color:blue;\">With<\/span> objCellWrapper\r\n         <span style=\"color:blue;\">Set<\/span> .Cell = objCell\r\n         .ID = varID\r\n         <span style=\"color:blue;\">Set<\/span> .Form = frm\r\n     End <span style=\"color:blue;\">With<\/span>\r\n     <span style=\"color:blue;\">Set<\/span> CreateCellWrapper = objCellWrapper\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 4: Die Funktion CreateCellWrapper<\/span><\/b><\/p>\n<p>Die Routine <b>CreateCellWrapper <\/b>erstellt ein neues Objekte auf Basis der Klasse <b>clsCellWrapper <\/b>und weist diesem Werte f&uuml;r die Eigenschaften <b>Cell<\/b>, <b>ID <\/b>und <b>Form <\/b>zu. <b>Cell <\/b>enth&auml;lt den Verweis auf das <b>HTMLTableCell<\/b>-Objekt, das wir mit dem Ereignis <b>OnDblClick <\/b>ausstatten wollen.<\/p>\n<p><b>ID <\/b>ist der Prim&auml;rschl&uuml;sselwert des Datensatzes und <b>Form <\/b>enth&auml;lt einen Verweis auf das Formular, welches das <b>Web-browser<\/b>-Steuerelement anzeigt (&uuml;bergeben mit <b>Me<\/b>).<\/p>\n<p>Das Objekt des Typs <b>clsCellWrapper <\/b>wird dann an die aufrufende Zeile zur&uuml;ckgegeben. Dort wird es direkt weiterverarbeitet, indem es mit der <b>Add<\/b>-Methode zur Collection <b>colObjects <\/b>hinzugef&uuml;gt wird (da wir das Wrapper-Objekt sonst im Code nicht mehr ben&ouml;tigen, brauchen wir es erst gar nicht mit einer Objektvariablen zu referenzieren). Die Klasse <b>clsCellWrapper <\/b>beschreiben wir weiter unten.<\/p>\n<p>Auf die gleiche Weise geht die Prozedur einen Schritt weiter mit der Zelle zur Anzeige des Inhalts des Feldes Notiz vor.<\/p>\n<h2>Icons zum L&ouml;schen und Bearbeiten hinzuf&uuml;gen<\/h2>\n<p>Nun folgen die hinteren beiden Zellen je Zeile, die wir im vorherigen Beispiel noch nicht ber&uuml;cksichtigt haben. Diese sollen die Schaltfl&auml;chen beziehungsweise Icons zum Starten des Bearbeitungsvorgangs eines Datensatzes beziehungsweise zum L&ouml;schen eines Datensatzes einleiten.<\/p>\n<p>Dazu erstellt die Prozedur <b>DatenAnzeigen <\/b>zun&auml;chst wieder ein <b>HTMLTableCell<\/b>-Objekt. Dieses formatiert sie mit der Routine <b>FormatCell<\/b>, die Sie ja bereits weiter oben kennen gelernt haben. Nun f&uuml;gen wir das <b>HTMLImg<\/b>-Element zu der in <b>objCell <\/b>gespeicherten Tabellenzelle hinzu. Dazu ruft die Prozedur die Funktion <b>AddImage<\/b> aus Listing 6 auf. Diese erwartet einen Verweis auf das <b>HTMLDocument<\/b>-Objekt, auf das &uuml;bergeordnete Element (hier das <b>HTMLTableCell<\/b>-Element), den Pfad zur anzuzeigenden Bilddatei sowie die Breite und die H&ouml;he der Bilddatei.<\/p>\n<pre><span style=\"color:blue;\">Private Function <\/span>AddImage(objDocument<span style=\"color:blue;\"> As <\/span>HTMLDocument, objParent<span style=\"color:blue;\"> As Object<\/span>, _\r\n         strImage<span style=\"color:blue;\"> As String<\/span>, lngWidth<span style=\"color:blue;\"> As Long<\/span>, lngHeight<span style=\"color:blue;\"> As Long<\/span>)<span style=\"color:blue;\"> As <\/span>HTMLImg\r\n     <span style=\"color:blue;\">Dim <\/span>objImage<span style=\"color:blue;\"> As <\/span>HTMLImg\r\n     <span style=\"color:blue;\">Set<\/span> objImage = objDocument.createElement(\"img\")\r\n     objParent.appendChild objImage\r\n     objImage.src = strImage\r\n     objImage.Width = lngWidth\r\n     objImage.Height = lngHeight\r\n     <span style=\"color:blue;\">Set<\/span> AddImage = objImage\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 6: Die Funktion AddImage<\/span><\/b><\/p>\n<p>Die Funktion <b>AddImages <\/b>erstellt mit der <b>createElement<\/b>-Methode ein neues Element des Typs <b>HTMLImg <\/b>und speichert den Verweis darauf in der Variablen <b>obj-Image<\/b>. Dann h&auml;ngt sie dieses mit der <b>Append<\/b>-Methode an das &uuml;bergeordnete Element an, also das <b>HTMLTableCell<\/b>-Element aus <b>objCell<\/b>. Die Eigenschaft <b>src <\/b>nimmt den Pfad zur anzuzeigenden Bilddatei auf (in unserem Fall im Verzeichnis der Datenbank befindlich), die Eigenschaften <b>Width <\/b>und <b>Height <\/b>die Abmessungen. Schlie&szlig;lich weist sie das neue Objekt <b>objImage <\/b>dem R&uuml;ckgabewert der Funktion, <b>AddImage<\/b>, zu.<\/p>\n<p>Damit geht es weiter in der Prozedur <b>DatenAnzeigen<\/b>. Hier landet das Ergebnis der Funktion <b>AddImage <\/b>in der Variablen <b>objImage<\/b>. Dieses &uuml;bergibt die Prozedur gleich der Funktion <b>CreateImageWrapper <\/b>aus Listing 7. Diese erwartet den Verweis auf das <b>HTMLImg<\/b>-Objekt aus <b>objImage<\/b>, den Prim&auml;rschl&uuml;sselwert des aktuellen Datensatzes, einen String, der die auszuf&uuml;hrende Aktion definiert (zum Beispiel <b>edit <\/b>oder <b>delete<\/b>) sowie einen Verweis auf das &uuml;bergeordnete <b>Form<\/b>-Objekt.<\/p>\n<pre><span style=\"color:blue;\">Private Function <\/span>CreateImageWrapper(objImage<span style=\"color:blue;\"> As <\/span>HTMLImg, _\r\n         varID<span style=\"color:blue;\"> As Variant<\/span>, strImageFunction<span style=\"color:blue;\"> As String<\/span>, frm<span style=\"color:blue;\"> As <\/span>Form)\r\n     <span style=\"color:blue;\">Dim <\/span>objImageWrapper<span style=\"color:blue;\"> As <\/span>clsImageWrapper\r\n     <span style=\"color:blue;\">Set<\/span> objImageWrapper = <span style=\"color:blue;\">New<\/span> clsImageWrapper\r\n     <span style=\"color:blue;\">With<\/span> objImageWrapper\r\n         <span style=\"color:blue;\">Set<\/span> .Image = objImage\r\n         .ID = varID\r\n         .ImageFunction = strImageFunction\r\n         <span style=\"color:blue;\">Set<\/span> .Form = frm\r\n     End <span style=\"color:blue;\">With<\/span>\r\n     <span style=\"color:blue;\">Set<\/span> CreateImageWrapper = objImageWrapper\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 7: Die Funktion CreateImageWrapper<\/span><\/b><\/p>\n<p>Sie erstellt ein neues Objekt auf Basis der Wrapperklasse <b>clsImageWrapper<\/b>, die eine Eigenschaft mehr aufweist als die Wrapperklasse <b>clsCellWrapper<\/b> &#8211; und zwar die Eigenschaft <b>Image-Func-tion<\/b>, die in diesem Fall den Wert <b>edit <\/b>entgegennimmt. Der Rest verl&auml;uft analog zum Erstellen des Objekts der Klasse <b>clsCellWrapper<\/b>. Das Ergebnis landet wiederum in der Collection <b>colObjects<\/b>.<\/p>\n<p>In der Prozedur <b>DatenAnzeigen <\/b>folgen dann noch die Anweisungen, welche die zweite Schaltfl&auml;che zum L&ouml;schen eines Datensatzes zur Zeile hinzuf&uuml;gen. Hier wird wieder eine neue Zelle erstellt und formatiert.<\/p>\n<p>Ein neues <b>HTMLImg<\/b>-Element wird zur Zelle hinzugef&uuml;gt und landet schlie&szlig;lich als weitere Instanz der Wrapperklasse <b>clsImageWrapper<\/b> in der Collection <b>colObjects<\/b>.<\/p>\n<p>Damit ist der Teil von Seiten des Formulars zun&auml;chst erledigt und wir k&ouml;nnen uns die beiden Wrapperklassen <b>clsCellWrapper <\/b>und <b>clsImageWrapper <\/b>ansehen.<\/p>\n<h2>Die Klasse clsCellWrapper<\/h2>\n<p>Den gesamten Code der Klasse <b>clsCellWrapper <\/b>finden Sie in Listing 8. Sie deklariert ein Objekt des Typs <b>HTMLTableCell <\/b>mit dem Schl&uuml;sselwort <b>WithEvents<\/b>, damit wir f&uuml;r dieses innerhalb der vorliegenden Klasse Ereignisprozeduren implementieren k&ouml;nnen.<\/p>\n<pre><span style=\"color:blue;\">Dim <\/span>WithEvents m_Cell<span style=\"color:blue;\"> As <\/span>MSHTML.HTMLTableCell\r\n<span style=\"color:blue;\">Dim <\/span>m_ID<span style=\"color:blue;\"> As Long<\/span>\r\n<span style=\"color:blue;\">Dim <\/span>m_Form<span style=\"color:blue;\"> As <\/span>Form\r\n<span style=\"color:blue;\">Public Property <span style=\"color:blue;\">Set<\/span> <\/span>Cell(Cell<span style=\"color:blue;\"> As <\/span>MSHTML.HTMLTableCell)\r\n     <span style=\"color:blue;\">Set<\/span> m_Cell = Cell\r\n<span style=\"color:blue;\">End Property<\/span>\r\n<span style=\"color:blue;\">Public Property Let <\/span>ID(lngID<span style=\"color:blue;\"> As Long<\/span>)\r\n     m_ID = lngID\r\n<span style=\"color:blue;\">End Property<\/span>\r\n<span style=\"color:blue;\">Public Property <span style=\"color:blue;\">Set<\/span> <\/span>Form(frm<span style=\"color:blue;\"> As <\/span>Form)\r\n     <span style=\"color:blue;\">Set<\/span> m_Form = frm\r\n<span style=\"color:blue;\">End Property<\/span>\r\n<span style=\"color:blue;\">Private Function <\/span>m_Cell_ondblclick()<span style=\"color:blue;\"> As Boolean<\/span>\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> m_Form Is Nothing<span style=\"color:blue;\"> Then<\/span>\r\n         On Error Resume <span style=\"color:blue;\">Next<\/span>\r\n         <span style=\"color:blue;\">Call<\/span> m_Form.Cell_OnDblClick(m_ID)\r\n         <span style=\"color:blue;\">If <\/span>Err.Number = 2465<span style=\"color:blue;\"> Then<\/span>\r\n             <span style=\"color:blue;\">MsgBox<\/span> \"Methode Cell_OnDblClick im Formular ''\" & m_Form.Name \r\n                  & \"'' nicht implementiert.\", vbOKOnly + <span style=\"color:blue;\">vbCr<\/span>itical\r\n         <span style=\"color:blue;\">End If<\/span>\r\n         <span style=\"color:blue;\">On Error GoTo<\/span> 0\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 8: Code der Klasse clsCellWrapper<\/span><\/b><\/p>\n<p>Wenn Sie die L&ouml;sung selbst nachbauen, legen Sie im VBA-Editor mit dem Men&uuml;befehl <b>Einf&uuml;gen|Klassenmodul <\/b>ein neues Klassenmodul an und speichern es unter dem Namen <b>clsCellWrapper<\/b>. Die weiteren verwendeten Eigenschaften sollen in den Variablen <b>m_ID <\/b>(Prim&auml;rschl&uuml;sselwert) und <b>m_Form <\/b>(&uuml;bergeordnetes Formular) gespeichert werden.<\/p>\n<p>Die drei <b>Property Set<\/b>\/<b>Let<\/b>-Prozeduren <b>Cell<\/b>, <b>ID <\/b>und <b>Form <\/b>nehmen die Eigenschaftswerte f&uuml;r die Klasse entgegen und speichern diese in den Variablen <b>m_Cell<\/b>, <b>m_ID <\/b>und <b>m_Form<\/b>.<\/p>\n<p>Das einzige weitere Element in der Klasse ist die Prozedur, die durch das Ereignis <b>Bei Doppelklick <\/b>ausgel&ouml;st werden soll (an dieser Stelle f&auml;llt auf, dass Ereignisprozeduren der HTML-Elemente als Funktionen mit R&uuml;ckgabewert erstellt werden). Die Ereignisprozedur pr&uuml;ft, ob <b>m_Form <\/b>einen Wert enth&auml;lt. Falls ja, dann ruft sie die Methode <b>OnDblClick <\/b>des mit <b>m_Form <\/b>referenzierten Formulars auf. Ist diese Methode dort nicht implementiert, erscheint eine entsprechende Meldung. Diese k&ouml;nnen Sie nach dem Entwickeln der Datenbank auch entfernen.<\/p>\n<p>Wichtig ist hier, dass wir die Implementierung des eigentlichen Ereignisses im Klassenmodul des Formulars vornehmen. Dadurch k&ouml;nnen wir die Wrapper flexibel und in verschiedenen Formularen einsetzen &#8211; der spezielle Code f&uuml;r jeden einzelnen Fall landet jeweils im entsprechenden Formularmodul.<\/p>\n<p>In diesem Fall legen wir im Formularmodul <b>Form_frmNotizenMitDetailformular <\/b>zun&auml;chst die ben&ouml;tigte Methode an und f&uuml;llen diese mit einer einfachen <b>MsgBox<\/b>-Anweisung, welche den Prim&auml;rschl&uuml;sselwert des angeklickten Datensatzes ausgibt:<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>Cell_OnDblClick(lngID<span style=\"color:blue;\"> As Long<\/span>)\r\n     <span style=\"color:blue;\">MsgBox<\/span> \"Sie haben den Eintrag mit der ID \" & lngID _\r\n         & \" doppelt angeklickt.\"\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Hier werden wir sp&auml;ter den Aufruf eines Detailformulars zum Bearbeiten des Datensatzes einarbeiten.<\/p>\n<h2>Die Klasse clsImageWrapper<\/h2>\n<p>Die zweite Wrapper-Klasse namens <b>clsImageWrapper <\/b>finden Sie komplett in Listing 9 abgebildet. Sie deklariert ein Objekt des Typs <b>HTMLImg <\/b>mit dem Namen <b>m_Img<\/b>, und zwar mit dem Schl&uuml;sselwort <b>WithEvents<\/b>. Damit k&ouml;nnen wir eine Ereignisprozedur anlegen, die beim Mausklick auf das mit <b>m_Img <\/b>referenzierte Bild ausgel&ouml;st wird. Die Klasse deklariert au&szlig;erdem die Variablen <b>m_ID<\/b>, <b>m_Function <\/b>und <b>m_Form<\/b>. Neu im Vergleich zur Klasse <b>clsCellWrapper <\/b>ist die Variable <b>m_Function<\/b>. Sie nimmt einen String auf, der die Aktion beschreibt, die durch einen Klick auf das Bild ausgel&ouml;st werden soll &#8211; hier beispielsweise <b>edit <\/b>oder <b>delete<\/b>.<\/p>\n<pre><span style=\"color:blue;\">Dim <\/span>WithEvents m_Img<span style=\"color:blue;\"> As <\/span>MSHTML.HTMLImg\r\n<span style=\"color:blue;\">Dim <\/span>m_ID<span style=\"color:blue;\"> As Long<\/span>\r\n<span style=\"color:blue;\">Dim <\/span>m_Function<span style=\"color:blue;\"> As String<\/span>\r\n<span style=\"color:blue;\">Dim <\/span>m_Form<span style=\"color:blue;\"> As <\/span>Form\r\n<span style=\"color:blue;\">Public Property <span style=\"color:blue;\">Set<\/span> <\/span>Image(img<span style=\"color:blue;\"> As <\/span>MSHTML.HTMLImg)\r\n     <span style=\"color:blue;\">Set<\/span> m_Img = img\r\n<span style=\"color:blue;\">End Property<\/span>\r\n<span style=\"color:blue;\">Public Property Let <\/span>ID(lngID<span style=\"color:blue;\"> As Long<\/span>)\r\n     m_ID = lngID\r\n<span style=\"color:blue;\">End Property<\/span>\r\n<span style=\"color:blue;\">Public Property Let <\/span>ImageFunction(strFunction<span style=\"color:blue;\"> As String<\/span>)\r\n     m_Function = strFunction\r\n<span style=\"color:blue;\">End Property<\/span>\r\n<span style=\"color:blue;\">Public Property <span style=\"color:blue;\">Set<\/span> <\/span>Form(frm<span style=\"color:blue;\"> As <\/span>Form)\r\n     <span style=\"color:blue;\">Set<\/span> m_Form = frm\r\n<span style=\"color:blue;\">End Property<\/span>\r\n<span style=\"color:blue;\">Private Function <\/span>m_Img_onclick()<span style=\"color:blue;\"> As Boolean<\/span>\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> m_Form Is Nothing<span style=\"color:blue;\"> Then<\/span>\r\n         On Error Resume <span style=\"color:blue;\">Next<\/span>\r\n         <span style=\"color:blue;\">Call<\/span> m_Form.Img_OnClick(m_ID, m_Function)\r\n         <span style=\"color:blue;\">If <\/span>Err.Number = 2465<span style=\"color:blue;\"> Then<\/span>\r\n             <span style=\"color:blue;\">MsgBox<\/span> \"Methode Img_OnClick im Formular ''\" & m_Form.Name _\r\n                 & \"'' nicht implementiert.\", vbOKOnly + <span style=\"color:blue;\">vbCr<\/span>itical\r\n         <span style=\"color:blue;\">End If<\/span>\r\n         <span style=\"color:blue;\">On Error GoTo<\/span> 0\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 9: Code der Klasse clsImageWrapper<\/span><\/b><\/p>\n<p>Die vier Member-Variablen werden durch entsprechende <b>Property Set<\/b>\/<b>Let<\/b>-Prozeduren so verf&uuml;gbar gemacht, dass die instanzierende Klasse diese &uuml;ber entsprechende Eigenschaften f&uuml;llen kann. Die Eigenschaften sind soweit bereits von der Klasse <b>clsCellWrapper <\/b>bekannt, neu ist die <b>Property Let<\/b>-Methode <b>ImageFunction<\/b>, die den Ausdruck f&uuml;r die Variable <b>strFunction <\/b>entgegennimmt.<\/p>\n<p>Die einzige Ereignisprozedur hei&szlig;t <b>m_Img_onclick <\/b>und wird beim Anklicken des <b>HTMLImg<\/b>-Objekts ausgel&ouml;st. Sie pr&uuml;ft wieder, ob ein Formular mit der Eigenschaft <b>Form <\/b>&uuml;bergeben wurde. Falls ja, versucht es, die Methode <b>Img_OnClick <\/b>des Formularmoduls aufzurufen und ihr die Werte der Variablen <b>m_ID <\/b>(also den Prim&auml;rschl&uuml;sselwert des angeklickten Datensatzes) und <b>m_Function<\/b> (also die auszuf&uuml;hrende Aktion) zu &uuml;bergeben. Schl&auml;gt dies fehl, weil die Methode nicht implementiert ist, zeigt die Ereignisprozedur eine Fehlermeldung an.<\/p>\n<p>Die eigentliche Ereignisprozedur implementieren Sie also wieder im Klassenmodul des Formulars, und zwar etwa wie folgt:<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>Img_OnClick(lngID<span style=\"color:blue;\"> As Long<\/span>,  strFunction<span style=\"color:blue;\"> As String<\/span>)\r\n     <span style=\"color:blue;\">MsgBox<\/span> \"Sie haben den Eintrag mit  der ID \" & lngID & \" f&uuml;r die  folgende Funktion angeklickt: \"  & strFunction\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Auch hier setzen wir gleich noch Anweisungen ein, mit denen der Benutzer den aktuellen Datensatz bearbeiten beziehungsweise l&ouml;schen kann.<\/p>\n<h2>Datensatz im Detailformular bearbeiten<\/h2>\n<p>Damit Sie den angeklickten Datensatz im Detailformular bearbeiten k&ouml;nnen, legen Sie zun&auml;chst ein solches Formular namens <b>frmNotizDetail <\/b>an. Weisen Sie dem Formular die Tabelle <b>tblNotizen <\/b>als Datenherkunft zu und ziehen Sie die drei Felder <b>NotizID<\/b>, <b>Notiz <\/b>und <b>AngelegtAm <\/b>in den Detailbereich der Entwurfsansicht (s. Bild 7). Die einzige Schaltfl&auml;che dieses Formulars l&ouml;st die folgende Ereignisprozedur aus und schlie&szlig;t damit das Formular wieder:<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2016_02\/pic_1029_007.png\" alt=\"Entwurf des Detailformulars zum Bearbeiten und Erstellen von Notizen\" width=\"500\" height=\"277,7778\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 7: Entwurf des Detailformulars zum Bearbeiten und Erstellen von Notizen<\/span><\/b><\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cmdOK_Click()\r\n     DoCmd.Close acForm, Me.Name\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Damit der doppelt angeklickte Datensatz im Webbrowser-Steuerelement im Detailformular ge&ouml;ffnet wird, erg&auml;nzen Sie die Prozedur <b>Cell_OnDblClick <\/b>um die folgende <b>DoCmd.OpenForm<\/b>-Methode:<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>Cell_OnDblClick(lngID<span style=\"color:blue;\"> As Long<\/span>)\r\n     DoCmd.OpenForm \"frmNotizDetail\", _\r\n         WhereCondition:=\"NotizID = \" & lngID, _\r\n         WindowMode:=acDialog\r\n     DatenAnzeigen\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Die Prozedur &ouml;ffnet das Detailformular und filtert dieses gleich nach dem Prim&auml;rschl&uuml;sselwert, welcher der Prozedur mit dem Parameter <b>lngID <\/b>&uuml;bergeben wurde. Das Formular wird au&szlig;erdem als modaler Dialog ge&ouml;ffnet, damit die aufrufende Prozedur erst nach dem Schlie&szlig;en des Formulars weiter ausgef&uuml;hrt wird. Dies ist wichtig, weil dadurch dann die Prozedur <b>DatenAnzeigen <\/b>aufgerufen wird, die das Webbrowser-Steuerelement gleich mit den gegebenenfalls ge&auml;nderten Daten f&uuml;llt.<\/p>\n<p>Das &ouml;ffnen eines Datensatzes in der Detailansicht sieht dann etwa wie in Bild 8 aus.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2016_02\/pic_1029_008.png\" alt=\"&ouml;ffnen eines Detaildatensatzes per Doppelklick in die HTML-Tabelle\" width=\"600\" height=\"339,9707\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 8: &ouml;ffnen eines Detaildatensatzes per Doppelklick in die HTML-Tabelle<\/span><\/b><\/p>\n<h2>Datensatz l&ouml;schen<\/h2>\n<p>Ein Klick auf das Icon mit dem L&ouml;schen-Symbol soll den Datensatz l&ouml;schen, neben dem das Symbol angezeigt wird. Dazu l&ouml;st die Wrapperklasse <b>clsImageWrapper <\/b>die Prozedur <b>Img_OnClick <\/b>im Formular  <b>frmNotizenMitDetailformular <\/b>aus, die Sie in Listing 10 finden.<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>Img_OnClick(lngID<span style=\"color:blue;\"> As Long<\/span>, strFunction<span style=\"color:blue;\"> As String<\/span>)\r\n     <span style=\"color:blue;\">Dim <\/span>db<span style=\"color:blue;\"> As <\/span>DAO.Database\r\n     Select Case strFunction\r\n         <span style=\"color:blue;\">Case <\/span>\"edit\"\r\n             DoCmd.OpenForm \"frmNotizDetail\", WhereCondition:=\"NotizID = \" & lngID, WindowMode:=acDialog\r\n             DatenAnzeigen\r\n         <span style=\"color:blue;\">Case <\/span>\"delete\"\r\n             If <span style=\"color:blue;\">MsgBox<\/span>(\"M&ouml;chten Sie die Notiz mit der ID ''\" & lngID & \"'' l&ouml;schen\", vbOKCancel + <span style=\"color:blue;\">vbCr<\/span>itical, _\r\n                     \"Notiz l&ouml;schen\") = vbOK Then\r\n                 <span style=\"color:blue;\">Set<\/span> db = CurrentDb\r\n                 db.Execute \"DELETE FROM tblNotizen WHERE NotizID = \" & lngID, dbFailOnError\r\n                 DatenAnzeigen\r\n             <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">End Select<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 10: Ereignisprozedur beim Klicken auf eines der Icons zum Bearbeiten oder L&ouml;schen<\/span><\/b><\/p>\n<p>Die Prozedur erwartet den Prim&auml;rschl&uuml;sselwert und eine Zeichenkette f&uuml;r die durchzuf&uuml;hrende Funktion als Parameter. Sie pr&uuml;ft den Wert von <b>strFunction <\/b>in einer <b>Select Case<\/b>-Bedingung. Der erste Zweig f&uuml;hrt die Anweisungen f&uuml;r den Wert <b>edit <\/b>aus. Hier sind die gleichen Schritte zu erledigen wie in der Prozedur <b>Cell_OnDblClick<\/b>: Das Detailformular soll ge&ouml;ffnet und die &auml;nderung anschlie&szlig;end in das Webbrowser-Steuerelement &uuml;bernommen werden.<\/p>\n<p>Interessanter ist der <b>delete<\/b>-Zweig: Hier fragt die Prozedur noch per <b>MsgBox<\/b>-Anweisung, ob der Benutzer den Datensatz wirklich l&ouml;schen m&ouml;chte. Falls ja, f&uuml;llt sie die Variable <b>db <\/b>mit einem Verweis auf das aktuelle <b>Database<\/b>-Objekt. Danach l&ouml;scht sie mit einer <b>DELETE<\/b>-Aktionsabfrage den mit dem Prim&auml;rschl&uuml;sselwert <b>lngID <\/b>angegebenen Datensatz aus der Tabelle <b>tblNotizen <\/b>und aktualisiert auch hier den Inhalt des Webbrowser-Steuerelements durch einen Aufruf der Prozedur <b>DatenAnzeigen<\/b>.<\/p>\n<h2>Anlegen eines neuen Datensatzes<\/h2>\n<p>Zum Anlegen eines neuen Datensatzes wollen wir noch eine Schaltfl&auml;che mit der Bezeichung <b>cmdNeu <\/b>im Formular unterbringen (s. Bild 9). Diese Schaltfl&auml;che l&ouml;st die folgende Prozedur aus:<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2016_02\/pic_1029_009.png\" alt=\"Schaltfl&auml;che zum Hinzuf&uuml;gen eines neuen Datensatzes\" width=\"500\" height=\"394,4099\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 9: Schaltfl&auml;che zum Hinzuf&uuml;gen eines neuen Datensatzes<\/span><\/b><\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cmdNeu_Click()\r\n     DoCmd.OpenForm \"frmNotizDetail\", _\r\n         DataMode:=acFormAdd, _\r\n         WindowMode:=acDialog\r\n     DatenAnzeigen\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<h2>Feinarbeiten<\/h2>\n<p>Keine Beispieldatenbank ohne Verbesserungspotenzial &#8211; so auch hier: Wenn das Webbrowser-Steuerelement einmal mehr Datens&auml;tze anzeigen sollte, als sichtbar sind, und sie &auml;ndern einen der unteren Datens&auml;tze, dann zeigt das Webbrowser-Steuerelement anschlie&szlig;end wieder den obersten Datensatz an.<\/p>\n<p>Es ist also das gleiche Problem wie nach dem Requery im Datenblatt oder im Endlosformular.<\/p>\n<p>Gl&uuml;cklicherweise ist das Ermitteln der Position der Bildlaufleiste und auch das Wiederherstellen der Position der Bildlaufleiste nach dem Aktualisieren der Inhalte sehr einfach. Man braucht noch nicht einmal API-Funktionen daf&uuml;r! Alles, was wir brauchen, sind ein paar zus&auml;tzliche Zeilen in der Prozedur <b>DatenAnzeigen<\/b>, die Sie nachfolgend ausschnittweise sehen:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>DatenAnzeigen()\r\n     ...\r\n     <span style=\"color:blue;\">Dim <\/span>lngScrollPosition<span style=\"color:blue;\"> As Long<\/span>\r\n     ...    Me.Painting = <span style=\"color:blue;\">False<\/span>\r\n     <span style=\"color:blue;\">Set<\/span> objDocument = objWebbrowser.Document\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> objDocument.body Is Nothing<span style=\"color:blue;\"> Then<\/span>\r\n         lngScrollPosition = objDocument.body.ScrollTop\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     ...\r\n     objWebbrowser.Document.body.ScrollTop = _\r\n         lngScrollPosition\r\n     ...\r\n     Me.Painting = <span style=\"color:blue;\">True<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Wir haben hier gleich noch eine kleine Optimierung eingebaut, n&auml;mlich das Deaktivieren der Bildschirmaktualisierung f&uuml;r das Formular w&auml;hrend des Aktualisierens und das Aktivieren im Anschluss. Dadurch verhindern wir eventuelles Flackern.<\/p>\n<p>Au&szlig;erdem fragen wir, sofern das <b>Document<\/b>-Objekt bereits mit dem <b>body<\/b>-Element ausgestattet ist, dessen Eigenschaft <b>ScrollTop <\/b>ab und speichern diese in der Variablen <b>lngScrollPosition<\/b>. Diese m&uuml;ssen wir einfach nach dem Aktualisieren wieder zur&uuml;ckschreiben, um die alte Position der Bildlaufleiste wiederherzustellen!<\/p>\n<h2>Richtext im Webbrowser-Steuerelement<\/h2>\n<p>Die Frage, die sich nun stellt, ist die: Was geschieht, wenn wir das Memofeld, das die Daten f&uuml;r das Webbrowser-Steuerelement liefert, auf Rich-Text umstellen Dies macht ja gerade bei Notizen Sinn, da man dort vielleicht gern einmal eine Passage hervorheben m&ouml;chte &#8211; sei es durch fette Schrift oder Unterstreichen.<\/p>\n<p>Probieren wir es aus: Als Erstes kopieren wir die Tabelle <b>tblNotizen <\/b>in die Tabelle <b>tblNotizen_Richtext <\/b>(Tabelle markieren, <b>Strg + C<\/b>, <b>Strg + V<\/b>). Nun &auml;ndern wir den Wert der Eigenschaft <b>Textformat<\/b> f&uuml;r das Feld <b>Notiz <\/b>der neuen Tabelle <b>tblNotizen_Richtext <\/b>auf Rich-Text (s. Bild 10).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2016_02\/pic_1029_010.png\" alt=\"Memofeld mit Rich-Text-Formatierung\" width=\"500\" height=\"383,4244\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 10: Memofeld mit Rich-Text-Formatierung<\/span><\/b><\/p>\n<p>Damit wir &uuml;berhaupt erkennen k&ouml;nnen, ob sich etwas &auml;ndert, f&uuml;gen wir den Daten des Feldes Notiz einige un&uuml;bersehbare Formatierungen hinzu (s. Bild 11).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2016_02\/pic_1029_011.png\" alt=\"Rich-Text-Feld mit einigen Markierungen\" width=\"500\" height=\"279,4586\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 11: Rich-Text-Feld mit einigen Markierungen<\/span><\/b><\/p>\n<p>Auch das Formular <b>frmNotizenMitDetailformular <\/b>kopieren wir und speichern es unter dem Namen <b>frmNotizenMitDetailformular_Richtext<\/b>. Hier &auml;ndern wir in der Prozedur <b>DatenAnzeigen <\/b>die Quelltabelle auf <b>tblNotizen_Richtext <\/b>ab:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>DatenAnzeigen()\r\n     ...\r\n     <span style=\"color:blue;\">Set<\/span> rst = db.OpenRecordset(\"SELECT * FROM  tblNotizen_Richtext\", dbOpenDynaset)\r\n     ...\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Ein Wechsel in die Formularansicht des Formulars <b>frmNotizenMitDetailformular_Richtext <\/b>zeigt, dass wir wohl nochmal nacharbeiten m&uuml;ssen: Die Rich-Text-Formatierungen werden lediglich in Form entsprechender HTML-Tags dargestellt, aber nicht interpretiert (s. Bild 12). Das ist eigentlich logisch: Mit <b>rst!Notiz <\/b>erhalten wir immer nur den Text mit HTML-Auszeichnungen, aber nicht den formatierten Text &#8211; das ist ja im Code auch gar nicht m&ouml;glich.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2016_02\/pic_1029_012.png\" alt=\"Das Webbrowser-Steuerelement zeigt nur die HTML-Tags an, aber interpretiert diese nicht.\" width=\"500\" height=\"372,2504\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 12: Das Webbrowser-Steuerelement zeigt nur die HTML-Tags an, aber interpretiert diese nicht.<\/span><\/b><\/p>\n<p>Danach weisen wir diesen der Eigenschaft <b>InnerText<\/b> des <b>HTMLTableCell<\/b>-Elements zu, es findet also auch hier keine Interpretation statt.<\/p>\n<p>Das ist aber nicht schlimm: Es gibt ja auch noch die Eigenschaft <b>InnerHTML<\/b>, die den HTML-Code des anzuzeigenden Inhalts entgegennimmt und zur&uuml;ckgibt.<\/p>\n<p>Die Zuweisung an die entsprechende Eigenschaft erledigen wir in der Prozedur <b>FormatCell<\/b>, die wir nur noch wie folgt &auml;ndern m&uuml;ssen:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>FormatCell(..., _\r\n         <span style=\"color:blue;\">Optional<\/span> strInnerText<span style=\"color:blue;\"> As String<\/span>)\r\n     ...\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> <span style=\"color:blue;\">Len<\/span>(strInnerText) = 0<span style=\"color:blue;\"> Then<\/span>\r\n         objCell.innerHTML = strInnerText\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Wir ersetzen also lediglich die Eigenschaft <b>InnerText<\/b> durch <b>InnerHTML<\/b>. Das Ergebnis &uuml;berzeugt: Bild 13 zeigt, dass die HTML-Tags nun wie gew&uuml;nscht interpretiert werden.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2016_02\/pic_1029_013.png\" alt=\"Durch &auml;nderung einer einzigen Codezeile werden nun auch die HTML-Tags interpretiert.\" width=\"500\" height=\"387,5598\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 13: Durch &auml;nderung einer einzigen Codezeile werden nun auch die HTML-Tags interpretiert.<\/span><\/b><\/p>\n<p>Damit wir die Rich-Text-Funktion auch im Detailformular nutzen k&ouml;nnen, erstellen wir auch davon eine Kopie namens <b>frmNotizDetail_Richtext<\/b> (s. Bild 14).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2016_02\/pic_1029_014.png\" alt=\"Nun funktioniert auch die Anzeige der Rich-Text-Notiz im Detailformular.\" width=\"600\" height=\"332,8197\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 14: Nun funktioniert auch die Anzeige der Rich-Text-Notiz im Detailformular.<\/span><\/b><\/p>\n<p>Als Datenherkunft soll das Formular nun die Tabelle <b>tblNotizen_Richtext <\/b>verwenden. Schlie&szlig;lich m&uuml;ssen wir noch die Ereignisprozeduren im Klassenmodul des Formulars <b>frmNotizenMitDetailformular_Richtext <\/b>anpassen, damit diese auch die neue Version des Detailformulars &ouml;ffnen (s. Listing 11). Die ge&auml;nderten Zeilen sind fett markiert.<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>Cell_OnDblClick(lngID<span style=\"color:blue;\"> As Long<\/span>)\r\n     DoCmd.OpenForm \"frmNotizDetail_Richtext\", WhereCondition:=\"NotizID = \" & lngID, WindowMode:=acDialog\r\n     DatenAnzeigen\r\n<span style=\"color:blue;\">End Sub<\/span>\r\n<span style=\"color:blue;\">Public Sub <\/span>Img_OnClick(lngID<span style=\"color:blue;\"> As Long<\/span>, strFunction<span style=\"color:blue;\"> As String<\/span>)\r\n     <span style=\"color:blue;\">Dim <\/span>db<span style=\"color:blue;\"> As <\/span>DAO.Database\r\n     Select Case strFunction\r\n         <span style=\"color:blue;\">Case <\/span>\"edit\"\r\n             DoCmd.OpenForm \"frmNotizDetail_Richtext\", WhereCondition:=\"NotizID = \" & lngID, WindowMode:=acDialog\r\n             DatenAnzeigen\r\n         <span style=\"color:blue;\">Case <\/span>\"delete\"\r\n             ...\r\n     <span style=\"color:blue;\">End Select<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 11: &auml;nderung der Ereignisprozeduren im Modul frmNotizenMitDetailformular_RichText<\/span><\/b><\/p>\n<h2>Zusammenfassung und Ausblick<\/h2>\n<p>Dieser Beitrag hat gezeigt, wie Sie die Daten mit Feldern, die unterschiedlich lange Texte enthalten, optisch ansprechend in einem Webbrowser-Steuerelement darstellen k&ouml;nnen.<\/p>\n<p>Dabei wird jede Zeile nur so hoch formatiert, dass keine unn&ouml;tigen Leerr&auml;ume wie bei der Datenblattansicht oder dem Endlosformular entstehen. Die einzelnen Bereiche und Elemente der HTML-Variante eines Endlosformulars k&ouml;nnen Sie &uuml;berdies mit Ereignisprozeduren versehen, um beispielsweise ein Detailformular zu einem Datensatz zu &ouml;ffnen und diesen dort zu &auml;ndern oder um einen Datensatz zu l&ouml;schen. Die Daten im Webbrowser-Steuerelement werden dann gleich aktualisiert dargestellt &#8211; bei korrekter Positionierung der Bildlaufleiste.<\/p>\n<p>Schlie&szlig;lich haben wir uns noch um die Rich-Text-Darstellung gek&uuml;mmert: Damit k&ouml;nnen Sie sogar noch Formatierungen zu den per Webbrowser-Steuerelement angezeigten Texten hinzuf&uuml;gen.<\/p>\n<p>Eine m&ouml;gliche Erweiterung w&auml;re das direkte Bearbeiten von Inhalten im Webbrowser-Steuerelement oder das Erstellen einer Variante, die beliebige Datenherk&uuml;nfte anzeigt und gleich die passenden Spalten zum Webbrowser-Steuerelement hinzuf&uuml;gt. Dies wird Thema eines weiteren Beitrags in <b>Access im Unternehmen <\/b>sein.<\/p>\n<h3>Downloads zu diesem Beitrag<\/h3>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>HTMLListe.accdb<\/p>\n<p><a href=\"..\/fileadmin\/beispiele\/{5DB24C4F-BFC1-499C-B477-7BCDAAF9D899}\/aiu_1029.zip\">Download<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Die Datenblatt-Ansicht und das Endlosformular sind gute Helfer, wenn es um die Anzeige mehrerer Datens&auml;tze einer Tabelle oder Abfrage geht. Allerdings haben beide einen gravierenden Nachteil: Sie zeigen alle Datens&auml;tze immer in der gleichen H&ouml;he an. Wenn also ein Datensatz etwa eine Notiz enth&auml;lt, die nur eine Zeile lang ist, eine andere aber zehn Zeilen, m&uuml;ssen Sie die Formularh&ouml;he nach dem l&auml;ngsten Inhalt auslegen. Dadurch verlieren Sie wiederum eine Menge Platz, da die H&ouml;he ja auch f&uuml;r kurze Inhalte beansprucht wird. Dieser Beitrag zeigt, wie Sie das Problem mithilfe von HTML und dem Webbrowser-Steuerelement beheben.<\/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":[66022016,662016,44000023],"tags":[],"class_list":["post-55001029","post","type-post","status-publish","format-standard","hentry","category-66022016","category-662016","category-Mit_Formularen_arbeiten"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.9 (Yoast SEO v27.3) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>HTML-Liste mit Access-Daten - 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\/HTMLListe_mit_AccessDaten\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"HTML-Liste mit Access-Daten\" \/>\n<meta property=\"og:description\" content=\"Die Datenblatt-Ansicht und das Endlosformular sind gute Helfer, wenn es um die Anzeige mehrerer Datens&auml;tze einer Tabelle oder Abfrage geht. Allerdings haben beide einen gravierenden Nachteil: Sie zeigen alle Datens&auml;tze immer in der gleichen H&ouml;he an. Wenn also ein Datensatz etwa eine Notiz enth&auml;lt, die nur eine Zeile lang ist, eine andere aber zehn Zeilen, m&uuml;ssen Sie die Formularh&ouml;he nach dem l&auml;ngsten Inhalt auslegen. Dadurch verlieren Sie wiederum eine Menge Platz, da die H&ouml;he ja auch f&uuml;r kurze Inhalte beansprucht wird. Dieser Beitrag zeigt, wie Sie das Problem mithilfe von HTML und dem Webbrowser-Steuerelement beheben.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-im-unternehmen.de\/HTMLListe_mit_AccessDaten\/\" \/>\n<meta property=\"og:site_name\" content=\"Access im Unternehmen\" \/>\n<meta property=\"article:published_time\" content=\"2020-05-22T19:01:59+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/vg09.met.vgwort.de\/na\/787ccf6908bf4ae1b197b2092011c188\" \/>\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=\"33\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/HTMLListe_mit_AccessDaten\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/HTMLListe_mit_AccessDaten\\\/\"},\"author\":{\"name\":\"Andr\u00e9 Minhorst\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\"},\"headline\":\"HTML-Liste mit Access-Daten\",\"datePublished\":\"2020-05-22T19:01:59+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/HTMLListe_mit_AccessDaten\\\/\"},\"wordCount\":5319,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/HTMLListe_mit_AccessDaten\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg09.met.vgwort.de\\\/na\\\/787ccf6908bf4ae1b197b2092011c188\",\"articleSection\":[\"2\\\/2016\",\"2016\",\"Mit Formularen arbeiten\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/HTMLListe_mit_AccessDaten\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/HTMLListe_mit_AccessDaten\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/HTMLListe_mit_AccessDaten\\\/\",\"name\":\"HTML-Liste mit Access-Daten - Access im Unternehmen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/HTMLListe_mit_AccessDaten\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/HTMLListe_mit_AccessDaten\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg09.met.vgwort.de\\\/na\\\/787ccf6908bf4ae1b197b2092011c188\",\"datePublished\":\"2020-05-22T19:01:59+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/HTMLListe_mit_AccessDaten\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/HTMLListe_mit_AccessDaten\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/HTMLListe_mit_AccessDaten\\\/#primaryimage\",\"url\":\"http:\\\/\\\/vg09.met.vgwort.de\\\/na\\\/787ccf6908bf4ae1b197b2092011c188\",\"contentUrl\":\"http:\\\/\\\/vg09.met.vgwort.de\\\/na\\\/787ccf6908bf4ae1b197b2092011c188\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/HTMLListe_mit_AccessDaten\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"HTML-Liste mit Access-Daten\"}]},{\"@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-Liste mit Access-Daten - 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\/HTMLListe_mit_AccessDaten\/","og_locale":"de_DE","og_type":"article","og_title":"HTML-Liste mit Access-Daten","og_description":"Die Datenblatt-Ansicht und das Endlosformular sind gute Helfer, wenn es um die Anzeige mehrerer Datens&auml;tze einer Tabelle oder Abfrage geht. Allerdings haben beide einen gravierenden Nachteil: Sie zeigen alle Datens&auml;tze immer in der gleichen H&ouml;he an. Wenn also ein Datensatz etwa eine Notiz enth&auml;lt, die nur eine Zeile lang ist, eine andere aber zehn Zeilen, m&uuml;ssen Sie die Formularh&ouml;he nach dem l&auml;ngsten Inhalt auslegen. Dadurch verlieren Sie wiederum eine Menge Platz, da die H&ouml;he ja auch f&uuml;r kurze Inhalte beansprucht wird. Dieser Beitrag zeigt, wie Sie das Problem mithilfe von HTML und dem Webbrowser-Steuerelement beheben.","og_url":"https:\/\/access-im-unternehmen.de\/HTMLListe_mit_AccessDaten\/","og_site_name":"Access im Unternehmen","article_published_time":"2020-05-22T19:01:59+00:00","og_image":[{"url":"http:\/\/vg09.met.vgwort.de\/na\/787ccf6908bf4ae1b197b2092011c188","type":"","width":"","height":""}],"author":"Andr\u00e9 Minhorst","twitter_card":"summary_large_image","twitter_misc":{"Verfasst von":"Andr\u00e9 Minhorst","Gesch\u00e4tzte Lesezeit":"33\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/access-im-unternehmen.de\/HTMLListe_mit_AccessDaten\/#article","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/HTMLListe_mit_AccessDaten\/"},"author":{"name":"Andr\u00e9 Minhorst","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f"},"headline":"HTML-Liste mit Access-Daten","datePublished":"2020-05-22T19:01:59+00:00","mainEntityOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/HTMLListe_mit_AccessDaten\/"},"wordCount":5319,"commentCount":0,"publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/HTMLListe_mit_AccessDaten\/#primaryimage"},"thumbnailUrl":"http:\/\/vg09.met.vgwort.de\/na\/787ccf6908bf4ae1b197b2092011c188","articleSection":["2\/2016","2016","Mit Formularen arbeiten"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/access-im-unternehmen.de\/HTMLListe_mit_AccessDaten\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/access-im-unternehmen.de\/HTMLListe_mit_AccessDaten\/","url":"https:\/\/access-im-unternehmen.de\/HTMLListe_mit_AccessDaten\/","name":"HTML-Liste mit Access-Daten - Access im Unternehmen","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/HTMLListe_mit_AccessDaten\/#primaryimage"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/HTMLListe_mit_AccessDaten\/#primaryimage"},"thumbnailUrl":"http:\/\/vg09.met.vgwort.de\/na\/787ccf6908bf4ae1b197b2092011c188","datePublished":"2020-05-22T19:01:59+00:00","breadcrumb":{"@id":"https:\/\/access-im-unternehmen.de\/HTMLListe_mit_AccessDaten\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/access-im-unternehmen.de\/HTMLListe_mit_AccessDaten\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/HTMLListe_mit_AccessDaten\/#primaryimage","url":"http:\/\/vg09.met.vgwort.de\/na\/787ccf6908bf4ae1b197b2092011c188","contentUrl":"http:\/\/vg09.met.vgwort.de\/na\/787ccf6908bf4ae1b197b2092011c188"},{"@type":"BreadcrumbList","@id":"https:\/\/access-im-unternehmen.de\/HTMLListe_mit_AccessDaten\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/access-im-unternehmen.de\/"},{"@type":"ListItem","position":2,"name":"HTML-Liste mit Access-Daten"}]},{"@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\/55001029","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=55001029"}],"version-history":[{"count":0,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55001029\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/media?parent=55001029"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/categories?post=55001029"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/tags?post=55001029"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}