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

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

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

Re[8]: 日本語変換確定時のTextChangedイベントについて


(過去ログ 14 を表示中)

[トピック内 12 記事 (1 - 12 表示)]  << 0 >>

■4905 / inTopicNo.1)  日本語変換確定時のTextChangedイベントについて
  
□投稿者/ M.K (24回)-(2007/06/28(Thu) 14:14:55)

分類:[C# (Windows)] 

開発環境:WinXP SP2, VS2005(C#), .NET 2.0

いつもお世話になっております、M.Kと申します。

現在 TextBox を継承したカスタムコントロールを作成しており、そのコントロールの
TextChanged イベントにて、その時点で入力されているテキストを基に処理を行う様な
事を考えております。

そのコントロール(以降 TextBox とします)にIMEがOffの状態で文字が入力される場合
は問題無いのですが、IMEがOnの状態で入力文字が確定された場合にこちらが望む様な
動作をしてくれず困っております。

例えば TextBox の TextChanged イベントに以下の様なコードを記述した際に、IMEに
よって"あいうえお"と入力された文字が確定されると「あ」「あい」「あいう」「あい
うえ」「あいうえお」と合計5回も TextChanged イベントが発生してしまいます。


  private void textBox1_TextChanged(object sender, EventArgs e)
  {
      System.Diagnostics.Debug.WriteLine(textBox1.Text);
  }


これを「あいうえお」の1回だけで済ませたいのですが、何か良い方法は無いでしょうか?

IMM系のAPIやメッセージを使って出来るかなと思い、ImmGetCompositionString や
ImmNotifyIME を使ってみているのですが、確定直後の「あいうえお」を取得する事は
できても、5回発生する TextChanged イベントの制御はできていない状態です。

以上 宜しくお願い致します。

引用返信 編集キー/
■4906 / inTopicNo.2)  Re[1]: 日本語変換確定時のTextChangedイベントについて
□投稿者/ Pandora (31回)-(2007/06/28(Thu) 15:05:40)
> これを「あいうえお」の1回だけで済ませたいのですが、何か良い方法は無いでしょうか?

 確かになりますね。

 TextBoxコントールで実現しなければいけないのであれば、なんらかの対応策をプログラム的に
 ほどこす必要があるみたいですね。

 他のコントロールでも問題ないのであれば、RichTextBoxコントロールを使用すれば、一回のイベント
 ですみます。

 とりあえず、参考までに。
引用返信 編集キー/
■4907 / inTopicNo.3)  Re[2]: 日本語変換確定時のTextChangedイベントについて
□投稿者/ M.K (25回)-(2007/06/28(Thu) 15:31:18)
No4906 (Pandora さん) に返信

>  TextBoxコントールで実現しなければいけないのであれば、なんらかの対応策をプログラム的に
>  ほどこす必要があるみたいですね。

先の書き込みには TextBox と書きましたが、厳密に言えば TextBox を拡張した他所から提供された
コントロールを使用しなければならないので、残念ながら RichTextBox に置き換える事はできそうに
ありません。

>  他のコントロールでも問題ないのであれば、RichTextBoxコントロールを使用すれば、一回のイベント
>  ですみます。

動作の程、確認いたしました。 まさにこの動作を望んでいる次第です。

