0

そのため、html タグを取り、残りのテキストとは異なる色を付ける関数を 1 つまたは 2 つ作成しようとしています (Visual Studio が のようなキーワードに対して行う方法と同様ですDim)。私が見つけた唯一の方法は、リッチテキストボックスを使用してから*.SelectionColor = Color.Blue、または同様のことを行うことです。これを行う他の方法はありますか?テキストボックスが更新されるたびに、すべてのhtmlタグが別の色に変更されたときにそれを読み取るようにしました。これは、非常に短い html ファイルでは問題なく機能しますが、ファイルが大きくなると、時間がかかりすぎて、選択によってカーソルが移動します。

リッチ テキスト ボックス以外のものを使用する必要がある場合でも、これを行う他の方法はありますか? そうでない場合、誰かがこれを改善する方法を見ていますか?

テキストボックスの更新時に実行される 2 つの関数を次に示します。タグは青、属性は赤、引用符内は緑です。

    '//////////////////////////////////////////////////////////////////////////
    '// findTag()
    '// -finds a tag
    '//////////////////////////////////////////////////////////////////////////
    Private Function findTag()
        Dim tag As String = ""
        Dim i As Integer = 0
        Dim startTag As Integer

        While (i < txtCurrentFile.TextLength - 1)
            If txtCurrentFile.Text(i) = "<" Then
                startTag = i
                While txtCurrentFile.Text(i) <> ">"
                    tag += txtCurrentFile.Text(i)
                    i += 1
                End While
                tag += ">"
                colorCode(startTag, tag)
                tag = ""
            End If
            i += 1
        End While
        Return Nothing
    End Function

    '//////////////////////////////////////////////////////////////////////////
    '// colorCode()
    '// -colors different tags accordingly
    '//////////////////////////////////////////////////////////////////////////
    Private Function colorCode(ByVal startIndex As Integer,
                               ByVal tag As String)
        Dim i As Integer = 0
        Dim isAttributes As Boolean = False
        Do While (tag(i) <> " " And tag(i) <> ">")
            txtCurrentFile.Select(startIndex + i, 1)
            txtCurrentFile.SelectionColor = Color.Blue
            i += 1
        Loop

        If i < tag.Length Then
            Do Until (tag(i) = ">")
                Do Until (tag(i) = Chr(34))
                    txtCurrentFile.Select(startIndex + i, 1)
                    txtCurrentFile.SelectionColor = Color.Red
                    i += 1
                Loop
                i += 1
                Do Until (tag(i) = Chr(34))
                    txtCurrentFile.Select(startIndex + i, 1)
                    txtCurrentFile.SelectionColor = Color.Purple
                    i += 1
                Loop
                i += 1
            Loop
            txtCurrentFile.Select(startIndex + i, 1)
            txtCurrentFile.SelectionColor = Color.Blue
        End If
        Return Nothing
    End Function
4

2 に答える 2

3

いくつかの提案:

  1. キャラクタースキャナーを捨てる。より高速なもの(RegEx、HTML Agility Packなど)に置き換えてください

  2. 本当に文字スキャナーを保持したい場合は、スキャンを変更の周囲の領域に制限します(たとえば、カーソルの前後200文字)

  3. カラープロセスを開始する前にカーソルの位置を覚えておき、終了したらカーソルを復元します。

  4. 別のスレッドで完全なファイルの再色付けを行うバックグラウンドカラーライザーを実装します(RTBのクローンを作成し、カラーライザーの実行中にユーザーが変更を加えていない場合にのみ変更を適用する必要があります)。

于 2013-03-14T18:34:34.043 に答える
2

...これがまったく機能するかどうかはわかりません!!!しかし、機能した場合はクールになる可能性があります...

おそらく、webbrowser コントロールでファイルを開き、CSS シートでカラーリング ルールを設定しますか??

繰り返しますが、これが良いアイデアかどうかはわかりませんが、扱っているのは既に HTML であるため、非常にうまく機能する可能性があります...

于 2013-03-14T18:41:31.970 に答える