Какую стратегию применить чтобы добавлять строки в TextBox, и количество символов или строк не превышало, например, 10000, а верхние (старые) строки удалялись? При этом не должно быть дерганья вертикального ScrollBar.
Теперь объясню.
В своих проектах часто использую процедуру Public Sub PutLog(ByVal intxtLog As String), которая выводит какой то "лог" в TextBox с добавление новых строк.
Раньше я делал так:
- Код: Выделить всё
TextBox_Log.Text = TextBox_Log.Text & vbNewLine & intxtLog
TextBox_Log.SelStart = Len(TextBox_Log.Text)
Потом начал делать через API:
- Код: Выделить всё
'Добавляю новый лог
txtLen = SendMessage(TextBox_hwnd, WM_GETTEXTLENGTH, 0, 0) + 1
SendMessage TextBox_hwnd, EM_SETSEL, txtLen, txtLen
SendMessage TextBox_hwnd, EM_REPLACESEL, False, ByVal intxtLog
'Удаляю символы сверху
txtLen = SendMessage(TextBox_hwnd, WM_GETTEXTLENGTH, 0, ByVal 0&) + 1
If txtLen > 10000 Then
SendMessage TextBox_hwnd, EM_SETSEL, ByVal CLng(0), ByVal CLng(txtLen - 10000)
'SendMessage TextBox_hwnd, WM_CLEAR, ByVal 0&, ByVal 0&
SendMessage TextBox_hwnd, EM_REPLACESEL, False, ByVal "" ' & vbNewLine
End If
Так вот.
Первое: Почему то, я так и не разобрался, не срабатывает WM_CLEAR, поэтому временно использую EM_REPLACESEL.
Второе: чтобы удалить символы сверху приходится сначала выделить их (EM_SETSEL), и удалить (WM_CLEAR - почему-то не работает, поэтому пока EM_REPLACESEL). Из-за этого происходит дерганье вертикального ScrollBar.
Прошу помощи в этом вопросе. Как выделять текст не по кол-ву символов, а по кол-ву строку (EM_GETLINECOUNT), и удалять текст, чтобы не перемещался фокус вслед за кареткой?