いつも拝見させて頂いております。
現在、TMemoコンポーネントを使用して作成した入力I/FをTRichEditに書き換える作業をしているんですが、IMEを使用して文字をを入力した場合、KeyPressイベントが発生せず困っています。
TMemoで例えば「あいうえお」と入力した場合には5回KeyPressイベントが発生し、その中で入力した文字を元にデータを生成するようなことをやっていました。TRichEditでは一度も発生しません。
TRichEditでTMemoと同じようにKeyPressイベントを発生させる方法が何かありませんでしょうか?
当方の環境はD5Pro、WinXP SP2です。
宜しくお願いします。
コンポーネント化してみた。
IMEから入力されると OnWMImeComposition イベントが発生するだけですが…
unit MyRichEdit;
interface
uses
Windows, Messages, SysUtils, Classes, Controls, StdCtrls, ComCtrls;
type
TWMImeCompositionEvent = procedure(Sender: TObject; const S: String) of object;
TMyRichEdit = class(TRichEdit)
private
{ Private 宣言 }
FOnWMImeComposition: TWMImeCompositionEvent;
procedure WMImeComposition(var Message: TMessage); message WM_IME_COMPOSITION;
protected
{ Protected 宣言 }
procedure DoWMImeComposition(const S: String); virtual;
public
{ Public 宣言 }
published
{ Published 宣言 }
property OnWMImeComposition: TWMImeCompositionEvent
read FOnWMImeComposition write FOnWMImeComposition;
end;
procedure Register;
implementation
uses
Imm;
procedure Register;
begin
RegisterComponents('Samples', [TMyRichEdit]);
end;
{ TMyRichEdit }
procedure TMyRichEdit.WMImeComposition(var Message: TMessage);
var
Imc: HIMC;
L: Integer;
S: String;
begin
inherited;
if Message.LParam and GCS_RESULTSTR <> 0 then
begin
Imc := ImmGetContext(Handle);
L := ImmGetCompositionString(Imc, GCS_RESULTSTR, nil, 0);
SetLength(S, L);
ImmGetCompositionString(Imc, GCS_RESULTSTR, PChar(S), L);
ImmReleaseContext(Handle, Imc);
DoImeComposition(S);
end;
end;
procedure TMyRichEdit.DoWMImeComposition(const S: String);
begin
if Assigned(FOnWMImeComposition) then
FOnWMImeComposition(Self, S);
end;
end.
訂正
DoImeComposition(S);
じゃなくて
DoWMImeComposition(S);
>>ラーカスさん
IMEの確定文字列(Enterを押したときにRichEditに入力される文字列)が取得したいのか、それともキーを押したときに表示される各々の未確定文字を取得したいのか、どちらかよくわからなかったのですが。
後者ならば、RichEditをサブクラス化をしてWM_IME_CHARメッセージを拾えば、それぞれの文字は取得できますよ。
WindowProcプロパティの置き換えを使えば簡単です。
>>さなみさん
TMemoなら、確かにWM_IME_CHARメッセージを拾えますね。
でも、TRichEditでは WM_IME_CHARメッセージが拾えません。
皆さんご回答ありがとうございます。
取得したいデータは「IMEの確定文字列」でした。
風来坊様のソースをそのまま流用し、上手く処理することができました。
ありがとうございました。
ツイート | ![]() |