在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
如何解决该问题?
展开
 我来答
一念春风十里不如你
2015-10-03 · TA获得超过1536个赞
知道小有建树答主
回答量:2560
采纳率:68%
帮助的人:284万
展开全部
'获得光标位置(按字节计算,起如行和起始列均为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 & " 列"
然后去远足
2013-08-08 · TA获得超过1万个赞
知道大有可为答主
回答量:4016
采纳率:83%
帮助的人:2356万
展开全部
首先,题主要明确这并不是你的程序出了什么问题,题主贴出的代码是检测 Text1.Text 中包含多少个 vbCrlf(即回车符)的,倘若 Text1.Text 某一行字符过长,在末尾处“折叠”到了下一行,其实准确的来说,在系统看来这仍然是一行字,因为系统识别两行字就是判断有无回车符或换行符(在C语言里面就是 \n),所谓的“多行”是题主肉眼识别出来的。

可以考虑用计算字符宽度和 Text1 的宽度来计算“每行”能容纳多少个字符,然后总字符数除以单位容纳字符数就时所谓的"行数"了。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
crazy0qwer
2013-08-08 · TA获得超过3299个赞
知道大有可为答主
回答量:4020
采纳率:71%
帮助的人:1267万
展开全部
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
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
ct543
2013-08-08 · 知道合伙人互联网行家
ct543
知道合伙人互联网行家
采纳数:624 获赞数:2135
2000年接触计算机;2002年接触互联网并开始学习黑客技术;有多年编程开发经验以及信息安全项目实践经验。

向TA提问 私信TA
展开全部
自动换行的情况并不会生成vbcrlf符号。
只有按了回车键才会有vbcrlf符号。所以你用split分割vbcrlf当然只能得到1的结果。

对于自动换行的内容,不能算是多行,只算一行。如果非要计算行数,要结合字符宽度和文本框的宽度来计算了。
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式