Suchen in Textfeldern

Das Suchen nach Texten in Memofeldern funktioniert in Access tadellos – wenn auch nicht besonders schnell, da der Inhalt von Memofeldern nicht indiziert werden kann. Hat man aber einmal den gewünschten Datensatz gefunden, steht man vor dem nächsten Problem: Wie kommt man nun zur passenden Textstelle Dies ist ganz einfach: Sie schauen sich die Lösung in diesem Beitrag an.

Manchmal sucht man auch gar nicht erst nach dem Datensatz, dessen Memofeld den passenden Text enthält, weil man genau weiß, wo sich dieser befindet. Dies ist etwa bei der Vertragsverwaltung aus [1] der Fall, bei der man den passenden Vertragsdatensatz schon herausgesucht hat und nur noch eine bestimmte Textstelle im Vertragstext sucht.

Da das dortige Formular zur Erfassung und Bearbeitung von Verträgen bereits mit ausreichend Steuerelementen gesegnet ist, wird die Anzeige der Vertragstexte in ein eigenes Formular ausgelagert – etwa in jenes aus Bild 1.

pic001.tif

Bild 1: Das Formular zum Durchsuchen von Texten

Ein solches Formular sollte ein Eingabefeld zum Erfassen des Suchbegriffs sowie eine Schaltfläche zum Starten des Suchvorgangs sowie eine Möglichkeit zum Fortsetzen des Suchvorgangs nach der ersten gefundenen Textstelle besitzen.

Im Beispiel erledigt eine Schaltfläche mit der Beschriftung Weitersuchen diese Aufgabe.

Bevor es zur eigentlichen Suche geht, soll das Formular mit den Steuerelementen sowie ein wenig Komfort ausgestattet werden: Wenn Sie in diesem Formular nicht in langen Texten suchen wollten, brauchten Sie kein solches Formular, also soll der Benutzer auch eine Menge Text sehen können. Möglichst so viel, wie auf seinen Monitor passt oder wie er gerade sehen möchte. Das bedeutet, dass der Benutzer das Formular sowie das enthaltene Textfeld anpassen können soll.

Da die anderen Steuerelemente nicht von der Größenänderung betroffen sind, packen Sie diese am besten in den Kopfbereich des Formulars und das Textfeld in den Detailbereich, sodass die Entwurfsansicht wie in Bild 2 aussieht.

pic002.tif

Bild 2: Die Entwurfsansicht des Suchformulars

Fehlt nur noch ein kleine Routine, die beim ändern der Größe des Formulars das Textfeld anpasst. Diese finden Sie in Listing 1: Die Routine verwendet die Eigenschaft InsideHeight des Formulars, um dessen Gesamthöhe zu ermitteln, und zieht die Höhe des Kopfbereichs ab.

Listing 1: Diese Routine passt die Größe des Textfeldes dem übergeordneten Formular an.

Private Sub Form_Resize()
     If Me.InsideHeight - Me.Formularkopf.Height > 150 Then
         Me!txtInhalt.Height = _
Me.InsideHeight - Me.Formularkopf.Height - 150 End If Me!txtInhalt.Width = Me.Form.InsideWidth - 150 End Sub

Ist dieser größer als ein bestimmter Wert, der vom Abstand des Textfeldes von den Formularrändern abhängt, passt die Routine die Höhe des Textfeldes um eben die um den Rand reduzierte Höhe an.

Bei der Breite ist dies nicht nötig: Hier muss mit Ausnahme des Abstands kein weiterer Bereich links oder rechts vom Textfeld berücksichtigt werden, sodass die Textfeldbreite der um den Wert 150 verminderten Formularbreite entspricht.

Jedesmal, wenn der Benutzer die Größe des Formulars verändert, ruft er damit diese Routine auf und passt die Größe des Textfeldes damit automatisch an. Wenn Sie selbst ein ähnliches Formular erstellen, müssen Sie noch prüfen, wie groß die vorhandenen Abstände zwischen Textfeld und oberem und unterem Rand sowie linkem und rechtem Rand sind, und die Summen der jeweiligen Paare von Höhe und Breite subtrahieren. Die Abstände bekommen Sie am einfachsten heraus, indem Sie etwa in der Ereignisprozedur Beim öffnen folgende Zeilen einfügen (jeweils in einer Zeile):

Debug.Print "Seitlicher Rand: " 
& Me.InsideWidth - Me.txtInhalt.Width Debug.Print "Vertikaler Rand: "
& Me.InsideHeight - Me.Formularkopf.Height - Me!txtInhalt.Height

Falls Sie auch den Fußbereich des Formulars verwenden möchten, müssen Sie natürlich auch noch dessen Höhe subtrahieren.

Startvorbereitungen

Beim öffnen des Formulars sollen drei Dinge geschehen: Das Textfeld soll mit dem gewünschten Text gefüllt werden, es soll nicht der gesamte Inhalt des Textfeldes markiert sein (das kann bei bestimmten Einstellungen vorkommen – etwa, wenn der Benutzer die Option Cursorverhalten bei Eintritt in Feld auf Ganzes Feld markieren eingestellt hat) und die Schaltfläche cmdWeitersuchen soll deaktiviert sein – ihr Auftritt kommt später.

All dies erledigt die Routine aus Listing 2: Zunächst weist sie dem Textfeld den Inhalt der Funktion OpenArgs zu. Diese liefert eine per DoCmd.OpenForm übergebene Zeichenkette. Ein passender Aufruf sähe etwa so aus (hier mit dem Inhalt des Felds Textinhalt des ersten Datensatzes der Tabelle tblTexte, siehe auch Beispieldatenbank):

DoCmd.OpenForm 
"frmInhalt",
OpenArgs:=
DLookup("Textinhalt",
"tblTexte")

Dann legt sie den Fokus auf das Textfeld, um anschließend die Einfügemarke durch Setzen der Eigenschaft SelStart auf 0 an den Anfang des Textfeldes zu verschieben. Schließlich deaktiviert die Routine die Weitersuchen-Schaltfläche wie in Bild 3.

pic003.tif

Ende des frei verfügbaren Teil. Wenn Du mehr lesen möchtest, hole Dir ...

den kompletten Artikel im PDF-Format mit Beispieldatenbank

diesen und alle anderen Artikel mit dem Jahresabo

Schreibe einen Kommentar