エディットボックスの行数・文字数を取得 <TOP>
マルチラインエディットボックスの行数を取得します。
SendMessage ウィンドウにメッセージを送信
EM_GETLINECOUNT(&HBA) マルチラインエディットボックスの行数を取得
EM_LINEFROMCHAR(&HC9) 文字インデックスから行番号を取得する
カーソル位置を直接取得(GETLINECOUNT)、インデックスから行番号を取得(LINEFROMCHAR)
文字数取得を加えました。(改行は半角換算2文字加算されます)
'================================================================ '= 行数・文字数を取得する
'= (GetLineCount.bas) '================================================================ #include "Windows.bi" ' ウィンドウにメッセージを送信。この関数は、指定したウィンドウのウィンドウプロシージャが処理を終了するまで制御を返さない Declare Function Api_SendMessage& Lib "user32" Alias "SendMessageA" (ByVal hWnd&, ByVal wMsg&, ByVal wParam&, lParam As Any) #define EM_GETLINECOUNT &HBA 'MLE内の行数を取得する #define EM_LINEINDEX &HBB 'MLEの行の文字インデックスを取得する #define EM_LINELENGTH &HC1 'MLE内の行の長さを取得する Var Shared Edit1 As Object Var Shared Text1 As Object Var Shared Text2 As Object Edit1.Attach GetDlgItem("Edit1") : Edit1.SetFontSize 14 Text1.Attach GetDlgItem("Text1") : Text1.SetFontSize 14 Text2.Attach GetDlgItem("Text2") : Text2.SetFontSize 14 '================================================================ '= '================================================================ Declare Sub Edit1_Change edecl () Sub Edit1_Change() Var lineCount As Long Var ChrsUpToLast As Long Var DocSize As Long lineCount = Api_SendMessage(Edit1.Gethwnd, EM_GETLINECOUNT, 0, ByVal 0) Text1.SetWindowText Format$(lineCount, "##,###行目") ChrsUpToLast = Api_SendMessage(Edit1.GethWnd, EM_LINEINDEX, lineCount - 1, ByVal 0) If ChrsUpToLast = 0 Then DocSize = Api_SendMessage(Edit1.GethWnd, EM_LINELENGTH, ChrsUpToLast, ByVal 0) Else If ChrsUpToLast < 65000 Then DocSize = Api_SendMessage(Edit1.GethWnd, EM_LINELENGTH, ChrsUpToLast, ByVal 0) + ChrsUpToLast End If Text2.SetWindowText Format$(DocSize, "##,###文字") End Sub '================================================================ '= '================================================================ While 1 WaitEvent Wend Stop End