複数行テキストボックスから、指定の行だけ取得するには
今回は複数行テキストボックスから、指定の行だけ取得してみます。
キーワードは「EM_GETLINEメッセージ」と「SendMessage()関数」です。
EM_GETLINEメッセージは複数行テキストボックスから、指定の行だけ取得してくれる定数です。
SendMessage()関数は指定のウィンドウにメッセージを送ってくれる関数です。
まず、SendMessage()関数の宣言文を次のように変更します。
Declare Function SendMessageStr lib "user32.dll" Alias "SendMessageA" _
(ByVal hWnd As Long, ByVal MSG As Long, _
ByVal wParam As Long, ByVal lParam As String) As Long |
これは文字列を取得するときに使う方法です。
EM_GETLINEメッセージは、少し注意が必要です。
関数がメッセージを実行する前にバッファに確保したバイト数を
チェックする必要がありますが、SendMessage()関数のパラメータ数に
制限があるため、関数にバッファのサイズを伝えることができません。
そこで、メッセージを考えた人は、バッファの最初のワードに
コピー可能な最大バイト数を設定して使うようにしました。
そこで、サンプルではこの問題を次のように解決しています。
'バッファの最初の2バイトに最大バイト数を設定する
'第1バイトに最大バイト数の下位バイト
'第2バイトに最大バイト数の上位バイト
MidB(Buffer, 1, 1) = Chr(BufSize And &HFF)
MidB(Buffer, 2, 1) = Chr(BufSize / &H100)
|
あとは普通に関数を実行するだけです。
実行時の様子
Option Explicit
Private Sub Command1_Click()
Dim LineNumber As Long
Dim Buffer As String
Dim BufSize As Long
Dim rc As Long
LineNumber = Val(Me.Text2.Text) - 1
If LineNumber < 0 Then
LineNumber = 0
End If
BufSize = 256
Buffer = String(BufSize, vbNullChar)
MidB(Buffer, 1, 1) = Chr(BufSize And &HFF)
MidB(Buffer, 2, 1) = Chr(BufSize / &H100)
rc = SendMessageStr(Me.Text1.hWnd, EM_GETLINE, LineNumber, Buffer)
If rc Then
MsgBox Buffer, , Me.Caption
End If
End Sub
Private Sub Form_Load()
Dim i As Long
Dim temp As String, Buffer As String
Dim MSG(9) As String
MSG(1) = "---------------------------------------"
MSG(2) = "| EM_GETLINEを使ったサンプル |"
MSG(3) = "| |"
MSG(4) = "| 概要:EM_GETLINEメッセージと |"
MSG(5) = "| SendMessage()関数を使って |"
MSG(6) = "| 複数行のテキストボックスから |"
MSG(7) = "| 指定の行だけを取得する |"
MSG(8) = "| |"
MSG(9) = "---------------------------------------"
Buffer = ""
For i = 1 To 9
temp = i & "行目:" & vbTab & MSG(i) & vbCrLf
Buffer = Buffer & temp
Next
Me.Text1.Text = Buffer
End Sub
|
ダウンロード
|