Zur Hauptseite ... Zum Onlinearchiv ... Zum Abonnement ... Zum Newsletter ... Zu den Tools ... Zum Impressum ... Zum Login ...

Gedrucktes Heft

Diesen Beitrag finden Sie in Ausgabe 6/2006.

Unser Angebot für Sie!

Lesen Sie diesen Beitrag und 500 andere sofort im Onlinearchiv, und erhalten Sie alle zwei Monate brandheißes Access-Know-how auf 72 gedruckten Seiten! Plus attraktive Präsente, zum Beispiel das bald erscheinende Buch 'Access 2010 - Das Grundlagenbuch für Entwickler'!

Diesen Beitrag twittern

Zusammenfassung

Bauen Sie sich ein Formular für die Suche im Inhalt eines Textfeldes.

Techniken

Formulare, VBA

Voraussetzungen

Access 2000 oder höher

Beispieldatei

SucheInTextfeldern.mdb

Shortlink

415

Volltextsuche mit Highlight

André Minhorst, Duisburg

Haben Sie schon einmal mit Google Groups versucht, die Lösung zu einem Access-Problem zu finden? Dann kennen Sie das: Google markiert alle angegebenen Suchbegriffe in den gefundenen Postings in unterschiedlichen Farben. Keine Frage: Das bekommt man auch in Access hin - und wenn dafür auch das Webbrowser-Steuerelement aushelfen muss.

Google macht es wieder einmal vor: Sucht man dort unter „Groups“ nach bestimmten Begriffen und wählt dann einen Eintrag aus den gefundenen Threads aus, zeigt Google die in den Postings enthaltenen Suchbegriffe farbig unterlegt an (s. Abb. 1). Das macht es einfacher, wichtigen Text von unwichtigem zu unterscheiden. Auch in Access lassen sich Suchbegriffe in Texten durch farbiges Markieren oder andere Hervorhebungen kennzeichnen – wie das funktioniert, erfahren Sie in den folgenden Abschnitten.

Das Beispielformular zum Anzeigen von Texten mit beliebig hervorgehobenen Suchtreffern benötigt gar nicht viel: ein Textfeld zur Eingabe der Suchbegriffe, eine Schaltfläche zum Starten der Suche und ein ActiveX-Steuerelement namens Microsoft Webbrowser reichen bereits aus. Die drei ordnen Sie wie in Abb. 2 an und fügen dann nur noch ein paar Zeilen Code hinzu, die den Text beim Öffnen des Formulars anzeigen und nach der Eingabe von Suchbegriffen farbig markieren.

pic001.tif

Abb. 1: Text-Highlighting bei Google Groups

Zunächst einmal soll der Text überhaupt im Webbrowser-Steuerelement erscheinen. Das Formular ist so konzipiert, dass ein anderes Formular oder Modul es per VBA-Code aufrufen und ihm beim Aufruf den anzuzeigenden Text übergeben kann. Ein solcher Aufruf sähe etwa so aus:

DoCmd.OpenForm „frmTextHighlighting“, _
OpenArgs:=”<Sehr langer Text>”

Den Platzhalter <Sehr langer Text> müssen Sie natürlich noch mit dem gewünschten Text beziehungsweise einem Verweis darauf füllen. In der Beispieldatenbank finden Sie im Modul mdlTools eine Routine mit einem passenden Aufruf. Beim Öffnen des Formulars löst dieses die Ereignisprozedur Beim Öffnen aus Listing 1 aus. Diese Routine speichert den übergebenen Text zunächst in der Variablen strText. Dann füllt sie das Webbrowser-Steuerelement mit einem neuen, leeren Dokument, öffnet dieses, schreibt den übergebenen Text hinein und schließt das Dokument wieder. Zwischendurch ersetzt es noch alle Zeilenumbrüche durch das HTML-Tag <br>, das ebenfalls einem Zeilenumbruch entspricht. Anderenfalls würde das Webbrowser-Steuerelement gar keine Zeilenumbrüche anzeigen und somit die Lesbarkeit des Textes wesentlich verschlechtern.

Listing 1: Anzeigen des Formulars mit dem übergebenen Text im Webbrowser-Steuerelement

Private Sub Form_Open(Cancel As Integer)

     strText = Me.OpenArgs

     ctlWebbrowser.Navigate „about:blank“

     ctlWebbrowser.Document.Open

     ctlWebbrowser.Document.write „<span style=‘font-family:tahoma;font-size:8pt‘>“ & Replace(Nz(strText, „“), Chr(10), „<br>“) & „</span>“

     ctlWebbrowser.Document.Close

End Sub

Suchen und highlighten