引き続き解決方法をご存知の方がいらっしゃいましたら、宜しくお願い致します。
引用返信 編集キー/
■4940 / inTopicNo.4)  Re[1]: 日本語変換確定時のTextChangedイベントについて
□投稿者/ y4yama (4回)-(2007/06/29(Fri) 10:51:51)
No4905 (M.K さん) に返信
> 開発環境:WinXP SP2, VS2005(C#), .NET 2.0
> そのコントロール(以降 TextBox とします)にIMEがOffの状態で文字が入力される場合
> は問題無いのですが、IMEがOnの状態で入力文字が確定された場合にこちらが望む様な

M.Kさん、こんちは。当方VB2005で確認したのですが、
IMEがOffの状態でも、a,ab,abc,abcd..とtextBox1_TextChanged が一文字毎に発生しますよね?
それが問題ないのは、なぜ? とつまらない疑問を持ちました
(C#とVBで違ってるんだったら、申し訳ございません、無視してくださいませ)
引用返信 編集キー/
■4944 / inTopicNo.5)  Re[2]: 日本語変換確定時のTextChangedイベントについて
□投稿者/ M.K (26回)-(2007/06/29(Fri) 11:37:57)
No4940 (y4yama さん) に返信

> IMEがOffの状態でも、a,ab,abc,abcd..とtextBox1_TextChanged が一文字毎に発生しますよね?
> それが問題ないのは、なぜ? とつまらない疑問を持ちました

少し自作コントロールの仕様をお話しますと、今回要求されている機能の1つに独自スタイルの
オートコンプリート機能があります。

これは入力された文字をもとに内部にあるデータにフィルタリングを行い、該当するデータの一覧
をリストに表示するといった機能でして、イメージとして Google 等で検索を行おうとした際に
過去の検索条件や予想される検索条件を補完してドロップリストに表示する様な機能です。

ただのオートコンプリートであれば TextBox の標準機能で実現可能なのですが、フィルタリング
が特殊なのと、表示されるドロップリストを独自スタイルにする必要が有った為、見よう見まねで
組み込みを行っている次第です。


話を戻しますが、IMEがOffの場合は「入力確定」と言う操作が無いのでTextChangedイベントで逐次
フィルタリングを行うしかないのですが、IMEがOnの場合は「あいうえお」とユーザーが入力して
「入力確定」をした以上、「あいうえお」を1つの入力単位としてフィルタリングを行うのが自然
と考えて質問した次第です。

またフィルタリングもデータ量が多くなると相応の時間が掛かりますので、不要な処理を避ける為
にも「あ」「あい」「あいう」「あいうえ」の場合はスルーして「あいうえお」だけで処理したい
と言うのも有ります。

引用返信 編集キー/
■4945 / inTopicNo.6)  Re[3]: 日本語変換確定時のTextChangedイベントについて
□投稿者/ ぽぴ王子 (226回)-(2007/06/29(Fri) 11:50:19)
ぽぴ王子 さんの Web サイト
No4944 (M.K さん) に返信

ということであれば、先日の FileSystemWatcher スレでの話題が少し役に
たつかもしれませんね。
http://bbs.wankuma.com/index.cgi?mode=al2&namber=4749
最終的には「最後に変更が通知されたところからいくらか待って処理をする」
という感じでしたが、これを同じように適用できないでしょうか。

たぶん、オートコンプリートの話が最初に出てきていたなら、流れもちょっと
変わったかな?などと思ったりしました。
引用返信 編集キー/
■4946 / inTopicNo.7)  Re[3]: 日本語変換確定時のTextChangedイベントについて
□投稿者/ 魔界の仮面弁士 (322回)-(2007/06/29(Fri) 11:55:54)
No4944 (M.K さん) に返信
> またフィルタリングもデータ量が多くなると相応の時間が掛かりますので、不要な処理を避ける為
> にも「あ」「あい」「あいう」「あいうえ」の場合はスルーして「あいうえお」だけで処理したい
> と言うのも有ります。

では、連続してイベント(OnTextChanged メソッド?)が発生した場合は、最後のイベントのみを使うようにする、とか。

たとえば、イベント発生から独自オートコンプリートの開始までに、ごく僅かな遅延時間を持たせておいて。
その遅延時間内に再度イベントが発生したら、そこから再度、時間計測しなおすように実装する、と。
引用返信 編集キー/
■4958 / inTopicNo.8)  Re[4]: 日本語変換確定時のTextChangedイベントについて
□投稿者/ M.K (27回)-(2007/06/29(Fri) 14:09:28)
No4945 (ぽぴ王子 さん) に返信

> 最終的には「最後に変更が通知されたところからいくらか待って処理をする」
> という感じでしたが、これを同じように適用できないでしょうか。

