Это решение не работает, потому что при непрерывном вводе оно будет рассматриваться как 1 строка независимо от количества строк, отображаемых на экране.
Чтобы разрешить то же самое, вам нужно использовать API SendMessage для подсчета количества строк, которые вы видите на экране. Вот код.
Private Declare Function SendMessageINT Lib "user32" Alias "SendMessageA" _
(ByVal hwnd As IntPtr, ByVal wMsg As Integer, ByVal wParam As Integer, ByVal lParam As Integer) As Integer
Private Const EM_GETLINECOUNT = &HBA
Private Sub txtText1_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles txtText1.KeyPress
Const MAX_LINES = 13
Dim lngCount As Long
lngCount = SendMessageINT(txtText1.Handle, EM_GETLINECOUNT, 0, 0)
If lngCount = MAX_LINES And Asc(e.KeyChar) <> Keys.Back And Asc(e.KeyChar) <> Keys.Delete Then
e.Handled = True
End If
End Sub
Наряду с этим вам необходимо выяснить положение курсора в текстовом поле, чтобы вы могли позволить пользователю печатать. В предыдущем коде, когда он достигнет 13 строк, пользователь не сможет набрать ни одной строки. Чтобы преодолеть это, вы должны выяснить, в какой строке находится курсор. Используйте приведенный ниже код для этого.
Объявите это вместе с декларацией API
Private Const EM_LINEFROMCHAR = & HC9
Ниже код должен быть помещен в события MouseDown, MouseUp, KeyDown и KeyUp текстового поля.
intLineNo = SendMessageINT (txtText1.Handle, EM_LINEFROMCHAR, -1, 0 &) + 1
После обнаружения LineNo вы можете выполнить оценку в событии KeyPress TextBox.