Das Formular zeigt den Text nun ohne irgendwelche Markierungen an. Damit sich das ändert, kommen die übrigen Steuerelemente ins Spiel: Das Textfeld namens txtSuchbegriff enthält einen oder mehrere durch Leerzeichen getrennte Suchbegriffe und die Schaltfläche cmdSuchen löst die Routine aus Listing 2 aus und markiert damit alle Vorkommen der im Textfeld angegebenen Begriffe im Webbrowser-Steuerelement. Grundlage für die Markierung ist wiederum das in der Variablen strText zwischengespeicherte Original des übergebenen Textes. Die Routine fügt auch hier die Zeilenumbrüche hinzu und teilt dann mit der Split-Funktion alle im Textfeld txtSuchbegriffe enthaltenen Begriffe auf ein Array namens strSuchbegriffe auf. Direkt im Anschluss durchläuft eine For Next-Schleife alle Elemente des Arrays und führt dann für jeden Suchbegriff die folgenden Schritte durch:

Listing 2: Inhalte markieren und im Webbrowser-Steuerelement anzeigen

Private Sub cmdSuchen_Click()

     Dim strSuchbegriffe() As String

     Dim strTextTemp As String

     Dim strSuchbegriffTemp As String

     Dim i As Integer

     Dim lngPosStart As Long

     Dim strFarbeStart As String

     Dim strFarbeEnde As String

     strTextTemp = Replace(Nz(strText, „“), Chr(13), „<br>“)

     strSuchbegriffe() = Split(Nz(Me!txtSuchbegriffe, „“), „ „)

     For i = LBound(strSuchbegriffe) To UBound(strSuchbegriffe)

         lngPosStart = InStr(1, strTextTemp, strSuchbegriffe(i))

         Do While lngPosStart > 0

             strSuchbegriffTemp = Mid(strTextTemp, lngPosStart, Len(strSuchbegriffe(i)))

             strFarbeStart = „<span style=‘background-color:#“ & FarbeHolen(i) & „‘>“

             strFarbeEnde = „</span>“

             strTextTemp = Left(strTextTemp, lngPosStart - 1) & strFarbeStart & strSuchbegriffTemp _
& strFarbeEnde & Mid(strTextTemp, lngPosStart + Len(strSuchbegriffe(i)))

             lngPosStart = InStr(lngPosStart + Len(strFarbeStart & strSuchbegriffe(i) _
& strFarbeEnde), strTextTemp, strSuchbegriffe(i))

         Loop

     Next i

     With ctlWebbrowser

         If .Document Is Nothing Then

             .Navigate „about:blank“

         End If

         .Document.Open

         .Document.write „<span style=‘font-family:tahoma;font-size:8pt‘>“ & strTextTemp & „</span>“

         .Document.Close

     End With

End Sub

  • Ermitteln des ersten Vorkommens des Begriffs so weit, bis keine Vorkommen mehr folgen
  • Einlesen des gefundenen Textes, da dieser möglicherweise Unterschiede zum Suchbegriff bezüglich Groß-/Kleinschreibung aufweist
  • Hinzufügen der Markierung durch Einschließen dieses Textes in <span style=‘background-color:#xxxxxx>...</Span>-Tags
  • Erzeugen des neuen Textes mit markiertem Begriff durch Zusammenfügen des Originaltextes bis zum Suchbegriff, des mit den <Span>-Tags eingeschlossenen Suchbegriffs und des Originaltextes hinter dem Suchbegriff.

Diese Schritte durchläuft die Routine so lange, bis alle Vorkommen eines jeden Suchbegriffs ersetzt wurden. Abb. 2 zeigt das Endergebnis: Alle angegebenen Suchbegriffe sind sogar in unterschiedlichen Farben markiert, wofür die Routine aus Listing 3 sorgt. Diese gibt in Abhängigkeit des Index des Suchbegriffs unterschiedliche hexadezimale Farbcodes zurück – einer Anpassung der Farben steht im Übrigen nichts im Wege.

Listing 3: Farbcode holen

Private Function FarbeHolen(i As Integer) As String

     FarbeHolen = Choose(i + 1, „FF8080“, „FFFF80“, „80FF80“, „80FFFF“, „8080FF“, „FF80FF“, _
„FFc0c0“, „FFFFc0“, „c0FFc0“, „c0FFFF“, „c0c0FF“, „FFc0FF“)

End Function

pic002.tif

Abb. 2: Text-Highlighting in Access-Formularen

Kompletten Artikel lesen?

Einfach für den Newsletter anmelden, dann lesen Sie schon in einer Minute den kompletten Artikel und erhalten die Beispieldatenbanken.

E-Mail:

Download

Download

Die .zip-Datei enthält folgende Dateien:

VolltextsucheMitHighlight.mdb

Beispieldateien downloaden

© 2003-2015 André Minhorst Alle Rechte vorbehalten.