テキストボックスへの高速な文字列の追加

テキストボックスやリッチテキストボックスを処理状況を表わすログとして利用しているケースは多いかと思います。

しかし、文字数が増えて行くとログに文字列を追加するだけで処理が重くなっていきます。

そんな場合、SendMessage関数を使ってテキストボックスへの文字列の追加を行う事で高速に文字列の追加が行えます。
また、追加後は自動的にカーソル&スクロールも末尾に移動するのでログとして使う場合に大変重宝します。

サンプル(32bit) ダウンロード

'メッセージ送信
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
Private Const EM_REPLACESEL = &HC2  '選択文字列の置換え

Private Sub AddLog_SendMessage(strMsg As String)
    
    'ログへの出力(SendMessage版)
    Call SendMessage(Text1.hwnd, EM_REPLACESEL, 0, ByVal strMsg & vbCrLf)

End Sub

サンプル解説

テクストボックスに向かって「この文字列で、範囲指定された文字列を置き換えろ」ってメッセージを送っているだけです。

置換えなんですが、この場合の範囲指定はしていません。そのため追加となります。
追加であるため「Text1.Text = Text1.Text & strMsg & vbCrLf」の様に毎回中身を入れ替えていた従来の方法よりオーバーヘッドが小さくなるため高速に文字列の追加が行えます。

また、追加後カーソル(=SelStartプロパティ)は自動的に文字列の末尾に設定され、カーソルにあわせてスクロールも自動的に行われます。
コレを繰り返すことで処理低下の原因とならずに文字列を追加することができます。

SendMessage関数に文字列を渡す場合は、ByValで渡す必要があります。
これは宣言がAnyになってるため、そのまま渡しても文字化けしてしまうからです。

ちなみに、VBのテキストボックスは限界があり、限界を超えると頭の方から文字列が削除されていきますので大量のログが発生する可能性がある場合はリッチテキストボックスを利用した方が良いと思います。

2003.12.15追記

リッチテキストボックスの場合、HideSelectionプロパティがTrueだとリッチテキストボックスにフォーカスが無い状態では自動的にスクロールがされない現象が発生します。


[ Window Close ]