| ■No87020 (ak さん) に返信 > 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 > "SendMessageA"⇒"SendMessageW" 1箇所 > "SendMessageA"⇒"SendMessageW"に変更しますと以下に変わりました。
EM_LINELENGTH の戻り値や EM_GETLINE に渡すバッファは TCHAR 単位なので、 A 系では「バイト数」、W 系では「文字数」で扱います。 ですからバッファサイズも見直さないと駄目ですよ。
'ReDim Buffer(1 + LineLength) ReDim Buffer(1 + 2 * LineLength)
■No87022 (ak さん) に返信 > 範囲選択に不具合であることは分りました。 SelStart / SelLength プロパティは、バイト数ではなく文字数単位での指定ですよ。
たとえば Text1 の中身が下記の 4 行だったとして
==== あさに ごはん たべた はずだ ====
ここで「2 行目」を選択するなら、 Text1.SelStart = 6 Text1.SelLength = 3 または 5 でなければなりません。(末尾改行を含むなら 5 文字選択、含まないなら 3 文字選択)
EM_LINEINDEX で得られる値は、A 系では「6 バイト目」、W 系では「6 文字目」を意味しますし、 EM_LINELENGTH で得られる値は、A 系では「6 バイト」、W 系では「3 文字」を意味します。
なのでこの場合は、SendMessageW の方が手っ取り早いかも。
> Private Function fGetLineString(ByRef txtBox As TextBox, ByVal LineNo As Long) As String 操作するべきは Text1 ではなく、txtBox のはずでは?
それに、範囲選択することを目的とするのなら、 このネーミングのままにするのは不自然な気もします。 Sub SelectLine とかの方が良いかもしれません。 |