ComboboxのIME変換確定について

解決


sato  2011-01-26 00:38:43  No: 39901

TComboboxのText編集中に日本語変換が確定したタイミングで、
処理をしたいのですが、TEditでは、WM_IME_ENDCOMPOSITIONを
とらえる事でできるのですが、TComboboxではとらえることが
できないようです。何か方法がないでしょうか。

Delphi7 WinX-P


Edit部分は別物  2011-01-26 02:17:11  No: 39902

ComboBoxのEdit部分のMessageは、すべてがComboBox本体のMessageとなるわけではなく、WM_SYSCOMMANDなどほんの一部だけ。
でも、ComboWndProc には Edit部分で発生したすべてのMessageが来る。
だから、

procedure TComboBox.ComboWndProc(var Msg: TMessage; ComboWnd: HWnd; ComboProc: Pointer);
begin
  inherited;
  case Msg.Msg of
    WM_IME_ENDCOMPOSITION: Form1.Caption := 'ComboBoxのEditのIME変換確定';
  end;
end;


sato  2011-01-26 23:36:20  No: 39903

Edit部分は別物さん  ありがとうございました。
半日調べたのですが、提示いただいたコードをどう使うのか分かりません。
以前は、ComboBox1.WindowProcの中で見ていて、この場所ではWM_IME_ENDCOMPOSITION  を補足できなかったのですが、
procedure TComboBox.ComboWndProc(var Msg: TMessage; ComboWnd: HWnd; ComboProc: Pointer);
は、どのように使うのでしょうか。申し訳ありませんがよろしくお願いいたします。


半日ではまだまだかな  2011-01-27 03:08:52  No: 39904

コントロールのウィンドウ関数(WindowProc)を、入れ替える方法ではなく…

interface

uses
   .....
type
  TComboBox = class(StdCtrls.TComboBox)
  private
    procedure ComboWndProc(var Msg: TMessage; ComboWnd: HWnd; ComboProc: Pointer); override;
  end;

type
  TForm1 = class(TForm)
  .........

implementation

procedure TComboBox.ComboWndProc(var Msg: TMessage; ComboWnd: HWnd; ComboProc: Pointer);
begin
  inherited;
  case Msg.Msg of
  WM_IME_ENDCOMPOSITION: ShowMessage('ComboBoxのEditのIME変換確定');
  end;
end;

procedure TForm1........
begin
  .....


sato  2011-01-28 19:18:38  No: 39905

ありがとうございました。おかげで何とが実装できました。(丸写しですが)
半日ではまだまだかなと言うことでしたので、1日考えましたがまだ良く分かりません。
おそらく、TComboBoxの●●●を、WM_IME_ENDCOMPOSITIONを捕捉出来るようにした、
TComboBox.ComboWndProc(var Msg: TMessage; ComboWnd: HWnd; ComboProc: Pointer);
でoverrideする。
と言うことだと思いますが、●●●の部分が分かりません。
それと、
case Msg.Msg of
  WM_IME_ENDCOMPOSITION: begin
                           <A>
                         end;
  end;
の<A>の部分で、ConboBox.Textを使って処理をさせたいのですが、
<A>の直前にShowMessageとか、Application.ProcessMessagesとかを
入れないと、このタイミングでは、ConboBox.Textの値は取得できないようです。
変換は確定した、とメッセージが来たのに確定した中身は取り出せないというのは、なぜなのでしょうか。


アプリとIMEも別物  2011-01-29 03:05:50  No: 39906

IMEからWM_IME_ENDCOMPOSITIONのMessageが来た時点では
IME側の変換処理は確定しているけれども、アプリ側のEdit部分の
処理(確定文字列のComboBox.Textへの追加)はまだ終わっていない。
だから、アプリ側の処理が終わる前に ShowMessageでフォーカスを
移動してしまうと、確定文字列の追加位置も変わってしまって、
ComboBox.Textの先頭に挿入されてしまうという不具合が起きることに
なる。


sato  2011-01-31 22:52:51  No: 39907

どうもありがとうございました。
ご丁寧に解説していただいて助かりました。


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

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






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