次のコードは、RichTextBox 内のテキスト バッファーを維持ReadOnly
し、最大数の文字を格納し、常に一番下までスクロールすることを目的としています。リアルタイム ログをストリーミングします。
しかし、最大文字数を維持しようとすると、rtMessages.TextLength()
後で変更されrtMessages.SelectedText = String.Empty
ないため、防御If
ブロックがなければ、バッファの最初の行を繰り返し削除しようとする無限ループになってしまいます。
ReadOnly
の-nessを削除するとRichTextBox
、この機能は成功します。AppendText
成功するので、少し奇妙に思えますが、選択が別の獣であることは理解しています。
ReadOnly
RichTextBox
aをプログラムで変更できるようにすることはできますか?
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