TEditのOnChangeイベントの制御

解決


まこと  2006-03-18 06:16:34  No: 20554

いつもお世話になってます。1つ質問させてください。

Form1上にEdit1(TEdit)とEditor1(TEditor。有名な
エディタコンポ。代わりにRichEditとかでもいいです。)
を配置します。

その状態で,Edit1のOnChangeイベントを使ってEditor1
のインクリメンタルサーチのようなことを行いたいと考
えていますが,IMEがONの状態で文字列を入力すると,入
力した文字列の1文字ごとにOnChangeイベントが何回も起
こってしまい,そのたびに検索処理が行われるためにちら
つきがかなりひどくなっています,無駄な検索を行って
しまうということにもつながってしまっています。

例えば,「あいうえお」と入力してエンターキーを押す
と,「あ」の部分で1回,「い」までの部分でもう1回…
というような感じです。(正確にはちょっと違いますが,
イメージはつかんでいただけるのではないかと思います。)

これを防ぐため,日本語入力が完全に終わるまでは検索
処理を行わせたくないのですが,どのようにすれば可能
となるのでしょうか。

よろしくお願いします。

*IMEの確定の瞬間を判断する「WM_IME_COMPOSITION」と
いうメッセージがあるのが分かり,いろいろいじってみた
のですが,それを使えばうまくいくのか,それとも別の手
段でいくべきなのかがよく分かりませんでした。
*できればAtok等でも対応可能であると幸いです。


えーと  2006-03-18 06:22:56  No: 20555

これかな?

http://www2.big.or.jp/~osamu/Delphi/delphi-browse.cgi?index=066625


まこと  2006-03-18 14:55:44  No: 20556

えーと 様,お返事どうもありがとうございます。

リンク先の記事を確認した結果,Edit1に入力された日本語を確定のタイミ
ングごとに取り出すことはできるようになったのですが,IMEがOnでない状
態で入力した場合やBackSpaceキーで文字を削除するなどした場合の変更後
文字列の取得方法がまだ良く分かりません。(リンク先の記事ではKeyPress
イベントについて言及していますが,組み合わせてもうまく更新させられ
ませんでした。Edit1のOnChangeイベントに,いろいろなタイミングでnilを
代入してみたり,KeyDown等の他のイベントも試してみたりしたのですが…)

最終的に行いたいことは,リンク先の記事の内容に合わせた形で申し上げ
ると,Label1とMemo1の内容を完全に一致させるということなのです。

どうぞよろしくお願いいたします。


えーと  2006-03-18 19:39:32  No: 20557

発想を変えて

procedure TForm1.ApplicationEvents1Idle(Sender: TObject;
  var Done: Boolean);
begin
  if Label1.Caption <> Edit1.Text then
  begin
    Label1.Caption := Edit1.Text;
    // なにかの処理
  end;
end;


まこと  2006-03-18 19:57:22  No: 20558

えーと 様,再度のお返事ありがとうございます。

今確認させていただいたのですが,少しいじった限りでは希望どおりの
動作になりそうです。ちょっと今は時間が取れないので,後できちんと
確認させていただいて解決チェックさせていただきたいと思います。

展望が見えてきたので本当に助かります。ありがとうございました。


まこと  2006-03-23 07:56:03  No: 20559

時間がかかってしまい,申し訳ありませんでした。
確認が取れましたので,解決チェックを付けさせていただきます。
本当にどうもありがとうございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加