その方法も考慮してみたのですが、迅速な入力が要求されるフロント業務画面での
使用も考慮しなければならず、若干の「待ち」が発生するとかえって使いづらい物
になってしまうのではないか? またディレイ値を調整しても人によって入力速度
が「まちまち」なため、ある人には丁度良くても別の人には「早い・遅い」と感じ
てしまう事もあるのでは無いか?と言う所で最終手段として保留にしていました。


現在適切な処置かどうか自信は無いのですが、WM_IME_COMPOSITIONメッセージを
フックして LParam の値が GCS_RESULTSTR だった時(変換確定)に ImmGetCompositionString
で確定後の文字列を取得し、その文字数を元に TextChanged イベント内で発生回数
をカウントして対処するようにしてみました。(実際はもう少し複雑ですが)

今の所これで上手く行っているようなので、ひとまずは解決済みとしたいと思います。

解決済み
引用返信 編集キー/
■4963 / inTopicNo.9)  Re[5]: 日本語変換確定時のTextChangedイベントについて
□投稿者/ まどか (312回)-(2007/06/29(Fri) 14:34:08)
> その文字数を元に TextChanged イベント内で発生回数をカウントして対処するようにしてみました。

スレを見ながら思っていたのですが、
MaxLengthを超えるような文字数の確定だとどうなるんだろう?
解決済み
引用返信 編集キー/
■5027 / inTopicNo.10)  Re[6]: 日本語変換確定時のTextChangedイベントについて
□投稿者/ M.K (30回)-(2007/07/03(Tue) 09:26:19)
No4963 (まどか さん) に返信

> MaxLengthを超えるような文字数の確定だとどうなるんだろう?

申し訳ありません、まどかさんの返信を見落としていました。

MaxLength に 3 と設定されている TextBox に対して「あいうえお」と
入力した場合、ImmGetComposition の Length は 5 であるのに対し、
TextChanged イベントは 3回 しか発生していませんでしたので、その
辺りは調整をしてやる必要が有りました。

以上、何かの参考になれば幸いです。
解決済み
引用返信 編集キー/
■5046 / inTopicNo.11)  Re[7]: 日本語変換確定時のTextChangedイベントについて
□投稿者/ y4yama (5回)-(2007/07/03(Tue) 13:19:07)
No5027 (M.K さん) に返信
IME ONでは、すばらしいですね。
また、つまらないことですが(返信は不要です)
ユーザからしたら
半角で入力して1つづつ逐次フィルタリングが起こるのを目の前にした時に(毎回2〜3秒(T1)待つとしたら)
IME ONではGoodなのに、ど〜して?と言いたくなるような・・・・

>若干の「待ち」が発生するとかえって使いづらい物
>になってしまうのではないか? またディレイ値を調整しても人によって入力速度(T2=0.3秒)
>が「まちまち」なため、

と、M.Kさんがある程度考慮されているとしても、T1とT2の折り合いであり、せめぎあいであります。
T1<T2なら、私の勘違いでございます。
(しかし、もったいないなぁ〜)

・・・ユーザからクレームが来ないで検収が上がる事を・・・・・お祈りいたします・・・
解決済み
引用返信 編集キー/
■5050 / inTopicNo.12)  Re[8]: 日本語変換確定時のTextChangedイベントについて
□投稿者/ M.K (33回)-(2007/07/03(Tue) 14:38:42)
No5046 (y4yama さん) に返信

> また、つまらないことですが(返信は不要です)

いえ、「つまらない」で片付けてしまっては勿体無いので、この「初回の TextChanged が
発生してから所定の時間が過ぎたらフィルタリング処理を行う」方法(とでも言いましょうか)
も検討(こっそり作る)しようと思います。

そうすればIMEのON/OFFに関係なく動作仕様やコーディングが統一されますので、保守の面
でもメリットが有るかと思いますし。

> 半角で入力して1つづつ逐次フィルタリングが起こるのを目の前にした時に(毎回2〜3秒(T1)待つとしたら)
> IME ONではGoodなのに、ど〜して?と言いたくなるような・・・・

諸事情の関係でフィルタリングの対象となるデータ及びその件数などの見積が出来ない状況
に有りまして、T1とT2の大小関係を予想できないのでまずは先の方法でと考えていた次第です。

解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -