{"id":55000966,"date":"2015-02-01T00:00:00","date_gmt":"2020-05-22T21:06:28","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=966"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Zuletzt_eingegebene_Werte_in_Textfeldern","status":"publish","type":"post","link":"https:\/\/access-im-unternehmen.de\/Zuletzt_eingegebene_Werte_in_Textfeldern\/","title":{"rendered":"Zuletzt eingegebene Werte in Textfeldern"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg07.met.vgwort.de\/na\/37fc38935282469cae00730b07d9310f\" width=\"1\" height=\"1\" alt=\"\"><\/p>\n<p><b>Textfelder sind keine &uuml;berm&auml;&szlig;ig flexiblen Eingabesteuerelemente. Man gibt Text ein, l&ouml;scht oder bearbeitet diesen oder kopiert Inhalte beziehungsweise f&uuml;gt diese ein. Einige Anwendungen aber liefern f&uuml;r Textfelder &uuml;berraschenden Komfort: Diese zeigen beispielsweise den zuletzt eingegebenen passenden Wert an, sobald man ein oder mehrere Zeichen in das Textfeld eingegeben hat. Der Benutzer kann dann per Tab- oder Eingabetaste die aktuell angezeigte Auswahl einfach &uuml;bernehmen. Dies schauen wir uns genauer an und bauen eine passende Funktion f&uuml;r Access-Textfelder nach.<\/b><\/p>\n<p>Was ben&ouml;tigen wir also, um diese Funktion nachzubilden Zun&auml;chst einmal ein Textfeld, das wir damit ausstatten wollen.<\/p>\n<p>Wir konzentrieren uns zun&auml;chst auf ein einzelnes Textfeld und bauen anschlie&szlig;end eine Klasse, mit der wir die Funktion ganz einfach mit wenigen Codezeilen auf beliebige Textfelder &uuml;bertragen k&ouml;nnen.<\/p>\n<p>Au&szlig;erdem brauchen wir eine Tabelle, welche die zuletzt in ein Feld eingegebenen Daten speichert. Diese k&ouml;nnte im Entwurf beispielsweise wie in Bild 1 aussehen.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2015_01\/pic_966_001.png\" alt=\"Erster Entwurf der Tabelle zum Speichern der zuletzt verwendeten Werte\" width=\"575\" height=\"380,2006\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: Erster Entwurf der Tabelle zum Speichern der zuletzt verwendeten Werte<\/span><\/b><\/p>\n<p>Hier finden Sie neben dem Prim&auml;rschl&uuml;sselwert drei Felder, die den eigentlichen Wert, den Namen des Formulars sowie den Namen des Steuerelements aufnehmen, dessen Inhalte gespeichert und wieder zur Verf&uuml;gung gestellt werden sollen.<\/p>\n<p>Dazu bauen wir gleich einen eindeutigen Index &uuml;ber die drei Felder <b>LetzterWert<\/b>, <b>Formularname <\/b>und <b>Steuerelementname <\/b>ein, der daf&uuml;r sorgt, dass jeder Wert nur einmal je Formular und Steuerelement gespeichert wird.<\/p>\n<p>F&uuml;rs Erste ist dies ein sinnvoller Ansatz. Wenn man jedoch ein wenig weiterdenkt, f&auml;llt auf, dass ein Feld ja m&ouml;glicherweise nicht nur in einem einzigen Formular abgebildet wird, sondern vielleicht auch noch in weiteren Formularen. Es scheint also keine gute Idee zu sein, die Speicherung der zuletzt verwendeten Werte f&uuml;r ein Feld auf Formularname und Steuerelementname zu beziehen, sondern eher auf den reinen Feldnamen.<\/p>\n<p>Woher bekommen wir den &uuml;blicherweise aus der Eigenschaft <b>Steuerelementinhalt <\/b>des Textfeldes. Dies gilt aber auch nur f&uuml;r solche Textfelder, die an ein Feld einer Tabelle gebunden sind.<\/p>\n<p>Aber wollen wir uns nur auf gebundene Felder beschr&auml;nken Was ist, wenn wir etwa ein Feld zur Eingabe eines Filterkriteriums mit der Funktion zur Anzeige der zuletzt verwendeten Werte nutzen m&ouml;chten Dieses ist ja normalerweise nicht an ein Feld einer Tabelle gebunden.<\/p>\n<p>Also m&uuml;ssen wir uns ein anderes Merkmal aussuchen, mit dem wir die betroffenen Steuerelemente markieren. Daf&uuml;r gibt es jedoch einen passenden Kandidaten: die Eigenschaft <b>Marke<\/b>, unter VBA mit der Eigenschaft <b>Tag <\/b>ansprechbar. <\/p>\n<p>Wir hinterlegen also f&uuml;r alle Felder, welche die gleichen zuletzt verwendeten Werte anzeigen sollen, einen entsprechenden Bezeichner in der <b>Marke<\/b>-Eigenschaft.<\/p>\n<p>Die Tabelle <b>tblLetzteWerte <\/b>&auml;ndern wir entsprechend, indem wir die beiden Felder <b>Formularname <\/b>und <b>Steuerelementname <\/b>entfernen und daf&uuml;r das Feld <b>LetzterWertMarke <\/b>einf&uuml;gen (s. Bild 2).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2015_01\/pic_966_002.png\" alt=\"Zweiter Entwurf der Tabelle zum Speichern der zuletzt verwendeten Werte\" width=\"575\" height=\"382,1959\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 2: Zweiter Entwurf der Tabelle zum Speichern der zuletzt verwendeten Werte<\/span><\/b><\/p>\n<p><b>Zuletzt eingegebene Werte speichern<\/b><\/p>\n<p>Nun m&uuml;ssen wir uns darum k&uuml;mmern, dass &uuml;berhaupt Werte in diese Tabelle gelangen. Dazu legen Sie ein erstes Formular mit einem einzigen Textfeld an und nennen dieses <b>txtBeispieltext<\/b>. Im Eigenschaftsfenster stellen Sie au&szlig;erdem die Eigenschaft <b>Marke <\/b>auf den Wert <b>Beispielfeld <\/b>ein (s. Bild 3).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2015_01\/pic_966_003.png\" alt=\"Ausstatten des Textfeldes mit der Marke-Eigenschaft\" width=\"575\" height=\"341,2197\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 3: Ausstatten des Textfeldes mit der Marke-Eigenschaft<\/span><\/b><\/p>\n<p>Nun sollen vom Benutzer eingegebene Werte nach der Eingabe in der Tabelle <b>tblLetzteWerte <\/b>gespeichert werden. Dazu nutzen wir die Ereignisprozedur, die durch das Ereignis <b>Nach Aktualisierung <\/b>des Textfeldes ausgel&ouml;st wird. W&auml;hlen Sie hier den Wert <b>[Ereignisprozedur] <\/b>aus und klicken Sie dann auf die Schaltfl&auml;che mit den drei Punkten (<b>&#8230;<\/b>).<\/p>\n<p>Es erscheint der VBA-Editor und zeigt die noch leere Prozedur <b>txtLetzteWerte_AfterUpdate <\/b>an. Diese soll nun zun&auml;chst einfach den aktuellen Wert des Textfeldes in die Tabelle <b>tblLetzteWerte <\/b>eintragen &#8211; samt dem verwendeten Wert f&uuml;r die Eigenschaft <b>Marke<\/b>.<\/p>\n<p>Die Prozedur sieht nun wie in Listing 1 aus und verwendet eine <b>INSERT INTO<\/b>-SQL-Abfrage, um den Datensatz in der Tabelle zu speichern.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>txtBeispieltext_AfterUpdate()\r\n     <span style=\"color:blue;\">Dim <\/span>db<span style=\"color:blue;\"> As <\/span>DAO.Database\r\n     <span style=\"color:blue;\">Set<\/span> db = CurrentDb\r\n     db.Execute \"INSERT INTO tblLetzteWerte(LetzterWert, LetzterWertMarke) VALUES(''\" _\r\n         & Me!txtBeispieltext & \"'', ''\" _\r\n         & Me!txtBeispieltext.Tag & \"'')\", dbFailOnError\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 1: Speichern des aktuellen Wertes des Textfeldes txtBeispieltext in der Tabelle tblLetzteWerte<\/span><\/b><\/p>\n<p>Dummerweise funktioniert diese Methode nur, solange Sie keinen Wert ein zweites Mal in die Tabelle eintragen. Dann schl&auml;gt n&auml;mlich die weiter oben vorgenommene Restriktion zu, nach der jede Kombination aus dem Wert <b>Marke <\/b>und dem Inhalt des Textfeldes nur einmal in der Tabelle gespeichert werden darf (s. Bild 4). Wie kommen wir aus diesem Dilemma heraus<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2015_01\/pic_966_004.png\" alt=\"Fehler beim erneuten Hinzuf&uuml;gen der gleichen Kombination aus Marke und Wert\" width=\"575\" height=\"393,9179\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 4: Fehler beim erneuten Hinzuf&uuml;gen der gleichen Kombination aus Marke und Wert<\/span><\/b><\/p>\n<p>Dazu gibt es gleich mehrere M&ouml;glichkeiten. Die erste ist die folgende: Wir deaktivieren vorher die Fehlerbehandlung mit <b>On Error Resume Next<\/b>. Dies unterbindet schlicht die Fehlermeldung. Der einzuf&uuml;gende Datensatz ist schlie&szlig;lich schon vorhanden, warum diesen also nochmals einf&uuml;gen<\/p>\n<p>An dieser Stelle m&uuml;ssen wir uns &uuml;berlegen, wie und vor allem in welcher Reihenfolge die zuletzt verwendeten Werte im Textfeld angezeigt werden sollen. Ben&ouml;tigen wir eine alphabetische Reihenfolge Wollen wir die Werte in der Reihenfolge der Eingabe anzeigen Oder sollen sogar die am h&auml;ufigsten verwendeten Werte bevorzugt angezeigt werden<\/p>\n<p>Die Antwort auf diese Frage h&auml;ngt von mehreren Faktoren ab. Der erste ist: Soll der passende Wert einfach nur als Auto-Erg&auml;nzung im Textfeld angezeigt werden &#8211; also etwa so wie in Bild 5<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2015_01\/pic_966_005.png\" alt=\"Automatische Erg&auml;nzung des eingegebenen Ausdrucks\" width=\"350\" height=\"137,2209\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 5: Automatische Erg&auml;nzung des eingegebenen Ausdrucks<\/span><\/b><\/p>\n<p>Oder sollen diese in einer Art Kombinationsfeld oder gar in einer Kombination aus Textfeld und Listenfeld erscheinen In beiden F&auml;llen sollte es eigentlich konfigurierbar sein, ob die Werte in der Reihenfolge der letzten Eingabe erscheinen oder in alphabetischer Reihenfolge.<\/p>\n<p>Die Abfrage der Werte in alphabetischer Reihenfolge ist kein Problem: Wir k&ouml;nnen die dazu verwendete Abfrage ja einfach entsprechend sortieren. Wie aber sieht es aus, wenn die zuletzt eingegebenen Werte eine h&ouml;here Priorit&auml;t haben sollen In diesem Fall gibt es wieder zwei Varianten: Erstens k&ouml;nnen wir die Zeit der letzten Eingabe in einem weiteren Feld der Tabelle speichern. Zweitens k&ouml;nnen wir das Prim&auml;rschl&uuml;sselfeld nutzen, das ja mit einem Autowert gef&uuml;llt wird. Je h&ouml;her der Wert im Prim&auml;rschl&uuml;sselfeld, desto neuer ist der eingegebene Wert.<\/p>\n<p>Dies ziehen wir dem Hinzuf&uuml;gen eines eigenen Datumsfeldes vor, m&uuml;ssen daf&uuml;r aber die Prozedur zum Hinzuf&uuml;gen des aktuell eingegebenen Eintrags etwas anpassen: Dies soll n&auml;mlich nun einen eventuell bereits vorhandenen Eintrag mit dem gleichen Wert l&ouml;schen, bevor der neue Wert angelegt wird.<\/p>\n<p>Dadurch erh&auml;lt der zuletzt angelegte Wert automatisch den h&ouml;chsten Wert, auch wenn er zuvor bereits einmal angelegt wurde.<\/p>\n<p>Dies sieht dann beispielsweise wie in Bild 6 aus: Der Wert <b>Erster Wert <\/b>wird nach der ersten Eingabe erneut eingegeben. Die Prozedur l&ouml;scht dann den ersten Wert und legt automatisch einen neuen Eintrag mit identischem Wert an. Die Prozedur sieht nun wie in Listing 2 aus.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2015_01\/pic_966_006.png\" alt=\"Bei Eingabe eines bereits vorhandenen Werts wird der alte Wert gel&ouml;scht.\" width=\"350\" height=\"219,5789\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 6: Bei Eingabe eines bereits vorhandenen Werts wird der alte Wert gel&ouml;scht.<\/span><\/b><\/p>\n<p><b>Zuletzt verwendete Werte abrufen<\/b><\/p>\n<p>Die Voraussetzungen f&uuml;r die Anzeige der zuletzt verwendeten Werte sind somit geschaffen. Nun schauen wir uns die verschiedenen Varianten an, um diese Werte anzuzeigen.<\/p>\n<p>Im ersten Ansatz soll einfach nur der naheliegendste Wert bezogen auf die bis dahin eingegebenen Zeichen angezeigt werden &#8211; und zwar so, dass die bereits eingegebenen Zeichen nicht markiert und die zu erg&auml;nzenden Zeichen markiert erscheinen.<\/p>\n<p>Dazu ben&ouml;tigen wir die zuletzt eingegebenen Werte. Aber wie viele Und wie viele Werte sollen &uuml;berhaupt gespeichert werden Zehn, hundert, tausend oder gar noch mehr Machen wir uns doch um die Anzahl zun&auml;chst keinen Kopf und verwenden einfach alle zuletzt eingelesenen Werte f&uuml;r das Textfeld mit dem entsprechenden Wert der Eigenschaft Marke. Diese lesen wir gleich beim &ouml;ffnen des Formulars in ein Array <b>rstLetzteWerte <\/b>ein, das wir auch modulweit verf&uuml;gbar machen wollen. Also deklarieren wir dieses wie folgt im Kopf des Klassenmoduls des Formulars:<\/p>\n<pre><span style=\"color:blue;\">Private <\/span>strLetzteWerte()<span style=\"color:blue;\"> As String<\/span><\/pre>\n<p>Die Funktion zum Einlesen der zuletzt verwendeten Werte soll diese allerdings nicht in der Reihenfolge der Verwendung liefern, sondern einfach in der alphabetischen Reihenfolge. Die Funktion hei&szlig;t <b>LetzteWerteEinlesen <\/b>und sieht wie in Listing 3 aus. Sie erwartet den Wert der <b>Tag<\/b>-Eigenschaft des betroffenen Textfeldes und f&uuml;llt die modulweit deklarierte Variable <b>strLetzteWerte <\/b>mit den entsprechenden Werten.<\/p>\n<pre><span style=\"color:blue;\">Private Function <\/span>LetzteWerteEinlesen(strTag<span style=\"color:blue;\"> As String<\/span>)<span style=\"color:blue;\"> As Long<\/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;\">Dim <\/span>i<span style=\"color:blue;\"> As Integer<\/span>\r\n     <span style=\"color:blue;\">Set<\/span> db = CurrentDb\r\n     <span style=\"color:blue;\">Set<\/span> rst = db.OpenRecordset(\"SELECT LetzterWert FROM tblLetzteWerte &quot; _\r\n         &amp; &quot;WHERE LetzterWertMarke = ''\" & strTag _\r\n         & \"'' ORDER BY LetzterWert\", dbOpenDynaset)\r\n     <span style=\"color:blue;\">Do While<\/span> <span style=\"color:blue;\">Not<\/span> rst.EOF\r\n         ReDim Preserve strLetzteWerte(i)<span style=\"color:blue;\"> As String<\/span>\r\n         strLetzteWerte(i) = rst!LetzterWert\r\n         i = i + 1\r\n         rst.Move<span style=\"color:blue;\">Next<\/span>\r\n     <span style=\"color:blue;\">Loop<\/span>\r\n     LetzteWerteEinlesen = i\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 3: Diese Funktion liest die zuletzt verwendeten Werte f&uuml;r das angegebene Steuerelement ein.<\/span><\/b><\/p>\n<p>Diese bezieht sie nat&uuml;rlich aus der Tabelle <b>tblLetzteWerte<\/b>. Auf diese greift sie &uuml;ber ein Recordset zu, das alle Datens&auml;tze dieser Tabelle liefert, deren Feld <b>LetzterWertMarke <\/b>dem mit <b>strTag <\/b>&uuml;bergebenen Wert entspricht. Die Funktion durchl&auml;uft alle Datens&auml;tze dieses Recordsets in einer <b>Do While<\/b>-Schleife und erledigt darin drei Schritte:<\/p>\n<ul>\n<li>das Vergr&ouml;&szlig;ern des Arrays auf den aktuell in der Variablen <b>i <\/b>gespeicherten Wert,<\/li>\n<li>das Eintragen des Wertes des Feldes <b>LetzterWert<\/b> des aktuellen Datensatzes in das Element des Arrays <b>strLetzteWerte <\/b>mit dem Index <b>i <\/b>und<\/li>\n<li>das Erh&ouml;hen des Index <b>i <\/b>um den Wert <b>1<\/b>.<\/li>\n<\/ul>\n<p>Diese Funktion wird gleich beim Laden des Formulars ausgel&ouml;st:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>Form_Load()\r\n     LetzteWerteEinlesen  Me!txtBeispieltext.Tag\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b>Erg&auml;nzen des aktuellen Ausdrucks<\/b><\/p>\n<p>Nun kommt der interessante Teil: Wir wollen daf&uuml;r sorgen, dass beim Eingeben eines oder mehrerer Zeichen in das Textfeld ein passender Wert aus dem Array <b>strLetzteWerte <\/b>gefunden wird und die fehlenden Zeichen hinten an den bereits eingegebenen Ausdruck anh&auml;ngen und als markiert kennzeichnen.<\/p>\n<p>Den ersten Teil der Prozedur, die durch das Ereignis <b>Bei Taste auf <\/b>des Textfeldes ausgel&ouml;st wird, finden Sie in Listing 4. Die Prozdur pr&uuml;ft zun&auml;chst den Wert des Parameters <b>KeyCode<\/b>, der einen dem zuletzt eingegebenen Zeichen entsprechenden Zahlenwert enth&auml;lt.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>txtBeispieltext_KeyUp(KeyCode<span style=\"color:blue;\"> As Integer<\/span>, Shift<span style=\"color:blue;\"> As Integer<\/span>)\r\n     <span style=\"color:blue;\">Dim <\/span>strAktuellerWert<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>intSelStart<span style=\"color:blue;\"> As Integer<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>intSelLength<span style=\"color:blue;\"> As Integer<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strFeldTemp<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>intStarttemp<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>intLenTemp<span style=\"color:blue;\"> As Integer<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>i<span style=\"color:blue;\"> As Integer<\/span>\r\n     Select Case KeyCode\r\n         <span style=\"color:blue;\">Case <\/span>vbKeyTab, vbKeyLeft, vbKey<span style=\"color:blue;\">Right<\/span> \r\n             <span style=\"color:blue;\">Exit Sub<\/span>\r\n         <span style=\"color:blue;\">Case <\/span>vbKeyBack\r\n         <span style=\"color:blue;\">Case Else<\/span>\r\n             strAktuellerWert = Me!txtBeispieltext.Text\r\n             intSelStart = Me!txtBeispieltext.SelStart\r\n             intSelLength = Me!txtBeispieltext.SelLength\r\n     <span style=\"color:blue;\">End Select<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 4: Diese Ereignisprozedur erg&auml;nzt den aktuellen Ausdruck (Teil I)<\/span><\/b><\/p>\n<p>Der besseren Lesbarkeit halber haben wir diese in der <b>Select Case<\/b>-Bedingung, die diese pr&uuml;ft, durch die entsprechenden Konstanten ersetzt, also etwa <b>9 <\/b>durch <b>vbKeyTab<\/b>, <b>37 <\/b>durch <b>vbKeyLeft<\/b>, <b>39 <\/b>durch <b>vbKeyRight <\/b>und <b>8 <\/b>durch <b>vbKeyBack<\/b>.<\/p>\n<p>Wenn der Benutzer die Tabulatortaste, die <b>Nach Links<\/b>&#8211; oder die <b>Nach Rechts<\/b>-Taste verwendet, soll die Prozedur verlassen werden. Im Falle der Tabulatortaste verl&auml;sst der Fokus das Textfeld, im Falle der <b>Nach Links<\/b>&#8211; und der <b>Nach Rechts<\/b>-Taste springt der Cursor einfach nach links oder rechts. Eine eventuell bereits eingeblendete Erweiterung des aktuellen Ausdrucks bleibt somit erhalten.<\/p>\n<p>Sollte der Benutzer die Zur&uuml;ck-Taste bet&auml;tigt haben, wird diese ebenfalls einfach ausgef&uuml;hrt &#8211; aber die Prozedur wird nicht ver&auml;ndert. Genau wie die Eingabe eines Zeichens soll auch das L&ouml;schen eines Zeichens dazu f&uuml;hren, dass die Prozedur nach passenden Werten sucht.<\/p>\n<p>Sollte der Benutzer ein beliebiges Zeichen mit Ausnahme der soeben erw&auml;hnten und in den ersten beiden Zweigen der <b>Select Case<\/b>-Bedingung abgearbeiteten eingegeben haben, tritt der dritte Zweig der <b>Select Case<\/b>-Bedingung in Aktion. Dort f&uuml;hrt die Prozedur folgende Aktionen aus:<\/p>\n<ul>\n<li>Speichern des aktuell im Textfeld angezeigten Wertes in der Variablen <b>strAktuellerWert<\/b>,<\/li>\n<li>der aktuellen Cursorposition in der Variablen <b>intSelStart <\/b>und<\/li>\n<li>der L&auml;nge der aktuellen Markierung in der Variablen <b>intSelLength<\/b>.<\/li>\n<\/ul>\n<p><!--30percent--><\/p>\n<p>Damit geht es nun weiter mit Listing 5. Hier pr&uuml;ft die Prozedur nun, ob &uuml;berhaupt schon ein Zeichen eingegeben wurde. Ist dies nicht der Fall, endet die Prozedur hier. Anderenfalls stellt sie die Variable <b>intStarttemp <\/b>auf den Wert <b>1 <\/b>ein. Damit ermittelt die Prozedur nun mithilfe der <b>Mid<\/b>-Funktion und den Werten der beiden Variablen <b>intSelStart <\/b>und <b>intSelLength <\/b>den aktuellen Inhalt des Textfeldes und tr&auml;gt diesen in die Variable <b>strFeldTemp <\/b>ein. Die L&auml;nge dieser Zeichenkette landet anschlie&szlig;end in der Variablen <b>intLenTemp<\/b>. Ist diese gr&ouml;&szlig;er als <b>0<\/b>, pr&uuml;ft die Prozedur mit der Hilfsfunktion <b>ArrayGefuellt<\/b>, ob das Array <b>strLetzteWerte <\/b>&uuml;berhaupt einen Wert enth&auml;lt (s. Listing 6).<\/p>\n<pre><span style=\"color:blue;\">Private Function <\/span>ArrayGefuellt(var()<span style=\"color:blue;\"> As String<\/span>)<span style=\"color:blue;\"> As Boolean<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>intTest<span style=\"color:blue;\"> As Integer<\/span>\r\n     <span style=\"color:blue;\">If <\/span>IsArray(var)<span style=\"color:blue;\"> Then<\/span>\r\n         On Error Resume <span style=\"color:blue;\">Next<\/span>\r\n         intTest = <span style=\"color:blue;\">LBound<\/span>(var())\r\n         <span style=\"color:blue;\">If <\/span>Err.Number = 0<span style=\"color:blue;\"> Then<\/span>\r\n             ArrayGefuellt = <span style=\"color:blue;\">True<\/span>\r\n         <span style=\"color:blue;\">Else<\/span>\r\n             ArrayGefuellt = <span style=\"color:blue;\">False<\/span>\r\n         <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">Else<\/span>\r\n         ArrayGefuellt = <span style=\"color:blue;\">False<\/span>\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 5: Diese Funktion pr&uuml;ft, ob ein Array gef&uuml;llt ist.<\/span><\/b><\/p>\n<p>Ist dies nicht der Fall, soll dieses Array zun&auml;chst mit der Funktion <b>LetzteWerteEinlesen <\/b>gef&uuml;llt werden. Bei diesem Aufruf verwerten wir auch den R&uuml;ckgabewert der Funktion. Diesen vergleicht die Prozedur mit dem Wert <b>0<\/b>. Ist der Wert gr&ouml;&szlig;er, enth&auml;lt das neu gef&uuml;llte Array mindestens einen Eintrag und wir k&ouml;nnen pr&uuml;fen, ob der aktuelle Wert des Textfeldes mit einem der Werte des Arrays &uuml;bereinstimmt. Anderenfalls wird die Prozedur an dieser Stelle beendet.<\/p>\n<p>Nun starten wir in einer <b>For&#8230;Next<\/b>-Schleife den Vergleich des aktuellen Ausdrucks aus <b>strFeldTemp <\/b>mit den ersten Zeichen der in <b>strLetzteWerte <\/b>gespeicherten Zeichenketten. Wenn wir also die Zeichen <b>Ers <\/b>eingegeben haben, vergleicht die Prozedur diese Zeichenkette jeweils mit den ersten drei Zeichen der Werte aus <b>strLetzteWerte<\/b>. Stimmen diese &uuml;berein, pr&uuml;ft eine weitere <b>If&#8230;Then<\/b>-Bedingung, ob die in <b>intSelStart <\/b>gespeicherte Position der Einf&uuml;gemarke mit der L&auml;nge der Zeichenkette aus <b>strAktuellerWert <\/b>&uuml;bereinstimmt. Ist dies der Fall, pr&uuml;ft die Prozedur lediglich noch, ob der Benutzer die Zur&uuml;ck-Taste bet&auml;tigt hat (<b>vbKeyBack<\/b>). In diesem Fall wird der Wert f&uuml;r die aktuelle Markierung um eine Position nach links verschoben.<\/p>\n<p>Anderenfalls stellt die Prozedur den Inhalt des Textfeldes &uuml;ber die Eigenschaft Text auf die bisher eingegebenen Zeichen (also etwa <b>Ers<\/b>) plus die folgenden Zeichen des gefundenen Ausdrucks aus dem Array <b>strLetzteWerte <\/b>ein (beispielsweise <b>ter Wert<\/b>). Beides ergibt also nun zusammen <b>Erster Wert<\/b>. Warum tragen wir also nicht direkt den kompletten Wert aus dem Array <b>strLetzterWert <\/b>ein Weil dies auch die Gro&szlig;-\/Kleinschreibung &auml;ndern k&ouml;nnte. Vielleicht hat der Benutzer ja die Zeichen <b>ers <\/b>eingegeben, was dann in <b>Ers <\/b>ge&auml;ndert werden w&uuml;rde.<\/p>\n<p>Schlie&szlig;lich stellt die Prozedur die beiden Eigenschaften <b>SelStart <\/b>und <b>SelLength <\/b>so ein, dass alle Zeichen, die automatisch erg&auml;nzt wurden, markiert werden &#8211; in diesem Fall also die Zeichen <b>ter Wert<\/b> von <b>Erster Wert<\/b>. Den Start der Markierung entnimmt die Prozedur dabei der Variablen <b>intSelStart<\/b>, die L&auml;nge der Markierung berechnet sie aus der L&auml;nge der Zeichenkette aus dem Array <b>strLetzteWerte <\/b>und der Anzahl der bisher eingegebenen Zeichen.<\/p>\n<p><b>AfterUpdate verhindern<\/b><\/p>\n<p>Damit w&auml;re prinzipiell alles erledigt &#8211; wenn die Zuweisung eines Wertes an die Eigenschaft <b>Text <\/b>nicht ung&uuml;nstigerweise das Ereignis <b>Nach Aktualisierung <\/b>des Textfeldes ausl&ouml;sen w&uuml;rde. Und diese sorgt ja gerade daf&uuml;r, dass die zuletzt eingegebenen Werte in der Tabelle <b>tblLetzteWerte <\/b>erscheinen. Wenn diese aber nun jedes Mal ausgel&ouml;st wird, wenn der Benutzer ein neues Zeichen eingegeben hat, f&uuml;r das im Array <b>strLetzteWerte <\/b>ein Wert gefunden wurde, ist die Tabelle <b>tblLetzteWerte <\/b>schnell voller unsinniger Werte.<\/p>\n<p>Da wir nicht verhindern k&ouml;nnen, dass das Ereignis <b>Nach Aktualisierung <\/b>im genannten Fall ausgel&ouml;st wird, m&uuml;ssen wir daf&uuml;r sorgen, dass die enthaltenen Anweisungen nur ausgef&uuml;hrt werden, wenn dies sinnvoll ist.<\/p>\n<p>Dazu verwenden wir eine modulweit deklarierte Variable namens <b>bolKey<\/b>:<\/p>\n<pre><span style=\"color:blue;\">Private <\/span>bolKey<span style=\"color:blue;\"> As Boolean<\/span><\/pre>\n<p>Diese stellen wir in der Prozedur, die durch das Ereignis <b>Bei Taste auf <\/b>des Textfeldes ausgel&ouml;st wird, auf den Wert <b>True <\/b>ein &#8211; aber nur, wenn wir die Eigenschaft <b>Text <\/b>des Textfeldes &auml;ndern wollen, und dann mit der vorherigen Anweisung.<\/p>\n<p>Die Prozedur, die durch das Ereignis <b>Nach Aktualisierung <\/b>des Textfeldes ausgel&ouml;st wird, m&uuml;ssen wir nun noch entsprechend anpassen (s. Listing 7).<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>txtBeispieltext_AfterUpdate()\r\n     <span style=\"color:blue;\">Dim <\/span>db<span style=\"color:blue;\"> As <\/span>DAO.Database\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> bolKey<span style=\"color:blue;\"> Then<\/span>\r\n         <span style=\"color:blue;\">Set<\/span> db = CurrentDb\r\n         db.Execute \"DELETE FROM tblLetzteWerte WHERE LetzterWert = ''\" _\r\n             & Me!txtBeispieltext & \"'' AND LetzterWertMarke = ''\" _\r\n             & Me!txtBeispieltext.Tag & \"''\", dbFailOnError\r\n         db.Execute \"INSERT INTO tblLetzteWerte(LetzterWert, LetzterWertMarke) \" _\r\n             & \"VALUES(''\" & Me!txtBeispieltext & \"'', ''\" & Me!txtBeispieltext.Tag _\r\n             & \"'')\", dbFailOnError\r\n         LetzteWerteEinlesen Me!txtBeispieltext.Tag\r\n     <span style=\"color:blue;\">Else<\/span>\r\n         bolKey = <span style=\"color:blue;\">False<\/span>\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 7: Neue Version der Ereignisprozedur, die durch Nach Aktualisierung ausgel&ouml;st wird.<\/span><\/b><\/p>\n<p>Dazu f&uuml;gen Sie gleich zu Beginn eine <b>If&#8230;Then<\/b>-Bedingung hinzu, die den Wert von <b>bolKey <\/b>pr&uuml;ft. Hat diese Variable nicht den Wert <b>True<\/b>, soll der eingegebene Wert in die Tabelle der zuletzt gespeicherten Werte geschrieben werden. Au&szlig;erdem soll die Funktion <b>LetzteWerteEinlesen <\/b>die zuletzt eingegebenen Werte ermitteln.<\/p>\n<p>Hat <b>bolKey <\/b>den Wert <b>True<\/b>, geschieht dies nicht. Stattdessen soll <b>bolKey <\/b>einfach auf <b>False <\/b>gesetzt werden, damit der Wert beim eventuell nun folgenden Verlassen des Textfeldes gespeichert werden kann.<\/p>\n<p><b>Letzte Werte per Klasse<\/b><\/p>\n<p>Nun sollen Sie die hier beschriebenen Codepassagen nicht f&uuml;r jedes Steuerelement neu hinzuf&uuml;gen m&uuml;ssen. Alternativ erstellen wir eine Klasse, die alle wichtigen Elemente enth&auml;lt. Diese hei&szlig;t <b>clsLetzteWerte<\/b> und soll neben den bereits bekannten Funktionen noch einige Erweiterungen bekommen.<\/p>\n<p>Die erste betrifft die Anzahl der zuletzt gespeicherten Werte je Textfeld. Diese soll man mit einer Eigenschaft namens <b>MengeLetzteWerte <\/b>einstellen k&ouml;nnen. Wenn mehr Eintr&auml;ge als dort angegeben f&uuml;r den entsprechenden Wert der Eigenschaft <b>Tag<\/b>\/<b>Marke <\/b>des Textfeldes in der Tabelle <b>tblLetzteWerte <\/b>gespeichert sind, sollen die &auml;ltesten Eintr&auml;ge gel&ouml;scht werden.<\/p>\n<p>Au&szlig;erdem wollen wir dem Benutzer die Auswahl der zuletzt verwendeten Eintr&auml;ge mit den Schaltfl&auml;chen <b>Seite nach oben <\/b>und <b>Seite nach unten <\/b>erm&ouml;glichen. Diese Option soll allerdings unabh&auml;ngig von den bereits eingegebenen Zeichen erfolgen.<\/p>\n<p><b>Klasse nutzen<\/b><\/p>\n<p>Schauen wir uns zun&auml;chst an, wie Sie die Klasse nutzen k&ouml;nnen &#8211; sp&auml;ter schauen wir uns die Klasse selbst an. Dazu erstellen Sie ein neues Formular namens <b>frmBeispielMehrereFelder<\/b>, das Sie mit zwei Textfeldern namens <b>txtVorname <\/b>und <b>txtNachname <\/b>ausstatten (s. Bild 7).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2015_01\/pic_966_007.png\" alt=\"Entwurf eines Formulars mit zwei Textfeldern, die mit der Klasse clsLetzteWerte ausgestattet werden sollen\" width=\"500\" height=\"236,9888\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 7: Entwurf eines Formulars mit zwei Textfeldern, die mit der Klasse clsLetzteWerte ausgestattet werden sollen<\/span><\/b><\/p>\n<p>F&uuml;r dieses Formular legen Sie zun&auml;chst zwei Variablen an, welche die Verweise auf die beiden Instanzen der Klasse <b>clsLetzteWerte <\/b>aufnehmen. Diese landen im Kopf des Klassenformulars:<\/p>\n<pre><span style=\"color:blue;\">Dim <\/span>objLWVorname<span style=\"color:blue;\"> As <\/span>clsLetzteWerte\r\n<span style=\"color:blue;\">Dim <\/span>objLWNachname<span style=\"color:blue;\"> As <\/span>clsLetzteWerte<\/pre>\n<p>Die Instanzierung &uuml;bernimmt die Prozedur, die durch das Ereignis <b>Beim Laden<\/b> des Formulars ausgel&ouml;st wird. F&uuml;r diese hinterlegen Sie den Code aus Listing 8.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>Form_Load()\r\n     <span style=\"color:blue;\">Set<\/span> objLWVorname = <span style=\"color:blue;\">New<\/span> clsLetzteWerte\r\n     <span style=\"color:blue;\">With<\/span> objLWVorname\r\n         <span style=\"color:blue;\">Set<\/span> .Textbox = Me!txtVorname\r\n         .MengeLetzteWerte = 20\r\n     End <span style=\"color:blue;\">With<\/span>\r\n     <span style=\"color:blue;\">Set<\/span> objLWNachname = <span style=\"color:blue;\">New<\/span> clsLetzteWerte\r\n     <span style=\"color:blue;\">With<\/span> objLWNachname\r\n         <span style=\"color:blue;\">Set<\/span> .Textbox = Me!txtNachname\r\n         .MengeLetzteWerte = 20\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 8: Beim Laden werden die Textfelder mit Zusatzfunktionen ausgestattet.<\/span><\/b><\/p>\n<p>Die Prozedur erstellt zun&auml;chst ein neues Objekt auf Basis der Klasse <b>clsLetzteWerte <\/b>und speichert einen Verweis darauf in der Variablen <b>objLWVorname<\/b>.<\/p>\n<p>Dann stellt es eine Eigenschaft namens <b>Textbox <\/b>auf das Textfeld (hier <b>txtVorname<\/b>) ein, das mit der Zusatzfunktion zum schnellen Ausw&auml;hlen der bereits eingegebene Werte ausgestattet werden soll. Au&szlig;erdem liefert die Klasse noch eine Eigenschaft namens <b>MengeLetzteWerte<\/b>, f&uuml;r die Sie die Anzahl der zu speichernden Werte f&uuml;r dieses Textfeld hinterlegen k&ouml;nnen.<\/p>\n<p>Das Gleiche erledigen Sie f&uuml;r das Textfeld <b>txtNachname<\/b>. Hier hei&szlig;t die Variable <b>objLWNachname<\/b>.<\/p>\n<p>Sie d&uuml;rfen nicht vergessen, auch noch eine Prozedur f&uuml;r das Ereignis <b>Beim Entladen <\/b>anzulegen. Dieses leert die Objektvariablen wieder:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>Form_Unload(Cancel<span style=\"color:blue;\"> As Integer<\/span>)\r\n     <span style=\"color:blue;\">Set<\/span> objLWVorname = Nothing\r\n     <span style=\"color:blue;\">Set<\/span> objLWNachname = Nothing\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Lassen Sie diesen Schritt aus, st&uuml;rzt Access beim Schlie&szlig;en des Formulars ab.<\/p>\n<p>Wenn wir nun die Formularansicht des Formulars &ouml;ffnen, erscheint direkt eine Meldung (s. Bild 8). Diese besagt, dass wir vergessen haben, einen Wert f&uuml;r die <b>Marke<\/b>-Eigenschaft des Textfeldes <b>txtVorname <\/b>anzugeben. Nach dem Schlie&szlig;en dieser Meldung erscheint die gleiche Meldung nochmals f&uuml;r das Textfeld <b>txtNachname<\/b>.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2015_01\/pic_966_008.png\" alt=\"F&uuml;r eines der Textfelder wurde noch kein Wert f&uuml;r die Eigenschaft Tag\/Marke eingestellt.\" width=\"500\" height=\"306,338\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 8: F&uuml;r eines der Textfelder wurde noch kein Wert f&uuml;r die Eigenschaft Tag\/Marke eingestellt.<\/span><\/b><\/p>\n<p>Wenn wir nun die Werte <b>txtVorname <\/b>und <b>txtNachname <\/b>f&uuml;r die <b>Marke<\/b>-Eigenschaft des jeweiligen Textfeldes hinterlegen, erscheinen die Meldungen beim n&auml;chsten &ouml;ffnen nicht mehr.<\/p>\n<p>Wenn Sie das Formular nun testen, werden neue Werte jeweils in der Tabelle <b>tblLetzteWerte <\/b>gespeichert. Diese sieht dann etwa wie in Bild 9 aus.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2015_01\/pic_966_009.png\" alt=\"Die Tabelle mit einigen Werten sorgt in dieser Konstellation daf&uuml;r, dass das Bet&auml;tigen der Seite nach unten-Taste den Vornamen Volkmar im Textfeld txtVorname anzeigt.\" width=\"575\" height=\"287,0922\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 9: Die Tabelle mit einigen Werten sorgt in dieser Konstellation daf&uuml;r, dass das Bet&auml;tigen der Seite nach unten-Taste den Vornamen Volkmar im Textfeld txtVorname anzeigt.<\/span><\/b><\/p>\n<p>Wenn Sie dann im Textfeld <b>txtVorname<\/b> die Taste <b>Seite nach unten <\/b>dr&uuml;cken, erscheint als erster Wert der Name <b>Volkmar<\/b>. Dies ist korrekt: <b>Volkmar <\/b>ist der zuletzt eingegebene Name und das Textfeld soll die Namen in der Reihenfolge der Eingabe liefern.<\/p>\n<p>Im Gegensatz dazu sollte die Eingabe des Buchstabens <b>A <\/b>f&uuml;r die Erg&auml;nzung des Inhalts um die Buchstaben <b>ndr&eacute; <\/b>sorgen.<\/p>\n<p><b>Erstellen der Klasse<\/b><\/p>\n<p>Die Klasse enth&auml;lt im Wesentlichen den Code, den Sie bereits in den vorherigen Ausf&uuml;hrungen kennen gelernt haben. Hinzu kommen einige &auml;nderungen, die dazu erforderlich sind, dass Sie die Klasse als solche nutzen k&ouml;nnen &#8211; etwa die Eigenschaften der Klasse.<\/p>\n<p>Schlie&szlig;lich haben wir noch die Funktion hinzugef&uuml;gt, mit der Sie die zuletzt verwendeten Werte per <b>Seite nach oben<\/b>\/<b>Seite nach unten<\/b>-Taste ausw&auml;hlen k&ouml;nnen. Die Klasse f&uuml;gen Sie mit dem Men&uuml;befehl <b>Einf&uuml;gen|Klassenmodul <\/b>hinzu. Speichern Sie diese gleich unter dem Namen <b>clsLetzteWerte<\/b>.<\/p>\n<p>Zum Speichern des Verweises auf die Textbox deklarieren wir die folgende Eigenschaft:<\/p>\n<pre><span style=\"color:blue;\">Private <\/span>WithEvents m_Textbox<span style=\"color:blue;\"> As <\/span>Textbox<\/pre>\n<p>Der Benutzer soll das Textfeld nun mit einer Anweisung wie der folgenden &uuml;bergeben k&ouml;nnen:<\/p>\n<pre><span style=\"color:blue;\">Set<\/span> objLWVorname.Textbox = Me!txtVorname<\/pre>\n<p>Dazu f&uuml;gen Sie eine <b>Property Set<\/b>-Prozedur wie in Listing 9 zum Klassenmodul hinzu. Diese Prozedur stellt zun&auml;chst die Variable <b>m_Textbox <\/b>auf das mit <b>Textbox <\/b>&uuml;bergebene Textfeld ein. Dann legt es fest, welche Ereignisprozeduren in dieser Klasse implementiert und ausgel&ouml;st werden k&ouml;nnen, n&auml;mlich <b>AfterUpdate <\/b>(<b>Nach Aktualisierung<\/b>), <b>OnKeyUp <\/b>(<b>Bei Taste auf<\/b>) und <b>OnGotFocus <\/b>(<b>Bei Fokuserhalt<\/b>).<\/p>\n<pre><span style=\"color:blue;\">Public Property <span style=\"color:blue;\">Set<\/span> <\/span>Textbox(Textbox<span style=\"color:blue;\"> As <\/span>Textbox)\r\n     <span style=\"color:blue;\">Set<\/span> m_Textbox = Textbox\r\n     <span style=\"color:blue;\">With<\/span> m_Textbox\r\n         .AfterUpdate = \"[Event Procedure]\"\r\n         .OnKeyUp = \"[Event Procedure]\"\r\n         .OnGotFocus = \"[Event Procedure]\"\r\n     End <span style=\"color:blue;\">With<\/span>\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> <span style=\"color:blue;\">Len<\/span>(m_Textbox.Tag) = 0<span style=\"color:blue;\"> Then<\/span>\r\n         LetzteWerteEinlesenAlphabet m_Textbox.Tag\r\n         LetzteWerteEinlesenEingabe m_Textbox.Tag\r\n     <span style=\"color:blue;\">Else<\/span>\r\n         <span style=\"color:blue;\">MsgBox<\/span> \"Das Textfeld ''\" & m_Textbox.Name _\r\n             & \"'' kann nicht mit der Funktion zur Anzeige der letzten Werte \" _\r\n             & \"verwendet werden, da die Tag\/Marke-Eigenschaft leer ist.\"\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Property<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 9: Property Set-Prozedur zum Einstellen des Textfeldes<\/span><\/b><\/p>\n<p>Wenn die Tag-Eigenschaft gef&uuml;llt ist, ruft die Prozedur zwei Funktionen auf: <b>LetzteWerteEinlesenAlphabet <\/b>und <b>LetzteWerteEinlesenEingabe<\/b>. Beide basieren auf der bereits bekannten Funktion <b>LetzteWerteEinlesen<\/b>, verwenden aber eine unterschiedliche Sortierung &#8211; eben nach dem Alphabet und nach der umgekehrten Reihenfolge der Eingabe. Diese beiden Funktionen f&uuml;llen die folgenden Arrays:<\/p>\n<pre><span style=\"color:blue;\">Private <\/span>strLetzteWerteAlphabet()<span style=\"color:blue;\"> As String<\/span>\r\n<span style=\"color:blue;\">Private <\/span>strLetzteWerteEingabe()<span style=\"color:blue;\"> As String<\/span><\/pre>\n<p>Sollte die <b>Tag<\/b>-Eigenschaft leer sein, erscheint die bereits weiter oben besprochene Meldung.<\/p>\n<p>Die Menge der zu verwendenden zuletzt eingegebenen Werte soll mit der Eigenschaft <b>MengeLetzteWerte<\/b> festgelegt werden. Diesen Wert speichert die Klasse in der folgenden Variablen:<\/p>\n<pre><span style=\"color:blue;\">Private <\/span>m_MengeLetzteWerte<span style=\"color:blue;\"> As Long<\/span><\/pre>\n<p>Die zugeh&ouml;rige <b>Property Let<\/b>-Anweisung sieht so aus:<\/p>\n<pre><span style=\"color:blue;\">Public Property Let <\/span>MengeLetzteWerte( lng<span style=\"color:blue;\"> As Long<\/span>)\r\n     m_MengeLetzteWerte = lng\r\n<span style=\"color:blue;\">End Property<\/span><\/pre>\n<p><b>Nur die letzten x Werte speichern<\/b><\/p>\n<p>Das Speichern der Werte soll wieder in einer Prozedur erfolgen, die durch das Ereignis <b>Nach Aktualisierung <\/b>des Textfeldes ausgel&ouml;st wird. Das Ereignis k&ouml;nnen wir nun allerdings nicht &uuml;ber die entsprechende Ereigniseigenschaft anlegen. Stattdessen erledigen wir dies direkt im Klassenmodul. Dort w&auml;hlen Sie im linken Kombinationsfeld am oberen Rand den Eintrag <b>m_Textbox <\/b>aus, im rechten dann den Eintrag <b>AfterUpdate<\/b>. Dies legt die Prozedur <b>m_Textbox_After-Update <\/b>an. Diese erg&auml;nzen Sie wie in Listing 10. Die Prozedur pr&uuml;ft wieder, ob <b>bolKey <\/b>den Wert <b>True <\/b>hat. In diesem Fall findet keine Aktualisierung statt, da das Ereignis hier durch das Zuweisen eines Textes an die Eigenschaft <b>Text <\/b>des Textfeldes ausgel&ouml;st wurde. Im oberen Teil der Prozedur finden Sie die wesentlichen &auml;nderungen. Hier pr&uuml;ft diese, ob der Wert der Variablen <b>m_MengeLetzteWerte <\/b>gr&ouml;&szlig;er als <b>0 <\/b>ist. Dies ist der Fall, wenn das instanzierende Formular den Wert der Eigenschaft <b>MengeLetzteWerte <\/b>auf einen Wert gr&ouml;&szlig;er als <b>0 <\/b>eingestellt hat.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>m_Textbox_AfterUpdate()\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>lngLetzterWertID<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>rstLetzterWert<span style=\"color:blue;\"> As <\/span>DAO.Recordset\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> bolKey<span style=\"color:blue;\"> Then<\/span>\r\n         <span style=\"color:blue;\">Set<\/span> db = CurrentDb\r\n         <span style=\"color:blue;\">If <\/span>m_MengeLetzteWerte &gt; 0<span style=\"color:blue;\"> Then<\/span>\r\n             <span style=\"color:blue;\">Set<\/span> rstLetzterWert = db.OpenRecordset(\"SELECT TOP \" & m_MengeLetzteWerte _\r\n                 & \" LetzterWertID FROM tblLetzteWerte WHERE LetzterWertMarke = ''\" _\r\n                 & m_Textbox.Tag & \"'' ORDER BY LetzterWertID DESC\", dbOpenForwardOnly)\r\n             <span style=\"color:blue;\">If <\/span>rstLetzterWert.RecordCount &gt; m_MengeLetzteWerte<span style=\"color:blue;\"> Then<\/span>\r\n                 rstLetzterWert.MoveLast\r\n                 lngLetzterWertID = rstLetzterWert!LetzterWertID\r\n                 db.Execute \"DELETE FROM tblLetzteWerte WHERE LetzterWertID &lt;= \" _\r\n                     & lngLetzterWertID & \" AND LetzterWertMarke = ''\" _\r\n                     & m_Textbox.Tag & \"''\", dbFailOnError\r\n                 rstLetzterWert.Close\r\n                 <span style=\"color:blue;\">Set<\/span> rstLetzterWert = Nothing\r\n             <span style=\"color:blue;\">End If<\/span>\r\n         <span style=\"color:blue;\">End If<\/span>\r\n         db.Execute \"DELETE FROM tblLetzteWerte WHERE LetzterWert = ''\" & m_Textbox _\r\n             & \"'' AND LetzterWertMarke = ''\" & m_Textbox.Tag & \"''\", dbFailOnError\r\n         db.Execute \"INSERT INTO tblLetzteWerte(LetzterWert, LetzterWertMarke) VALUES(''\" _\r\n             & m_Textbox & \"'', ''\" & m_Textbox.Tag & \"'')\", dbFailOnError\r\n         LetzteWerteEinlesenAlphabet m_Textbox.Tag\r\n         LetzteWerteEinlesenEingabe m_Textbox.Tag\r\n         <span style=\"color:blue;\">Set<\/span> db = Nothing\r\n     <span style=\"color:blue;\">Else<\/span>\r\n         bolKey = <span style=\"color:blue;\">False<\/span>\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 10: Erweiterte Prozedur zum Speichern der zuletzt verwendeten Werte<\/span><\/b><\/p>\n<p>Dann erstellt die Prozedur ein neues Recordset, das die ersten x Datens&auml;tze der Tabelle <b>tblLetzteWerte <\/b>enth&auml;lt, deren Feld <b>LetzterWertMarke <\/b>dem Wert der Eigenschaft <b>Marke <\/b>des Textfeldes aus <b>m_Textfeld <\/b>entspricht. Au&szlig;erdem kommen die Eintr&auml;ge in der umgekehrten Reihenfolge der Eingabe (<b>ORDER BY LetzterWertID DESC<\/b>). Das Recordset wird mit dem Parameter <b>dbOpenForwardOnly <\/b>ge&ouml;ffnet, damit wir direkt auf die Eigenschaft <b>RecordCount <\/b>zugreifen k&ouml;nnen. Diesen Wert pr&uuml;fen wir in der folgenden <b>If&#8230;Then<\/b>-Bedingung. Ist die Anzahl der gefundenen Datens&auml;tze gr&ouml;&szlig;er als die angegebene Anzahl der maximal zu speichernden Datens&auml;tze, sollen die &auml;ltesten Datens&auml;tze gel&ouml;scht werden, sodass nur die entsprechende Anzahl Datens&auml;tze &uuml;brig bleibt.<\/p>\n<p>Dazu bewegen wir den Datensatzzeiger zum letzten Datensatz des Recordsets, also dem ersten Datensatz von vorn, der nicht gel&ouml;scht werden soll. Den Prim&auml;rschl&uuml;sselwert dieses Datensatzes speichern wir in der Variablen <b>lngLetzterWertID<\/b>. Da der Prim&auml;rschl&uuml;ssel als Autowert ausgelegt ist, liefert dieser auch die Reihenfolge, in welcher die Datens&auml;tze angelegt wurden.<\/p>\n<p>Wenn wir also alle Datens&auml;tze l&ouml;schen, deren Prim&auml;rschl&uuml;sselwert kleiner oder gleich dem Wert aus <b>lngLetzterWertID <\/b>sind, erwischen wir auf jeden Fall die &auml;ltesten Eintr&auml;ge. Genau dies erledigt die Prozedur mit der folgenden <b>DELETE<\/b>-Aktionsabfrage. Danach schlie&szlig;t die Prozedur das Recordset und leert die Objektvariable.<\/p>\n<p>Sollte die Tabelle <b>tblLetzteWerte <\/b>bereits einen Eintrag enthalten, welcher den neu eingegebenen Wert f&uuml;r die aktuelle Marke enth&auml;lt, wird dieser mit der folgenden <b>DELETE<\/b>-Abfrage gel&ouml;scht.<\/p>\n<p>Danach legt die Prozedur einen neuen Datensatz mit dem neuen Wert und der <b>Marke<\/b>-Eigenschaft des Textfelds an.<\/p>\n<p>Damit die Funktion zur Anzeige der zuletzt eingegebenen Werte den neuen Wert direkt ber&uuml;cksichtigt, ruft die Prozedur die beiden Routinen <b>LetzteWerteEinlesenAlphabet <\/b>und <b>LetzteWerteEinlesenEingabe <\/b>auf. Dies f&uuml;llt die beiden Arrays <b>strLetzteWerteAlphabet <\/b>und <b>strLetzteWerteEingabe <\/b>neu.<\/p>\n<p><b>Letzte Werte mit Seite nach oben\/Seite nach unten<\/b><\/p>\n<p>Die Ereignisprozedur, die durch das Ereignis <b>Taste auf <\/b>ausgel&ouml;st wird, haben wir um die Reaktion auf die Tasten <b>Seite nach oben <\/b>und <b>Seite nach unten <\/b>erweitert (fett gedruckter Code in Listing 11). Der dortige <b>Case<\/b>-Zweig reagiert auf die Werte <b>vbKeyPageUp <\/b>und <b>vbKeyPageDown <\/b>des Parameters <b>KeyCode<\/b>. Wichtig f&uuml;r die dortigen Anweisungen ist die Deklaration einer Variablen im Kopf des Klassenmoduls, mit dem wir die aktuelle Position des angezeigten Wertes der zuletzt eingegebenen Werte speichern. Diesen deklarieren wir wie folgt:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>m_Textbox_KeyUp(KeyCode<span style=\"color:blue;\"> As Integer<\/span>, Shift<span style=\"color:blue;\"> As Integer<\/span>)\r\n     <span style=\"color:blue;\">Dim <\/span>strAktuellerWert<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>intSelStart<span style=\"color:blue;\"> As Integer<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>intSelLength<span style=\"color:blue;\"> As Integer<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strFeldTemp<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>intStarttemp<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>intLenTemp<span style=\"color:blue;\"> As Integer<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>i<span style=\"color:blue;\"> As Integer<\/span>\r\n     Select Case KeyCode\r\n         <span style=\"color:blue;\">Case <\/span>vbKeyTab, vbKeyLeft, vbKeyRight\r\n             <span style=\"color:blue;\">Exit Sub<\/span>\r\n         <span style=\"color:blue;\">Case <\/span>vbKeyBack\r\n         <span style=\"color:blue;\">Case <\/span>vbKeyPageUp, vbKeyPageDown\r\n             <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> ArrayGefuellt(strLetzteWerteEingabe)<span style=\"color:blue;\"> Then<\/span>\r\n                 <span style=\"color:blue;\">If <\/span>LetzteWerteEinlesenEingabe(m_Textbox.Tag) = 0<span style=\"color:blue;\"> Then<\/span>\r\n                     <span style=\"color:blue;\">Exit Sub<\/span>\r\n                 <span style=\"color:blue;\">End If<\/span>\r\n             <span style=\"color:blue;\">End If<\/span>\r\n             <span style=\"color:blue;\">If <\/span>KeyCode = vbKeyPageDown<span style=\"color:blue;\"> Then<\/span>\r\n                 <span style=\"color:blue;\">If <\/span>lngPosition = <span style=\"color:blue;\">UBound<\/span>(strLetzteWerteEingabe)<span style=\"color:blue;\"> Then<\/span>\r\n                     lngPosition = 0\r\n                 <span style=\"color:blue;\">Else<\/span>\r\n                     lngPosition = lngPosition + 1\r\n                 <span style=\"color:blue;\">End If<\/span>\r\n             <span style=\"color:blue;\">Else<\/span>\r\n                 <span style=\"color:blue;\">If <\/span>lngPosition = 0<span style=\"color:blue;\"> Then<\/span>\r\n                     lngPosition = <span style=\"color:blue;\">UBound<\/span>(strLetzteWerteEingabe)\r\n                 <span style=\"color:blue;\">Else<\/span>If lngPosition = -1 Then\r\n                     lngPosition = 0\r\n                 <span style=\"color:blue;\">Else<\/span>\r\n                     lngPosition = lngPosition - 1\r\n                 <span style=\"color:blue;\">End If<\/span>\r\n             <span style=\"color:blue;\">End If<\/span>\r\n             bolKey = <span style=\"color:blue;\">True<\/span>\r\n             m_Textbox.Text = strLetzteWerteEingabe(lngPosition)\r\n             m_Textbox.SelStart = 0\r\n             m_Textbox.SelLength = 1000\r\n             <span style=\"color:blue;\">Exit Sub<\/span>\r\n         <span style=\"color:blue;\">Case Else<\/span>\r\n             ...\r\n     <span style=\"color:blue;\">End Select<\/span>\r\n     ...\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 11: Erweiterung f&uuml;r den Einsatz der Seite nach oben\/Seite nach Unten-Tasten<\/span><\/b><\/p>\n<pre><span style=\"color:blue;\">Private <\/span>lngPosition<span style=\"color:blue;\"> As Long<\/span><\/pre>\n<p>Im <b>Select Case<\/b>-Zweig f&uuml;r die Werte <b>vbKeyPageUp <\/b>und <b>vbKeyPageDown <\/b>geschieht dann Folgendes: Die Prozedur pr&uuml;ft, ob das Array <b>strLetzteWerteEingabe <\/b>gef&uuml;llt ist. Falls nicht, f&uuml;llt sie das Array mit der Funktion <b>LetzteWerteLesenEingabe<\/b>. Liefert diese Funktion den Wert <b>0 <\/b>zur&uuml;ck, was dem Fehlen jeglicher Eintr&auml;ge in der Tabelle <b>tblLetzteWerte <\/b>entspricht, wird die Prozedur beendet.<\/p>\n<p>Anderenfalls folgt nun eine Fallunterscheidung zwischen den Werten <b>vbKeyPageDown <\/b>(Taste <b>Seite nach unten<\/b>) und <b>vbKeyPageUp <\/b>(Taste <b>Seite nach oben<\/b>). Im ersten Fall pr&uuml;ft die Prozedur, ob der in <b>lngPosition <\/b>gespeicherte Wert der Anzahl der Werte im Array <b>strLetzteWerteEingabe <\/b>entspricht. Falls ja, bedeutet dies, dass das letzte Wert im Array erreicht wurde.<\/p>\n<p>Die Prozedur stellt <b>lngPosition <\/b>wieder auf <b>0 <\/b>ein, damit als n&auml;chster Wert wieder der erste Wert des Arrays angezeigt wird. In allen anderen F&auml;llen, also wenn <b>lngPosition <\/b>noch nicht die Anzahl der enthaltenen Eintr&auml;ge erreicht hat, wird <b>lngPosition <\/b>um eins erh&ouml;ht.<\/p>\n<p>Im zweiten Teil der <b>If&#8230;Then<\/b>-Bedingung pr&uuml;ft die Prozedur, ob <b>lngPosition <\/b>den Wert <b>0 <\/b>hat. Das bedeutet, dass der Benutzer die Taste <b>Seite nach oben <\/b>bet&auml;tigt, w&auml;hrend schon das erste Element der Liste angezeigt wird. Als N&auml;chstes soll in diesem Fall wieder der letzte Eintrag der Liste erscheinen, was wir durch Einstellen von <b>lngPosition <\/b>auf die Anzahl der im Array enthaltenen Eintr&auml;ge erreichen. Hat <b>lngPosition<\/b> den Wert <b>-1<\/b>, hat das Textfeld gerade den Fokus erhalten und soll nun das Element mit dem Index <b>0 <\/b>anzeigen.<\/p>\n<p>Ist <b>lngPosition <\/b>noch nicht <b>0<\/b>, wird jeweils der Wert <b>1 <\/b>abgezogen. Die Prozedur stellt dann <b>bolKey <\/b>auf den Wert <b>True <\/b>ein, damit das folgende Einstellen der Eigenschaft <b>Text <\/b>und das damit verbundene Ausl&ouml;sen des Ereignisses <b>AfterUpdate <\/b>des Textfeldes nicht im Speichern des aktuellen Inhalts des Textfeldes in der Tabelle <b>tblLetzteWerte <\/b>resultiert.<\/p>\n<p>Die Prozedur stellt die Eigenschaft <b>Text <\/b>dann auf den Wert des Arrays f&uuml;r den Index aus <b>lngPosition <\/b>ein und markiert den kompletten Inhalt des Textfelds. Da nun alle Arbeiten f&uuml;r diesen Fall erledigt sind, wird die Prozedur mit <b>Exit Sub <\/b>verlassen.<\/p>\n<p>Es fehlt noch eine Kleinigkeit: Das mit dieser Funktion ausgestattete Textfeld soll immer, wenn es den Fokus erh&auml;lt, wieder von vorn mit der Auswahl der letzten Werte &uuml;ber die Tasten <b>Seite nach oben <\/b>und <b>Seite nach unten <\/b>beginnen. Deshalb stellen wir in der Ereignisprozedur, die durch das Ereignis <b>Bei Fokuserhalt <\/b>ausgel&ouml;st wird, den Wert der Variablen <b>lngPosition <\/b>auf <b>-1 <\/b>ein.<\/p>\n<p><b>Zusammenfassung und Ausblick<\/b><\/p>\n<p>Diese L&ouml;sung, die Sie ganz einfach durch den Import der Klasse und mit wenigen Codezeilen zu ein oder mehreren Textfeldern hinzuf&uuml;gen k&ouml;nnen, bietet zwei Funktionen: erstens die automatische Anzeige des bestm&ouml;glichen bereits vorhandenen Wertes auf Basis der aktuell eingegebenen Zeichen und zweitens die Auswahl der zuletzt eingegebenen Werte mit den beiden Tasten Seite nach oben und Seite nach unten.<\/p>\n<p>Man k&ouml;nnte diese L&ouml;sung noch weiter verfeinern, indem man bei Eingabe eines oder mehrere Zeichen in das Textfeld ein bis dahin unsichtbares Listenfeld aufklappt, das die passenden Eintr&auml;ge anzeigt und zur Auswahl anbietet.<\/p>\n<h3>Downloads zu diesem Beitrag<\/h3>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>ZuletztEingegebeneWerte.mdb<\/p>\n<p><a href=\"..\/fileadmin\/beispiele\/{2037C8EF-9B69-449D-A529-AF88B985A840}\/aiu_966.zip\">Download<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Textfelder sind keine &uuml;berm&auml;&szlig;ig flexiblen Eingabesteuerelemente. Man gibt Text ein, l&ouml;scht oder bearbeitet diesen oder kopiert Inhalte beziehungsweise f&uuml;gt diese ein. Einige Anwendungen aber liefern f&uuml;r Textfelder &uuml;berraschenden Komfort: Diese zeigen beispielsweise den zuletzt eingegebenen passenden Wert an, sobald man ein oder mehrere Zeichen in das Textfeld eingegeben hat. Der Benutzer kann dann per Tab- oder Eingabetaste die aktuell angezeigte Auswahl einfach &uuml;bernehmen. Dies schauen wir uns genauer an und bauen eine passende Funktion f&uuml;r Access-Textfelder nach.<\/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":[66012015,662015,44000023],"tags":[],"class_list":["post-55000966","post","type-post","status-publish","format-standard","hentry","category-66012015","category-662015","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>Zuletzt eingegebene Werte in Textfeldern - 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\/Zuletzt_eingegebene_Werte_in_Textfeldern\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Zuletzt eingegebene Werte in Textfeldern\" \/>\n<meta property=\"og:description\" content=\"Textfelder sind keine &uuml;berm&auml;&szlig;ig flexiblen Eingabesteuerelemente. Man gibt Text ein, l&ouml;scht oder bearbeitet diesen oder kopiert Inhalte beziehungsweise f&uuml;gt diese ein. Einige Anwendungen aber liefern f&uuml;r Textfelder &uuml;berraschenden Komfort: Diese zeigen beispielsweise den zuletzt eingegebenen passenden Wert an, sobald man ein oder mehrere Zeichen in das Textfeld eingegeben hat. Der Benutzer kann dann per Tab- oder Eingabetaste die aktuell angezeigte Auswahl einfach &uuml;bernehmen. Dies schauen wir uns genauer an und bauen eine passende Funktion f&uuml;r Access-Textfelder nach.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-im-unternehmen.de\/Zuletzt_eingegebene_Werte_in_Textfeldern\/\" \/>\n<meta property=\"og:site_name\" content=\"Access im Unternehmen\" \/>\n<meta property=\"article:published_time\" content=\"2020-05-22T21:06:28+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/vg07.met.vgwort.de\/na\/37fc38935282469cae00730b07d9310f\" \/>\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=\"27\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Zuletzt_eingegebene_Werte_in_Textfeldern\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Zuletzt_eingegebene_Werte_in_Textfeldern\\\/\"},\"author\":{\"name\":\"Andr\u00e9 Minhorst\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\"},\"headline\":\"Zuletzt eingegebene Werte in Textfeldern\",\"datePublished\":\"2020-05-22T21:06:28+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Zuletzt_eingegebene_Werte_in_Textfeldern\\\/\"},\"wordCount\":4765,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Zuletzt_eingegebene_Werte_in_Textfeldern\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg07.met.vgwort.de\\\/na\\\/37fc38935282469cae00730b07d9310f\",\"articleSection\":[\"1\\\/2015\",\"2015\",\"Mit Formularen arbeiten\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Zuletzt_eingegebene_Werte_in_Textfeldern\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Zuletzt_eingegebene_Werte_in_Textfeldern\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Zuletzt_eingegebene_Werte_in_Textfeldern\\\/\",\"name\":\"Zuletzt eingegebene Werte in Textfeldern - Access im Unternehmen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Zuletzt_eingegebene_Werte_in_Textfeldern\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Zuletzt_eingegebene_Werte_in_Textfeldern\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg07.met.vgwort.de\\\/na\\\/37fc38935282469cae00730b07d9310f\",\"datePublished\":\"2020-05-22T21:06:28+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Zuletzt_eingegebene_Werte_in_Textfeldern\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Zuletzt_eingegebene_Werte_in_Textfeldern\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Zuletzt_eingegebene_Werte_in_Textfeldern\\\/#primaryimage\",\"url\":\"http:\\\/\\\/vg07.met.vgwort.de\\\/na\\\/37fc38935282469cae00730b07d9310f\",\"contentUrl\":\"http:\\\/\\\/vg07.met.vgwort.de\\\/na\\\/37fc38935282469cae00730b07d9310f\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Zuletzt_eingegebene_Werte_in_Textfeldern\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Zuletzt eingegebene Werte in Textfeldern\"}]},{\"@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":"Zuletzt eingegebene Werte in Textfeldern - 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\/Zuletzt_eingegebene_Werte_in_Textfeldern\/","og_locale":"de_DE","og_type":"article","og_title":"Zuletzt eingegebene Werte in Textfeldern","og_description":"Textfelder sind keine &uuml;berm&auml;&szlig;ig flexiblen Eingabesteuerelemente. Man gibt Text ein, l&ouml;scht oder bearbeitet diesen oder kopiert Inhalte beziehungsweise f&uuml;gt diese ein. Einige Anwendungen aber liefern f&uuml;r Textfelder &uuml;berraschenden Komfort: Diese zeigen beispielsweise den zuletzt eingegebenen passenden Wert an, sobald man ein oder mehrere Zeichen in das Textfeld eingegeben hat. Der Benutzer kann dann per Tab- oder Eingabetaste die aktuell angezeigte Auswahl einfach &uuml;bernehmen. Dies schauen wir uns genauer an und bauen eine passende Funktion f&uuml;r Access-Textfelder nach.","og_url":"https:\/\/access-im-unternehmen.de\/Zuletzt_eingegebene_Werte_in_Textfeldern\/","og_site_name":"Access im Unternehmen","article_published_time":"2020-05-22T21:06:28+00:00","og_image":[{"url":"http:\/\/vg07.met.vgwort.de\/na\/37fc38935282469cae00730b07d9310f","type":"","width":"","height":""}],"author":"Andr\u00e9 Minhorst","twitter_card":"summary_large_image","twitter_misc":{"Verfasst von":"Andr\u00e9 Minhorst","Gesch\u00e4tzte Lesezeit":"27\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/access-im-unternehmen.de\/Zuletzt_eingegebene_Werte_in_Textfeldern\/#article","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/Zuletzt_eingegebene_Werte_in_Textfeldern\/"},"author":{"name":"Andr\u00e9 Minhorst","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f"},"headline":"Zuletzt eingegebene Werte in Textfeldern","datePublished":"2020-05-22T21:06:28+00:00","mainEntityOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Zuletzt_eingegebene_Werte_in_Textfeldern\/"},"wordCount":4765,"commentCount":0,"publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Zuletzt_eingegebene_Werte_in_Textfeldern\/#primaryimage"},"thumbnailUrl":"http:\/\/vg07.met.vgwort.de\/na\/37fc38935282469cae00730b07d9310f","articleSection":["1\/2015","2015","Mit Formularen arbeiten"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/access-im-unternehmen.de\/Zuletzt_eingegebene_Werte_in_Textfeldern\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/access-im-unternehmen.de\/Zuletzt_eingegebene_Werte_in_Textfeldern\/","url":"https:\/\/access-im-unternehmen.de\/Zuletzt_eingegebene_Werte_in_Textfeldern\/","name":"Zuletzt eingegebene Werte in Textfeldern - Access im Unternehmen","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Zuletzt_eingegebene_Werte_in_Textfeldern\/#primaryimage"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Zuletzt_eingegebene_Werte_in_Textfeldern\/#primaryimage"},"thumbnailUrl":"http:\/\/vg07.met.vgwort.de\/na\/37fc38935282469cae00730b07d9310f","datePublished":"2020-05-22T21:06:28+00:00","breadcrumb":{"@id":"https:\/\/access-im-unternehmen.de\/Zuletzt_eingegebene_Werte_in_Textfeldern\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/access-im-unternehmen.de\/Zuletzt_eingegebene_Werte_in_Textfeldern\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/Zuletzt_eingegebene_Werte_in_Textfeldern\/#primaryimage","url":"http:\/\/vg07.met.vgwort.de\/na\/37fc38935282469cae00730b07d9310f","contentUrl":"http:\/\/vg07.met.vgwort.de\/na\/37fc38935282469cae00730b07d9310f"},{"@type":"BreadcrumbList","@id":"https:\/\/access-im-unternehmen.de\/Zuletzt_eingegebene_Werte_in_Textfeldern\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/access-im-unternehmen.de\/"},{"@type":"ListItem","position":2,"name":"Zuletzt eingegebene Werte in Textfeldern"}]},{"@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\/55000966","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=55000966"}],"version-history":[{"count":0,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55000966\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/media?parent=55000966"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/categories?post=55000966"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/tags?post=55000966"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}