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 起算。)