C# と VB.NET の質問掲示板

わんくま同盟

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト


■87023 / )  Re[5]: テキストボックス指定行の文字列につきまして
□投稿者/ 魔界の仮面弁士 (1624回)-(2018/04/07(Sat) 18:19:12)
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 とかの方が良いかもしれません。
返信 編集キー/


管理者用

- Child Tree -