リッチテキストボックス上で、右クリックメニューから文字列を貼り付けたりIMEから文字列を入力したりしたときのその文字列を取得したいのですがどうやったらいいでしょうか?
ChangeイベントでTextプロパティーの変化からその文字列を取得しようと考えたのですが、どこが変化したのかがわからないので取得することが出来ませんでした。
よろしくお願いいたします。
Dim strBackData As String
Dim strNowData As String
Private Sub Form_Load()
strNowData = RichTextBox1.Text
End Sub
Private Sub RichTextBox1_Change()
strBackData = strNowData
strNowData = RichTextBox1.Text
End Sub
こうしておくと、一つ前の編集データーがstrBackDataに保持されますので
これと現在のデーターとを頭から比べて違うデータが出てきたらそこを
スタートとします。
今度は後ろから比べて違うデータが出てきたらエンドとして、
スタートとエンドの間が変化したデータです。
変化した部分ではなく貼り付けられた文字列を取得したいと思っています。
例えば、RichTextBox1.Textが "abcdefg" であった場合、その中の
"cde" をマウスで選択してそこに "cdee" を貼り付けたとき、変化した部分を取得する方法では最初の "cd" は同じなので、その部分は貼り付けたのか元からそうなのかが分からないので、貼り付けた文字列を取得できずに困っています。
貼り付け前の RichTextBox1 の Textプロパティーは "abcdefg"
貼り付け後の RichTextBox1 の Textプロパティーは "abcdeefg"
変化した部分は "e" 。
このを "e" 取得したいのではなく、貼り付けた文字列 "cdee" を取得したいと思っています。
よろしくお願いいたします。
>どこが変化したのかがわからないので取得することが出来ませんでした
と書いてありますが。
ポップアップメニューを自分で実装すれば良いんじゃないかな。
> "cde" をマウスで選択してそこに
選択範囲は、SelText / SelStart / SelLength プロパティにて得られます。
> この "e" を取得したいのではなく、貼り付けた文字列 "cdee" を取得したいと思っています。
ところでその処理は、何のために必要なのでしょうか?
> ポップアップメニューを自分で実装すれば良いんじゃないかな。
右クリックメニューからの貼り付けでは出来たのですが、IMEからの入力でつまずいています。
> ところでその処理は、何のために必要なのでしょうか?
リッチテキストボックスにIMEで入力した単語を、リストボックスに自動的に入れていって、もう一度その単語を入力したいときは、リストボックスのその単語のある場所をクリックすることで入力できるようにしたいと思っています。
そのためには入力された文字列が挿入される位置とその文字列の長さを知る必要があると思うのですが、RichTextBox1.SelStart の値は、文字列が挿入される位置とIME入力ウインドウに表示されている確定前の文字列の長さを足した値になるので、実際に挿入される位置が特定できませんでした。
わかりにくい文章ですが、よろしくお願いいたします。
∑(‾□‾;)ナント!! IME恐るべし。
まぁ、リッチテキストボックスでIME本当にそのような挙動をおこなうかはこっちでは検証してませんが、
そうであれば、IMEでの入力以前に開始位置を取得すれば幸せになれると思います。
まず、マウスアップイベントまたは、キーアップイベントのエンターキーor矢印キーのときに、SelStart を記憶しておきます。
マウスやキーボードで挿入位置を指定もしくは選択反転するぶんにはカバーできるはずです。
そしてIME変換確定後はSelStart が入力終了末尾の位置に移動するのかなと思うので、リッチテキストボックスのチェンジイベントでIME入力後のSelStart から入力前のSelStart を引けば、入力した文字数が取得できると思うのでそこから入力した文字列はゲットできるかと。
文字入力は、右クリックメニューからの貼り付け、ctrl+Vによる貼り付け、IMEをONでキー入力、IMEをOFFでキー入力などが考えられますよね。
ctrl+Vも基本的に上記の方法でいけると思います。
右クリックメニューからの貼り付けはできているとのことなのでそこはいいとして、
IMEをOFFにした場合の入力がまた厄介ですね。
上記の文字列入力数が1であれば取り込みをやめて、
キーダウンイベントでエンターか矢印キーの入力時に文字列の取り込みを実施すれば、おおむねのケースはカバーできるのではと。
あ、ただし、IME入力中の矢印キーでキーダウンイベントが発生しないことが前提となっちゃうね。
そのときは1文字ずつの入力はあきらめたほうがすっきりするかも?
まぁ、アイデアを言っているだけなのでなんにしろ試してみてください。
ъ( ゜ー^)
紅閃光さん、詳しいアドバイスありがとうございます。
考え方を変えたら驚くほど簡単にできました。
IMEの確定文字列を取得するAPI関数があることを知り、それを使うと所望の機能が実現できました。
ずっとChangeイベントで取得することにこだわり過ぎて、そんな方法に全く気が付きませんでした。
皆さん、ありがとうございました。
ツイート | ![]() |