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

わんくま同盟

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

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


■87015 / )  テキストボックス指定行の文字列につきまして
□投稿者/ ak (1回)-(2018/04/07(Sat) 13:20:01)

分類:[VB6 以前] 

お世話になります。

C# と VB.NET の質問掲示板とありましたが、分類にvb6以前のもありましたので投稿致しました。

テキストボックス指定行の文字列につきまして、ご質問いたします。

全て半角数字、文字での使い方ですと文字列が取得されます。
全角にしますと指定行の文字列の取得が思う通りに文字列が取得できませんでした。
全て半角数字、文字での使い方で考えられていると思われました。

質問
全角及び全角、半角の混合でも使えるようにすることはできませんでしょうか。
ご指導のほどを宜しくお願い致します。

下記のWEBページをそのまま参考にしています。
「複数行テキストボックスの指定行の文字列を取得する」
http://hanatyan.sakura.ne.jp/vb6/textbox06.htm
'
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Option Explicit

'指定のウィンドウにメッセージを送る(750)
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
'メモリブロックをコピーする(1008)
Private Declare Sub CopyMemory Lib "kernel32.dll" Alias "RtlMoveMemory" ( _
  Destination As Any, Source As Any, ByVal Length As Long)
'複数行テキストボックスにおいてテキストの行数を取得する(799)
Private Const EM_GETLINECOUNT = &HBA
'  〃    指定行の先頭の文字インデックスを取得する(803)
Private Const EM_LINEINDEX = &HBB
'指定の行を取得する
Private Const EM_GETLINE = &HC4
'  〃    指定の文字インデックスを含む行インデックスを取得(802)
Private Const EM_LINEFROMCHAR = &HC9
'  〃    指定した行インデックスの一つ前の行までのバイト数を取得(803)
Private Const EM_LINELENGTH = &HC1

Private Sub Command1_Click()
On Error Resume Next
  Dim lngMaxRow As Long
  lngMaxRow = SendMessage(Text1.hwnd, EM_GETLINECOUNT, 0&, 0&)
  Dim No As Long
  No = CLng(Text2.Text)
  If No < 1 Or No > lngMaxRow Or Err.Number Then
    Beep
    Exit Sub
  End If
  Label1.Caption = fGetLineString(Text1, No - 1)
End Sub


'指定行の文字列を取得する関数
Private Function fGetLineString(ByRef txtBox As TextBox, ByVal LineNo As Long) As String
  Dim Buffer()  As Byte '取得する文字列のバッファー
  Dim LineLength As Long '1行当たりのバイト数
  Dim LineIndex As Long '指定行の先頭の文字インデックス
  'バッファーのサイズ用に1行当たりのバイト数を事前に取得
  '指定行の先頭の文字インデックスを取得
  LineIndex = SendMessage(txtBox.hwnd, EM_LINEINDEX, LineNo, ByVal 0&)
  '指定行のバイト数を求める
  LineLength = SendMessage(txtBox.hwnd, EM_LINELENGTH, LineIndex, ByVal 0&)
  If LineLength < 1 Then
    fGetLineString = ""
    Exit Function  '改行のみ場合等は、処理を抜ける
  End If
  ReDim Buffer(1 + LineLength)
  'バッファーの最初の2バイトに最大バイト数を設定する
  CopyMemory Buffer(0), LineLength, 2
  '半角1バイト・全角2バイト換算での取得バイト数と文字列を取得
  '(ここで取得するバイト数は、上記で取得するバイト数と同じになります。)
  LineLength = SendMessage(txtBox.hwnd, EM_GETLINE, LineNo, Buffer(0))
  'バッファーより指定バイト数分の文字を取り出し Unicode に変換
  fGetLineString = StrConv(LeftB$(Buffer, LineLength), vbUnicode)
End Function
'
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'

返信 編集キー/


管理者用

- Child Tree -