在VB中如何获取TextBox的行数?
TextBox的MultiLine=True,按钮代码如下:PrivateSubCommand1_Click()Dimhs()AsStringhs=Split(Text1...
TextBox的MultiLine=True,按钮代码如下:
Private Sub Command1_Click()
Dim hs() As String
hs = Split(Text1.Text, vbCrLf)
MsgBox UBound(hs) + 1
End Sub
但如果在Text中一直按着某个键使其自动换行时,单击按钮的最终结果总是1
如何解决该问题? 展开
Private Sub Command1_Click()
Dim hs() As String
hs = Split(Text1.Text, vbCrLf)
MsgBox UBound(hs) + 1
End Sub
但如果在Text中一直按着某个键使其自动换行时,单击按钮的最终结果总是1
如何解决该问题? 展开
4个回答
展开全部
'获得光标位置(按字节计算,起如行和起始列均为0)
Private Function GetCurPos(ptPos As POINTAPI) As Long
Dim nLine As Long, nCol As Long
Call SendMessage(Me.Text1.hwnd, EM_GETSEL, 0, ptPos)
nLine = SendMessage(Me.Text1.hwnd, EM_LINEFROMCHAR, ptPos.x, ByVal 0&) '获得行号
nCol = ptPos.x - SendMessage(Me.Text1.hwnd, EM_LINEINDEX, -1, 0) '获得列号
GetCurPos = ptPos.x '光标位置(按字节计算)
ptPos.y = nLine
ptPos.x = nCol
End Function
'获得光标位置(按字符计算)
Private Function GetCurPosCh(ptPos As POINTAPI) As Long
Dim nLine As Long, nCol As Long
Dim ByteBuffer() As Byte
SendMessage Me.Text1.hwnd, EM_GETSEL, 0, ptPos
nLine = SendMessage(Me.Text1.hwnd, EM_LINEFROMCHAR, ptPos.x, ByVal 0&) '获得行号
nCol = ptPos.x - SendMessage(Me.Text1.hwnd, EM_LINEINDEX, -1, 0)
ReDim ByteBuffer(1024)
ByteBuffer(1) = 4
SendMessage Me.Text1.hwnd, EM_GETLINE, nLine, ByteBuffer(0)
ReDim Preserve ByteBuffer(nCol)
nCol = Len(StrConv(ByteBuffer, vbUnicode)) - 1 '获得列号
GetCurPosCh = Me.Text1.SelStart '光标位置(按字符计算)
ptPos.y = nLine + 1
ptPos.x = nCol + 1
Erase ByteBuffer
End Function
Call GetCurPosCh(ptPos)
GetTextInfo = " 第 " & ptPos.y & " 行 , 第 " & ptPos.x & " 列"
Private Function GetCurPos(ptPos As POINTAPI) As Long
Dim nLine As Long, nCol As Long
Call SendMessage(Me.Text1.hwnd, EM_GETSEL, 0, ptPos)
nLine = SendMessage(Me.Text1.hwnd, EM_LINEFROMCHAR, ptPos.x, ByVal 0&) '获得行号
nCol = ptPos.x - SendMessage(Me.Text1.hwnd, EM_LINEINDEX, -1, 0) '获得列号
GetCurPos = ptPos.x '光标位置(按字节计算)
ptPos.y = nLine
ptPos.x = nCol
End Function
'获得光标位置(按字符计算)
Private Function GetCurPosCh(ptPos As POINTAPI) As Long
Dim nLine As Long, nCol As Long
Dim ByteBuffer() As Byte
SendMessage Me.Text1.hwnd, EM_GETSEL, 0, ptPos
nLine = SendMessage(Me.Text1.hwnd, EM_LINEFROMCHAR, ptPos.x, ByVal 0&) '获得行号
nCol = ptPos.x - SendMessage(Me.Text1.hwnd, EM_LINEINDEX, -1, 0)
ReDim ByteBuffer(1024)
ByteBuffer(1) = 4
SendMessage Me.Text1.hwnd, EM_GETLINE, nLine, ByteBuffer(0)
ReDim Preserve ByteBuffer(nCol)
nCol = Len(StrConv(ByteBuffer, vbUnicode)) - 1 '获得列号
GetCurPosCh = Me.Text1.SelStart '光标位置(按字符计算)
ptPos.y = nLine + 1
ptPos.x = nCol + 1
Erase ByteBuffer
End Function
Call GetCurPosCh(ptPos)
GetTextInfo = " 第 " & ptPos.y & " 行 , 第 " & ptPos.x & " 列"
展开全部
首先,题主要明确这并不是你的程序出了什么问题,题主贴出的代码是检测 Text1.Text 中包含多少个 vbCrlf(即回车符)的,倘若 Text1.Text 某一行字符过长,在末尾处“折叠”到了下一行,其实准确的来说,在系统看来这仍然是一行字,因为系统识别两行字就是判断有无回车符或换行符(在C语言里面就是 \n),所谓的“多行”是题主肉眼识别出来的。
可以考虑用计算字符宽度和 Text1 的宽度来计算“每行”能容纳多少个字符,然后总字符数除以单位容纳字符数就时所谓的"行数"了。
可以考虑用计算字符宽度和 Text1 的宽度来计算“每行”能容纳多少个字符,然后总字符数除以单位容纳字符数就时所谓的"行数"了。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
Const EM_GETLINECOUNT = 186
Private Declare Function SendMessageAsLong Lib "user32" _
Alias "SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, _
ByVal wParam As Long, ByVal lParam As Long) As Long
Private Sub Command1_Click()
Dim lCount As Long
lCount = SendMessageAsLong(Text1.hWnd, EM_GETLINECOUNT, 0, 0)
MsgBox lCount
End Sub
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
2013-08-08 · 知道合伙人互联网行家
关注
展开全部
自动换行的情况并不会生成vbcrlf符号。
只有按了回车键才会有vbcrlf符号。所以你用split分割vbcrlf当然只能得到1的结果。
对于自动换行的内容,不能算是多行,只算一行。如果非要计算行数,要结合字符宽度和文本框的宽度来计算了。
只有按了回车键才会有vbcrlf符号。所以你用split分割vbcrlf当然只能得到1的结果。
对于自动换行的内容,不能算是多行,只算一行。如果非要计算行数,要结合字符宽度和文本框的宽度来计算了。
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询