テキストボックスの現在の行数を調べるには

テキストボックスの現在の行数を調べてみます。
キーワードは「SendMessage()関数」です。
SendMessage()関数はウィンドウに対して、あるメッセージを送ります。
そのメッセージはウィンドウの種類ややりたいことによって変わってきますが、
今回はその中のテキストボックスに関するメッセージを送る事によって、現在の行数を調べます。

送るメッセージは「EM_LINEFROMCHAR」です。
このメッセージは指定の文字インデックスが含まれる行番号を返してくれます。
wParam=-1にすると、現在キャレット(テキストカーソル)のある行番号を返してくれます。
APIの中では一番上の行が「0」になっているので、+1を加えています。

実行中の様子

'メッセージを送る
Private Declare Function SendMessage Lib "user32.dll" Alias "SendMessageA" _
    (ByVal hWnd As Long, ByVal dwMessage As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
'テキストボックス関係のメッセージ(一部)
Private Const EM_GETLINECOUNT = &HBA                    'テキストの行数を取得する
Private Const EM_LINEINDEX = &HBB                       '指定の行の先頭の文字インデックスを取得する
Private Const EM_LINEFROMCHAR = &HC9                    '指定の文字インデックスを含むインデックスを取得する

Private Sub Form_Load() Me.Label2(0).Caption = "" Me.Label2(1).Caption = "" End Sub
Private Sub Text1_KeyUp(KeyCode As Integer, Shift As Integer) Dim rc, cnt If KeyCode = vbKeyUp Or KeyCode = vbKeyDown Or vbKeyReturn Then 'キャレットが移動した cnt = SendMessage(Me.Text1.hWnd, EM_GETLINECOUNT, -1, 0) 'テキストの行数を取得する rc = SendMessage(Me.Text1.hWnd, EM_LINEFROMCHAR, -1, 0) + 1 '現在の行番号を取得 Me.Label2(0).Caption = rc & " / " & cnt & "行目" End If End Sub
Private Sub Text1_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single) 'キャレットが移動した cnt = SendMessage(Me.Text1.hWnd, EM_GETLINECOUNT, -1, 0) 'テキストの行数を取得する rc = SendMessage(Me.Text1.hWnd, EM_LINEFROMCHAR, -1, 0) + 1 '現在の行番号を取得 Me.Label2(0).Caption = rc & " / " & cnt & "行目" End Sub
ダウンロード