2

仕事で使用する非常に単純なスクリプト言語用の単純なコード エディターをコーディングしています。私の構文強調表示コードは、RichTextBox( rtbMain) 全体で実行すると正常に動作しますが、その行だけで動作させようとすると、rtbMain変更を加えて関数を実行できるようになり、おかしくなります。理由が分からないようです。私はこれについて正しい方法で進んでいますか?

rtbMainメインのテキストボックスです。 frmColors.lbRegExps強調表示する単語のリストボックスです (後で、もう少し強力な正規表現を使用します) frmColor.lbHexColorsは、単語に対応する 16 進数の色を含む別のリストボックスです。

Private Sub HighLight(ByVal All As Boolean)
    Dim RegExp As System.Text.RegularExpressions.MatchCollection
    Dim RegExpMatch As System.Text.RegularExpressions.Match
    Dim FirstCharIndex As Integer = rtbMain.GetFirstCharIndexOfCurrentLine
    Dim CurrentLine As Integer = rtbMain.GetLineFromCharIndex(FirstCharIndex)
    Dim CurrentLineText As String = rtbMain.Lines(CurrentLine)
    Dim CharsToCurrentLine As Integer = rtbMain.SelectionStart
    Dim PassNumber As Integer = 0

    LockWindowUpdate(Me.Handle.ToInt32) 'Let's lock the window so it doesn't scroll all crazy.
    If All = True Then 'Highlight everything.
        For Each pass In frmColors.lbRegExps.Items
            RegExp = System.Text.RegularExpressions.Regex.Matches(LCase(rtbMain.Text), LCase(pass))
            For Each RegExpMatch In RegExp
                rtbMain.Select(RegExpMatch.Index, RegExpMatch.Length)
                rtbMain.SelectionColor = ColorTranslator.FromHtml(frmColors.lbHexColors.Items(PassNumber))
            Next
            PassNumber += 1
        Next
    Else 'Highlight just that row.
        For Each pass In FrmColors.lbRegExps.Items
            RegExp = System.Text.RegularExpressions.Regex.Matches(LCase(CurrentLineText), LCase(pass))
            For Each RegExpMatch In RegExp
                rtbMain.Select(RegExpMatch.Index + (CharsToCurrentLine - RegExpMatch.Length), RegExpMatch.Length)
                rtbMain.SelectionColor = Color.Blue
            Next
        Next
    End If

    rtbMain.Select(CharsToCurrentLine, 0) 'Reset colors and positon and then unlock drawing.
    rtbMain.SelectionColor = Color.Black
    LockWindowUpdate(0)
End Sub
4

3 に答える 3

11

わかりました。テキストが実際に変更された場合にのみトリガーされると考えて、rtbMain.TextChange でイベントを呼び出していました。いやいや、フォーマットが変更された場合にもトリガーされます。そのため、最初のパスを実行してすべてを強調表示している間に何かを変更するたびに、その行が強調表示されます。変更するものがなくなるまでこれを行います。

天気のブール変数を設定して、現在強調表示されているかどうかを確認し、TextChange サブ内に if 条件を追加しました。

PS 私は自己学習者バッジを持っていないので、評価を上げていただければ幸いです :P

于 2008-11-21T23:07:03.250 に答える
2

これはあなたの質問に対する答えにはなりませんが、独自のエディターを作成する場合は、.NET 用に作成された既存のオープン ソースの作業を使用する方がよい場合があります。私はお勧めします:

Roger Alsing のSyntaxBox

于 2008-11-21T23:44:13.130 に答える
0
Private Sub HighLight(ByVal All As Boolean)
    Dim RegExp As System.Text.RegularExpressions.MatchCollection
    Dim RegExpMatch As System.Text.RegularExpressions.Match
    Dim FirstCharIndex As Integer = rtbMain.GetFirstCharIndexOfCurrentLine
    Dim CurrentLine As Integer = rtbMain.GetLineFromCharIndex(FirstCharIndex)
    Dim CurrentLineText As String = rtbMain.Lines(CurrentLine)
    Dim CharsToCurrentLine As Integer = rtbMain.SelectionStart
    Dim PassNumber As Integer = 0

    LockWindowUpdate(Me.Handle.ToInt32) ''lets lock the window so it doesnt scroll all crazy 
    If All = True Then ''highlight everything
        For Each pass In frmColors.lbRegExps.Items
            RegExp = System.Text.RegularExpressions.Regex.Matches(LCase(rtbMain.Text), LCase(pass))
            For Each RegExpMatch In RegExp
                rtbMain.Select(RegExpMatch.Index, RegExpMatch.Length)
                rtbMain.SelectionColor = ColorTranslator.FromHtml(frmColors.lbHexColors.Items(PassNumber))
            Next
            PassNumber += 1
        Next
    Else ''higlight just that row 
        For Each pass In FrmColors.lbRegExps.Items
            RegExp = System.Text.RegularExpressions.Regex.Matches(LCase(CurrentLineText), LCase(pass))
            For Each RegExpMatch In RegExp
                rtbMain.Select(RegExpMatch.Index + (CharsToCurrentLine - RegExpMatch.Length), RegExpMatch.Length)
                rtbMain.SelectionColor = Color.Blue
            Next
        Next
    End If

    rtbMain.Select(CharsToCurrentLine, 0) ''reset colors and positon and then unlock drawing
    rtbMain.SelectionColor = Color.Black
    LockWindowUpdate(0)
End Sub
于 2009-04-22T11:35:10.560 に答える