次のコードは、RichTextBox 内のテキスト バッファーを維持ReadOnlyし、最大数の文字を格納し、常に一番下までスクロールすることを目的としています。リアルタイム ログをストリーミングします。
しかし、最大文字数を維持しようとすると、rtMessages.TextLength()後で変更されrtMessages.SelectedText = String.Emptyないため、防御Ifブロックがなければ、バッファの最初の行を繰り返し削除しようとする無限ループになってしまいます。
ReadOnlyの-nessを削除するとRichTextBox、この機能は成功します。AppendText成功するので、少し奇妙に思えますが、選択が別の獣であることは理解しています。
ReadOnly RichTextBoxaをプログラムで変更できるようにすることはできますか?
Private Sub onNewData(ByRef data As String) Handles _server.clientSentData
' Add new text
rtMessages.SelectionStart = rtMessages.TextLength()
rtMessages.AppendText(data)
' Delete oldest text line-by-line until the whole buffer is shorter than MAX_TEXT_LENGTH characters
Const MAX_TEXT_LENGTH = 200
Dim textLength = rtMessages.TextLength()
While textLength > MAX_TEXT_LENGTH
Dim i As Int16 = 0
Do While rtMessages.GetLineFromCharIndex(i) < 1
i += 1
Loop
rtMessages.Select()
rtMessages.SelectionStart = 0
rtMessages.SelectionLength = i
rtMessages.SelectedText = String.Empty
rtMessages.SelectionLength = 0
If rtMessages.TextLength() = textLength Then
rtMessages.Clear()
rtMessages.AppendText("[buffer trimming algorithm failed]")
Exit While
End If
textLength = rtMessages.TextLength()
End While
' Scroll down
rtMessages.SelectionStart = rtMessages.TextLength()
rtMessages.ScrollToCaret()
End Sub