2013-10-14 76 views
0

我做了這個通用函數來在RichTextBox中添加一個'FindNext'功能。RichTextBox,'查找以前的'功能

#Region " FindNext In RichTextBox " 

' [ FindNext In RichTextBox Function ] 
' 
' //By Elektro [email protected] 
' 
' Examples : 
' 
' RichTextBox1.Text = "Hello World!, Hello World!, Hello World!" 
' FindNext(RichTextBox1, "Hello") 

' FindNext 
Private Sub FindNext(ByVal [Control] As RichTextBox, _ 
        ByVal SearchText As String, _ 
        Optional ByVal Highlight_BackColor As Color = Nothing, _ 
        Optional ByVal Highlight_ForeColor As Color = Nothing) 

    ' Start searching at 'SelectionStart'. 
    Dim Search_StartIndex As Integer = [Control].SelectionStart 
    Static Next_Count As Integer = 0 

    ' Restore Highlight colors of previous selection 
    [Control].SelectionBackColor = [Control].BackColor 
    [Control].SelectionColor = [Control].ForeColor 

    ' Set next selection Highlight colors 
    If Highlight_BackColor = Nothing Then Highlight_BackColor = [Control].BackColor 
    If Highlight_ForeColor = Nothing Then Highlight_ForeColor = [Control].ForeColor 

    ' If is not first FindNext call then... 
    If Next_Count <> 0 Then 
     Search_StartIndex += SearchText.Length 
    Else ' If is first FindNext call then... 
     Next_Count += 1 
    End If 

    ' Set Search_StartIndex 
    Search_StartIndex = _ 
    [Control].Find(SearchText, Search_StartIndex, RichTextBoxFinds.NoHighlight Or RichTextBoxFinds.None) 
    ' ...And prevent search at End Of File 
    If Search_StartIndex = -1 Then 
     Search_StartIndex = _ 
     [Control].Find(SearchText, 0, RichTextBoxFinds.NoHighlight Or RichTextBoxFinds.None) 
    End If 

    ' Set the match selection 
    [Control].Select(Search_StartIndex, SearchText.Length) 
    ' Set the BackColor 
    [Control].SelectionBackColor = Highlight_BackColor 
    ' Set the ForeColor 
    [Control].SelectionColor = Highlight_ForeColor 
    ' Scroll to Caret/Cursor position 
    [Control].ScrollToCaret() 

End Sub 

#End Region 

如何編寫'查找上一個'功能?

我想我可以使用RegEx MatchCollection輕鬆添加「查找下一個」或「查找上一個」,通過移動集合的當前正則表達式匹配索引,但正則表達式很慢,我有其他選擇使用簡單的字符串搜索?

回答

0

最後,我可以用我自己做的,是的,它採用RegularExpressions:

http://www.youtube.com/watch?v=mWRMdlC5DH8

#Region " [RichTextBox] FindNext " 

    ' [ FindNext ] 
    ' 
    ' //By Elektro [email protected] 
    ' 
    ' Examples : 
    ' 
    ' RichTextBox1.Text = "Hello World!, Hello World!, Hello World!" 
    ' 
    ' FindNext(RichTextBox1, "hello", FindDirection.Down, RegexOptions.IgnoreCase, Color.LightBlue, Color.Black) 
    ' FindNext(RichTextBox1, "hello", FindDirection.Up, RegexOptions.IgnoreCase, Color.Red, Color.Black) 
    ' 
    ' Private Sub RichTextBox_Enter(sender As Object, e As EventArgs) ' Handles RichTextBox1.Enter 
    ' ' Restore Selection Colors before search next match. 
    ' sender.SelectionBackColor = DefaultBackColor 
    ' sender.SelectionColor = DefaultForeColor 
    ' End Sub 

    Public Enum FindDirection As Short 
     Up = 0 
     Down = 1 
    End Enum 

    ' FindNext 
    Private Sub FindNext(ByVal [Control] As RichTextBox, _ 
           ByVal SearchText As String, _ 
           ByVal Direction As FindDirection, _ 
           Optional ByVal IgnoreCase As System.Text.RegularExpressions.RegexOptions = RegexOptions.None, _ 
           Optional ByVal Highlight_BackColor As Color = Nothing, _ 
           Optional ByVal Highlight_ForeColor As Color = Nothing) 

     If [Control].TextLength = 0 Then Exit Sub 

     ' Start searching at 'SelectionStart'. 
     Dim Search_StartIndex As Integer = [Control].SelectionStart 

     ' Stores the MatchIndex count 
     Dim matchIndex As Integer = 0 

     ' Flag to check if it's first find call 
     Static First_Find As Boolean = True 

     ' Checks to don't ommit the selection of first match if match index is exactly at 0 start point. 
     If First_Find _ 
      AndAlso Search_StartIndex = 0 _ 
      AndAlso Direction = FindDirection.Down Then 
      Search_StartIndex = -1 
      First_Find = False 
     ElseIf Not First_Find _ 
      AndAlso Search_StartIndex = 0 _ 
      AndAlso Direction = FindDirection.Down Then 
      First_Find = False 
      Search_StartIndex = 0 
     End If 

     ' Store the matches 
     Dim matches As System.Text.RegularExpressions.MatchCollection = _ 
      System.Text.RegularExpressions.Regex.Matches([Control].Text, _ 
                 SearchText, _ 
                 IgnoreCase Or If(Direction = FindDirection.Up, _ 
                      RegexOptions.RightToLeft, _ 
                      RegexOptions.None)) 

     If matches.Count = 0 Then First_Find = True : Exit Sub 

     ' Restore Highlight colors of previous selection 
     [Control].SelectionBackColor = [Control].BackColor 
     [Control].SelectionColor = [Control].ForeColor 

     ' Set next selection Highlight colors 
     If Highlight_BackColor = Nothing Then Highlight_BackColor = [Control].BackColor 
     If Highlight_ForeColor = Nothing Then Highlight_ForeColor = [Control].ForeColor 

     ' Set the match selection 
     For Each match As System.Text.RegularExpressions.Match In matches 

      matchIndex += 1 

      Select Case Direction 

       Case FindDirection.Down 
        If match.Index > Search_StartIndex Then ' Select next match 
         [Control].Select(match.Index, match.Length) 
         Exit For 
        ElseIf match.Index <= Search_StartIndex _ 
        AndAlso matchIndex = matches.Count Then ' Select first match 
         [Control].Select(matches.Item(0).Index, matches.Item(0).Length) 
         Exit For 
        End If 

       Case FindDirection.Up 
        If match.Index < Search_StartIndex Then ' Select previous match 
         [Control].Select(match.Index, match.Length) 
         Exit For 
        ElseIf match.Index >= Search_StartIndex _ 
        AndAlso matchIndex = matches.Count Then ' Select last match 
         [Control].Select(matches.Item(0).Index, matches.Item(0).Length) 
         Exit For 
        End If 

      End Select 

     Next match 

     ' Set the current selection BackColor 
     [Control].SelectionBackColor = Highlight_BackColor 
     ' Set the current selection ForeColor 
     [Control].SelectionColor = Highlight_ForeColor 
     ' Scroll to Caret/Cursor selection position 
     [Control].ScrollToCaret() 

    End Sub 

#End Region