用VB快速读取TextBox第N行的数据

小歆12年前软件源码03158

TextBox 是以 vbCr+vbLf 为分行符号, 如果我们要逐一读取 TextBox 每一行, 无非是寻找 vbCr+vbLf 的所在位置, 然后取出每一行的字串, 不过这个方法不快,而且如果我们要读取第 N 行数据,还是要从第 1、2、…N-1 行逐一读起,实在麻烦。        还好 Windows API 提供有读取 TextBox 第 N 行的功能, 细节如下: 

1、API 的声明: 

Public Const EM_GETLINE = &HC4 
Public Const EM_LINELENGTH = &HC1
Public Const EM_LINEINDEX = &HBB

Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long 

Private Declare Sub RtlMoveMemory Lib "KERNEL32" (lpvDest As Any, lpvSource As Any, ByVal cbCopy As Long)

2. 程序范例: 

Sub TB_GetLine(ByVal hWnd As Long, ByVal whichLine As Long, Line As String) 

    Dim length As Long, bArr() As Byte, bArr2() As Byte, lc As Long

    lc = SendMessage(hWnd, EM_LINEINDEX, whichLine, ByVal 0&) 

    length = SendMessage(hWnd, EM_LINELENGTH, lc, ByVal 0&) 

    If length > 0 Then 
        ReDim bArr(length + 1) As Byte,bArr2(length - 1) As Byte
        Call RtlMoveMemory(bArr(0), length, 2) '准备一个存储器,传递消息之前先在存储器的前两个字节填入存储器的长度
        Call SendMessage(hWnd, EM_GETLINE,whichLine, bArr(0)) 
        Call RtlMoveMemory(bArr2(0), bArr(0), length) 
        Line = StrConv(bArr2, vbUnicode) 
    Else 
        Line = "" 
    End If 

End Sub

' 假设要读取 Text1 第 5 行的数据

Dim S As String

Call TB_GetLine( Text1.hWnd, 5, S ) 

' 传回值 S 即等于第 5 行的数据

( 注:TextBox 的行次是从 0 起算。)

       PS:站长在去掉有关bArr2的定义后,并将Line=Strconv(bArr2,vbUnicode)改为Line=StrConv(bArr,vbUnicode)发现程序照常运行,似乎bArr2在本程序中是多余的。不知哪位大虾能告知本人bArr2在这里的作用!





相关文章

C语言宏定义的用法

宏定义的用法 注意:宏定义不是函数!! 一般用来简化操作的,但又能避免函数调用那样需要进行切换环境,花费时间。例如: #define max (a,b...

VS 2017 Git failed with a fatal error的解决方案

VS 2017 Git failed with a fatal error的解决方案

问题现象这几天用刚装的VS2017写了个程序,在提交推送到Github过程中提示了“Git failed with a fatal error”错误,输出窗口的提示如下图: 解决方案经过一番折腾...

555集成电路应用800例.jpg

555集成电路应用800例(新编版)

555集成电路应用800例(新编版)        新编555集成电路应用800例电路4余例而成。本书在简要介绍时基电路5...

C# 菜单图标错位的解决办法

C# 菜单图标错位的解决办法

问题现象该问题出现在Windows高分屏的开发环境中,如果用到Checked功能,默认对号图标会出现错位的情况,如下图所示: 解决方案在用到菜单图标或Checked功能的菜单属性中,设置 Aut...

MX3205简介.png

移动电源三合一5V(1A-2A)方案

移动电源三合一5V(1A-2A)方案 & N5 F7 R0 R0 | 下载地址 & B9 n/ V$ }- w   &...

[乱码力作]VBS基础教程

教程目录 1.VBS与VB的故事 2.MsgBox的秘密 3.InputBox的技巧 4.自定义函数(一)...

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。