● メモ帳に文字列を出力する ●

勘の良い方はもう、お気づきでは?

今回はメモ帳に文字列を出力してみましょう。なあに、簡単です。前のページで文字列をクリアするためにエディットボックスに空文字を送りましたね。この空文字の部分をちょっと改造してやれば出来上がりです。

Private Const WM_SETTEXT = &HC '文字列をセットする

'---------------------------------------------------------------
' 関数名: OutputText
' 機能 : メモ帳に文字列を出力する
' 引数 : (in)hEditbox … メモ帳のエディットボックスのハンドル
'     (in)opText … 出力する文字列
' 返り値 :正常:1 エラー:0
'---------------------------------------------------------------
Public Function OutputText(ByVal hEditbox As Long, ByVal opText As String) As Long

  Dim ret As Long

  '文字列を出力する
  ret = SendMessage(hEditbox, WM_SETTEXT, 0&, ByVal opText)

  OutputText = IIf(ret, 1, 0)

End Function

引数が1つ増えただけです。簡単でしょう。さて、コマンドボタン(オブジェクト名:cmdOutputText)を配置して次のコードを書きましょう。

Private Sub cmdOutputText_Click()

  Call OutputText(hEditbox, "1234567890")

End Sub

メモ帳を起動し、コマンドボタンをクリックすると、"1234567890"という文字列が出力されるはずです。けれども、2回、3回とクリックしてみてください。常に、"1234567890"が出力されます。どうも、文字列を出力する前にクリアされてしまうようです。これでは、連続して文字列を出力するときに困ってしまいます。さて、どうしたものか、となるところですがラッキーなことに こちら でその方法が紹介済みなのであります。そこで紹介されている関数をそのまま使えばいいのです。

Private Const EM_REPLACESEL = &HC2 '選択文字列を指定文字列で置換する

'-------------------------------------------------------------------
' 関数名 : OutputTextEx
' 機能 : メモ帳に文字列を追加する
' 引数 : (in) txthWnd … メモ帳のエディットボックスのハンドル
'      (in) opText … 出力する文字列
' 返り値 : 正常:1 エラー:0
'-------------------------------------------------------------------
Public Function OutputTextEx(ByVal hEditbox As Long, ByVal opText As String)As Long

  Dim ret As Long

  '文字列追加
  ret = SendMessage(hEditbox, EM_REPLACESEL, 0, ByVal opText)

  OutputTextEx = IIf(ret, 1, 0)

End Function

これで、連続して文字列を出力することができるようになりました。けれども、連続で文字列を表示するといっても、文字列は最後尾に追加されるわけではなく、キャレット位置に出力されるのです。試しに、キャレットを移動させて試してみてください。

この関数をもう少し拡張させましょう。文字列の出力位置を、@メモ帳の先頭、Aメモ帳の最後尾、Bキャレット位置 に選択できるようにしましょう。さて、ここでキャレット位置を変更する方法を述べなければなりません。それは、EM_SETSEL メッセージを使用することで実現できます。本来これは、文字列を選択状態にするとき使用するものですが、キャレット位置変更にも使用できます。

SendMessage API関数の第3引数に選択文字開始位置、第4引数には、選択終了文字位置を指定します。さて、キャレットを移動させる処理を書いてみます。

  先頭に移動  : Call SendMessage(hEditbox, EM_SETSEL, 0, ByVal 0&)
  最後尾に移動 : Call SendMessage(hEditbox, EM_SETSEL, GetEditboxLenB(hEditbox), _
              ByVal GetEditboxLenB(hEditbox))

先頭に移動処理の第3、第4引数に直接0を指定していますが、何故かは分かりますよね。選択する文字位置が0、ということで、キャレットが先頭に来ます。さらに、選択終了文字位置が0なので文字列は選択されず、キャレット位置はそのままの位置に残るというわけです。最後尾に移動の方法も同じ理屈です。 GetEditboxLenB 関数は前のページで作成した、文字列のバイト数を取得する関数です。

さて、関数を組んでみましょう。

Private Const EM_SETSEL = &HB1

'-------------------------------------------------------------------
' 関数名 : OutputTextEx
' 機能 : メモ帳に文字列を追加する
' 引数 : (in) txthWnd … メモ帳のエディットボックスのハンドル
'      (in) AddString … 追加する文字列
'     (in) CaretPos … キャレット位置
'          0:先頭 1:最後尾 0・1以外:カレント位置
' 返り値 : 正常:1 エラー:0
'-------------------------------------------------------------------
Public Function OutputTextEx(ByVal hEditbox As Long, ByVal AddString As String, ByVal CaretPos As Integer) As Long

  Dim ret As Long

  Select Case CaretPos
    Case 0
      Call SendMessage(hEditbox, EM_SETSEL, 0, ByVal 0&)
    Case 1
      Call SendMessage(hEditbox, EM_SETSEL, GetEditboxLenB(hEditbox), ByVal GetEditboxLenB(hEditbox))
  End Select

  ret = SendMessage(hEditbox, EM_REPLACESEL, 0, ByVal AddString)

  OutputTextEx = IIf(ret, 1, 0)

End Function


[ インデックスページへ  |  前のページへ  |  次のページへ ]