Wort unter dem Cursor in einer RichTextBox ermitteln

Beschreibung
Eine RichTextBox bietet verschiedene Möglichkeiten an, um ein Zeichen oder einen Index an einer bestimmten Position zu ermitteln. Für VB.NET gibt es allerdings keine vorhandene Methode das gesamte Wort unter dem Cursor zu ermitteln. Man muss sich hierfür selbst eine Methode schreiben. In diesem Tipp wird eine solche Methode bereitgestellt.
Dafür erstellen wir uns zunächst eine Klasse, die von RichTextBox erbt und ergänzen sie mit folgender Methode:
VBC#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
''' <summary>
''' Ruft das Wort ab, dass der angegebenen Position am nächsten liegt.
''' </summary>
''' <param name="pt">Die zu suchende Position.</param>
''' <returns>Das Wort an der angegebenen Position.</returns>
''' <remarks></remarks>
Public Function GetWordFromPosition(pt As Point) As String
    ' Index des Zeichens unter dem Cursor finden
    Dim currentIndex As Integer = Me.GetCharIndexFromPosition(pt)
    Dim startIndex As Integer = 0
    Dim endIndex As Integer = Me.TextLength
 
    ' Index des ersten Zeichens vom aktuellen Wort finden
    For i As Integer = currentIndex To 0 Step -1
        If Not Char.IsLetter(Me.Text(i)) Then
            startIndex = i + 1
            Exit For
        End If
    Next
 
    ' Index des letzten Zeichens vom aktuellen Wort finden
    For i As Integer = startIndex To Me.TextLength - 1
        If Not Char.IsLetter(Me.Text(i)) Then
            endIndex = i
            Exit For
        End If
    Next
 
    ' Wort zurückgeben
    Return Me.Text.Substring(startIndex, endIndex - startIndex)
End Function
1
Kein Code vorhanden
Nun könnten wir beispielsweise einen ToolTip an der Stelle des Wortes anzeigen lassen. Das würde dann wie folgt aussehen:
VBC#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
Class RichTextBoxEx
    Inherits RichTextBox
 
    Private myToolTip As ToolTip
    Private lastPosition As Point
 
    ''' <summary>
    ''' Initialisiert eine neue Instanz der RichTextBoxEx-Klasse.
    ''' </summary>
    ''' <remarks></remarks>
    Public Sub New()
        myToolTip = New ToolTip
 
        myToolTip.ToolTipTitle = "Das aktuelle Wort"
        myToolTip.ToolTipIcon = ToolTipIcon.Info
        myToolTip.UseFading = False
    End Sub
 
    ''' <summary>
    ''' Ruft das Wort ab, dass der angegebenen Position am nächsten liegt.
    ''' </summary>
    ''' <param name="pt">Die zu suchende Position.</param>
    ''' <returns>Das Wort an der angegebenen Position.</returns>
    ''' <remarks></remarks>
    Public Function GetWordFromPosition(pt As Point) As String
        ' Index des Zeichens unter dem Cursor finden
        Dim currentIndex As Integer = Me.GetCharIndexFromPosition(pt)
        Dim startIndex As Integer = 0
        Dim endIndex As Integer = Me.TextLength
 
        ' Nothing zurückgeben, wenn aktuelles Zeichen nicht zum Wort gehört
        If Not IsValidChar(Me.Text(currentIndex)) Then Return Nothing
 
        ' Nothing zurückgeben, wenn kein Text vorhanden ist
        If endIndex = 0 Then Return Nothing
 
        ' Index des ersten Zeichens vom aktuellen Wort finden
        For i As Integer = currentIndex To 0 Step -1
            If Not IsValidChar(Me.Text(i)) Then
                startIndex = i + 1
                Exit For
            End If
        Next
 
        ' Nothing zurückgeben, wenn Ende erreicht
        If startIndex = Me.TextLength Then Return Nothing
 
        ' Index des letzten Zeichens vom aktuellen Wort finden
        For i As Integer = startIndex To Me.TextLength - 1
            If Not IsValidChar(Me.Text(i)) Then
                endIndex = i
                Exit For
            End If
        Next
 
        ' Wort zurückgeben
        Return Me.Text.Substring(startIndex, endIndex - startIndex)
    End Function
 
    ''' <summary>
    ''' Gibt einen Wert zurück, der angibt, ob das angegebene Zeichen zum Wort gehört.
    ''' </summary>
    ''' <param name="c">Das zu prüfende Zeichen.</param>
    ''' <returns>true, wenn das Zeichen zum Wort gehört, ansonsten false.</returns>
    ''' <remarks></remarks>
    Private Function IsValidChar(c As Char) As Boolean
        Return Char.IsLetter(c)
    End Function
 
    Protected Overrides Sub OnMouseMove(e As System.Windows.Forms.MouseEventArgs)
        ' Aktuelles Wort ermitteln
        Dim currentWord As String = GetWordFromPosition(e.Location)
 
        ' Prüfe, ob die Position geändert wurde
        If Not lastPosition.Equals(e.Location) Then
            ' true -> Wort als ToolTip anzeigen und aktuelle Position speichern
            If currentWord IsNot Nothing Then
                myToolTip.Show(currentWord, Me)
                lastPosition = e.Location
            Else
                myToolTip.Hide(Me)
            End If
        End If
 
        MyBase.OnMouseMove(e)
    End Sub
End Class
 
 
1
Kein Code vorhanden