TRichEditでのIME入力

解決


ラーカス  2007-11-06 20:10:00  No: 28233

いつも拝見させて頂いております。

現在、TMemoコンポーネントを使用して作成した入力I/FをTRichEditに書き換える作業をしているんですが、IMEを使用して文字をを入力した場合、KeyPressイベントが発生せず困っています。
TMemoで例えば「あいうえお」と入力した場合には5回KeyPressイベントが発生し、その中で入力した文字を元にデータを生成するようなことをやっていました。TRichEditでは一度も発生しません。
TRichEditでTMemoと同じようにKeyPressイベントを発生させる方法が何かありませんでしょうか?

当方の環境はD5Pro、WinXP SP2です。

宜しくお願いします。


風来坊  2007-11-07 23:09:54  No: 28234

コンポーネント化してみた。
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.


風来坊  2007-11-07 23:11:30  No: 28235

訂正
DoImeComposition(S);
じゃなくて
DoWMImeComposition(S);


さなみ  2007-11-08 08:30:38  No: 28236

>>ラーカスさん
IMEの確定文字列(Enterを押したときにRichEditに入力される文字列)が取得したいのか、それともキーを押したときに表示される各々の未確定文字を取得したいのか、どちらかよくわからなかったのですが。

後者ならば、RichEditをサブクラス化をしてWM_IME_CHARメッセージを拾えば、それぞれの文字は取得できますよ。
WindowProcプロパティの置き換えを使えば簡単です。


残念ながら  2007-11-08 23:08:57  No: 28237

>>さなみさん
TMemoなら、確かにWM_IME_CHARメッセージを拾えますね。
でも、TRichEditでは WM_IME_CHARメッセージが拾えません。


ラーカス  2007-11-09 23:09:51  No: 28238

皆さんご回答ありがとうございます。

取得したいデータは「IMEの確定文字列」でした。
風来坊様のソースをそのまま流用し、上手く処理することができました。

ありがとうございました。


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

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






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