複数行テキストボックスから、指定の行だけ取得するには

今回は複数行テキストボックスから、指定の行だけ取得してみます。
キーワードは「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
    
    '1行分のテキストを格納できるサイズを確保
    BufSize = 256
    Buffer = String(BufSize, vbNullChar)
    
    'バッファの最初の2バイトに最大バイト数を設定する
    '第1バイトに最大バイト数の下位バイト
    '第2バイトに最大バイト数の上位バイト
    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
ダウンロード