Moin Leute,
ich habe jetzt öfter im Netz und auch hier mitbekommen, dass der Suche nach etwas sind, womit Sie bestimmte Zeichenfolgen wie 123 in 051234 finden und optisch hervorheben können.
Jeder kennt die Suchoption in Outlook 2010+ wo der gefundene Text kursiv und gelb hinterlegt wird, sodass man direkt sieht, was gefunden wurde.
Ich habe mich mal daran orientiert und eine Funktion geschrieben, mit der sich diese Suche auch in deinem Programm ganz leicht durchführen lässt.
Aussehen wird das ganze dann später so:
Das einzige was man dafür benötigt ist:
-Eine WindosForm
-Eine RichTextBox (RTB)
-eine Textbox (TB)
Fangen wir an:
1. Wir definieren eine Funktion, die eine RTB und eine TB als Argument erwartet:
2. Wir erzeugen eine Variable, die uns später den gefundenen String zurückgibt:
3. Sollte bereits ein Text markiert sein, dann löschen wir diese Markierung:
4.Wir möchten ja nur Text markieren, wenn wir etwas zu suchen haben:
Spoiler anzeigen
5. Nehmen wir an, wir suchen das Wort "Test" und wissen nicht, ob es groß oder klein geschrieben ist aber geben in die Suche "test" ein, so finden wir natürlich keine Übereinstimmung im
Text. Um das zu vermeiden, generieren wir 2 Variablen, die sowohl den Text der RTB als auch den Text der TB in Kleinbuchstaben umwandeln:
Spoiler anzeigen
6. Natürlich möchten wir, dass nur gesucht wird, wenn der Text unser gesuchtes Wort überhaupt findet:
Spoiler anzeigen
7. Mit der Funktion "String.IndexOf()" finden wir den 0-basierten Startindex unseres gesuchten Teilstrings. Die Funktion liefert uns allerdings nur den Index des ersten vorkommenden Treffers
zurück. Wir benötigen also eine Schleife, in der wir das wiederholen, bis wir alle Vorkommen herausfinden können und eine Liste, in der wir die entsprechenden Indexe auflisten können.
Um die Indexe auflisten zu können, benötigen wir 3 Variablen. Eine für die Länge des gesuchten Strings, eine zum hochzählen und eine die den Index zurückliefert:
Spoiler anzeigen
8. Jetzt haben wir eine Liste, in der Jeder Startindex des gesuchten Strings gelistet ist. Um jetzt jeden gefundenen String optisch zu selektieren, benötigen wir eine weitere Schleife.
In diesem Fall ist das eine For Each Schleife, die jeden Index in unserer Liste abarbeitet und den entsprechenden Bereich markiert:
Spoiler anzeigen
9. In dieser Schleife setzen wir dann solange der index nicht -1 ist den Auswahlstart(SelectionStart) an die Position des aktuellen indexes und markieren die Länge, die wir Suchen.
Wenn der markierte Text dem aus unserer Textbox entspricht, markieren wir diesen jetzt mit einer anderen Hintergrundfarbe und einer kursiven Schriftart. Beachtet werden muss dabei, dass
das Suchen in den Variablen die aus Kleinbuchstaben bestehen stattfindet:
Spoiler anzeigen
10. Aufgerufen wird die Funktion jetzt im TextChanged Ereignis der Textbox:
Beispielprojekt:
markstr.rar
Für die die es interessiert oder die diesen Ansatz nutzen möchten, hier direkt die passende DLL dazu
Steuerelement(DLL):
SearchableRTB.rar
ich habe jetzt öfter im Netz und auch hier mitbekommen, dass der Suche nach etwas sind, womit Sie bestimmte Zeichenfolgen wie 123 in 051234 finden und optisch hervorheben können.
Jeder kennt die Suchoption in Outlook 2010+ wo der gefundene Text kursiv und gelb hinterlegt wird, sodass man direkt sieht, was gefunden wurde.
Ich habe mich mal daran orientiert und eine Funktion geschrieben, mit der sich diese Suche auch in deinem Programm ganz leicht durchführen lässt.
Aussehen wird das ganze dann später so:
Das einzige was man dafür benötigt ist:
-Eine WindosForm
-Eine RichTextBox (RTB)
-eine Textbox (TB)
Fangen wir an:
1. Wir definieren eine Funktion, die eine RTB und eine TB als Argument erwartet:
2. Wir erzeugen eine Variable, die uns später den gefundenen String zurückgibt:
3. Sollte bereits ein Text markiert sein, dann löschen wir diese Markierung:
4.Wir möchten ja nur Text markieren, wenn wir etwas zu suchen haben:
VB.NET-Quellcode
5. Nehmen wir an, wir suchen das Wort "Test" und wissen nicht, ob es groß oder klein geschrieben ist aber geben in die Suche "test" ein, so finden wir natürlich keine Übereinstimmung im
Text. Um das zu vermeiden, generieren wir 2 Variablen, die sowohl den Text der RTB als auch den Text der TB in Kleinbuchstaben umwandeln:
VB.NET-Quellcode
- Public Function MarkText(ByVal RTB As RichTextBox, ByVal TB As TextBox)
- Dim strFoundText As String = ""
- RTB.SelectionStart = 0
- RTB.SelectionLength = RTB.Text.Length
- RTB.SelectionBackColor = RTB.BackColor
- RTB.SelectionFont = RTB.Font
- If TB.Text IsNot "" Then
- Dim RTBTL As String = RTB.Text.ToLower
- Dim TBTL As String = TB.Text.ToLower
- End If
- Return strFoundText
- End Function
6. Natürlich möchten wir, dass nur gesucht wird, wenn der Text unser gesuchtes Wort überhaupt findet:
VB.NET-Quellcode
- Public Function MarkText(ByVal RTB As RichTextBox, ByVal TB As TextBox)
- Dim strFoundText As String = ""
- RTB.SelectionStart = 0
- RTB.SelectionLength = RTB.Text.Length
- RTB.SelectionBackColor = RTB.BackColor
- RTB.SelectionFont = RTB.Font
- If TB.Text IsNot "" Then
- Dim RTBTL As String = RTB.Text.ToLower
- Dim TBTL As String = TB.Text.ToLower
- If RTBTL.Contains(TBTL) Then
- End If
- End If
- Return strFoundText
- End Function
7. Mit der Funktion "String.IndexOf()" finden wir den 0-basierten Startindex unseres gesuchten Teilstrings. Die Funktion liefert uns allerdings nur den Index des ersten vorkommenden Treffers
zurück. Wir benötigen also eine Schleife, in der wir das wiederholen, bis wir alle Vorkommen herausfinden können und eine Liste, in der wir die entsprechenden Indexe auflisten können.
Um die Indexe auflisten zu können, benötigen wir 3 Variablen. Eine für die Länge des gesuchten Strings, eine zum hochzählen und eine die den Index zurückliefert:
VB.NET-Quellcode
- Dim listindex As New List(Of Integer)
- Public Function MarkText(ByVal RTB As RichTextBox, ByVal TB As TextBox)
- Dim strFoundText As String = ""
- RTB.SelectionStart = 0
- RTB.SelectionLength = RTB.Text.Length
- RTB.SelectionBackColor = RTB.BackColor
- RTB.SelectionFont = RTB.Font
- If TB.Text IsNot "" Then
- Dim RTBTL As String = RTB.Text.ToLower
- Dim TBTL As String = TB.Text.ToLower
- If RTBTL.Contains(TBTL) Then
- Dim i1 As Integer = TBTL.Length
- Dim count As Integer = 0
- Dim index As Integer
- Do
- index = RTBTL.IndexOf(TBTL, index) + 1
- listindex.Add(index - 1)
- count += 1
- Loop While index > 0
- End If
- End If
- Return strFoundText
- End Function
8. Jetzt haben wir eine Liste, in der Jeder Startindex des gesuchten Strings gelistet ist. Um jetzt jeden gefundenen String optisch zu selektieren, benötigen wir eine weitere Schleife.
In diesem Fall ist das eine For Each Schleife, die jeden Index in unserer Liste abarbeitet und den entsprechenden Bereich markiert:
VB.NET-Quellcode
- Dim listindex As New List(Of Integer)
- Public Function MarkText(ByVal RTB As RichTextBox, ByVal TB As TextBox)
- Dim strFoundText As String = ""
- RTB.SelectionStart = 0
- RTB.SelectionLength = RTB.Text.Length
- RTB.SelectionBackColor = RTB.BackColor
- RTB.SelectionFont = RTB.Font
- If TB.Text IsNot "" Then
- Dim RTBTL As String = RTB.Text.ToLower
- Dim TBTL As String = TB.Text.ToLower
- If RTBTL.Contains(TBTL) Then
- Dim i1 As Integer = TBTL.Length
- Dim count As Integer = 0
- Dim index As Integer
- Do
- index = RTBTL.IndexOf(TBTL, index) + 1
- listindex.Add(index - 1)
- count += 1
- Loop While index > 0
- For Each i In listindex
- Next
- End If
- End If
- Return strFoundText
- End Function
9. In dieser Schleife setzen wir dann solange der index nicht -1 ist den Auswahlstart(SelectionStart) an die Position des aktuellen indexes und markieren die Länge, die wir Suchen.
Wenn der markierte Text dem aus unserer Textbox entspricht, markieren wir diesen jetzt mit einer anderen Hintergrundfarbe und einer kursiven Schriftart. Beachtet werden muss dabei, dass
das Suchen in den Variablen die aus Kleinbuchstaben bestehen stattfindet:
VB.NET-Quellcode
- Dim listindex As New List(Of Integer)
- Public Function MarkText(ByVal RTB As RichTextBox, ByVal TB As TextBox)
- Dim strFoundText As String = ""
- RTB.SelectionStart = 0
- RTB.SelectionLength = RTB.Text.Length
- RTB.SelectionBackColor = RTB.BackColor
- RTB.SelectionFont = RTB.Font
- If TB.Text IsNot "" Then
- Dim RTBTL As String = RTB.Text.ToLower
- Dim TBTL As String = TB.Text.ToLower
- If RTBTL.Contains(TBTL) Then
- Dim i1 As Integer = TBTL.Length
- Dim count As Integer = 0
- Dim index As Integer
- Do
- index = RTBTL.IndexOf(TBTL, index) + 1
- listindex.Add(index - 1)
- count += 1
- Loop While index > 0
- For Each i In listindex
- If i <> -1 Then
- RTB.SelectionStart = i
- RTB.SelectionLength = i1
- If RTB.SelectedText.ToLower = TBTL Then
- strFoundText = RTB.SelectedText
- RTB.SelectionBackColor = Color.Yellow
- RTB.SelectionFont = New Font(RTB.Font, FontStyle.Italic)
- End If
- End If
- Next
- End If
- End If
- Return strFoundText
- End Function
10. Aufgerufen wird die Funktion jetzt im TextChanged Ereignis der Textbox:
Beispielprojekt:
markstr.rar
Für die die es interessiert oder die diesen Ansatz nutzen möchten, hier direkt die passende DLL dazu
Steuerelement(DLL):
SearchableRTB.rar
~Wir leben zwar alle unter dem gleichen Himmel, aber es haben nicht alle den gleichen Horizont~
Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „razzzer530i“ ()