TComboboxのText編集中に日本語変換が確定したタイミングで、
処理をしたいのですが、TEditでは、WM_IME_ENDCOMPOSITIONを
とらえる事でできるのですが、TComboboxではとらえることが
できないようです。何か方法がないでしょうか。
Delphi7 WinX-P
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;
Edit部分は別物さん ありがとうございました。
半日調べたのですが、提示いただいたコードをどう使うのか分かりません。
以前は、ComboBox1.WindowProcの中で見ていて、この場所ではWM_IME_ENDCOMPOSITION を補足できなかったのですが、
procedure TComboBox.ComboWndProc(var Msg: TMessage; ComboWnd: HWnd; ComboProc: Pointer);
は、どのように使うのでしょうか。申し訳ありませんがよろしくお願いいたします。
コントロールのウィンドウ関数(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
.....
ありがとうございました。おかげで何とが実装できました。(丸写しですが)
半日ではまだまだかなと言うことでしたので、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からWM_IME_ENDCOMPOSITIONのMessageが来た時点では
IME側の変換処理は確定しているけれども、アプリ側のEdit部分の
処理(確定文字列のComboBox.Textへの追加)はまだ終わっていない。
だから、アプリ側の処理が終わる前に ShowMessageでフォーカスを
移動してしまうと、確定文字列の追加位置も変わってしまって、
ComboBox.Textの先頭に挿入されてしまうという不具合が起きることに
なる。
どうもありがとうございました。
ご丁寧に解説していただいて助かりました。
ツイート | ![]() |