IMEの変換中、KeyUpイベントをスルーするには?

解決


ない  2012-10-11 01:51:56  No: 43158

DelphiXE2にて
TEditで、
IMEの変換中は、KeyUpイベントをスルーしたいのですが、
何か良い方法はないでしょうか?
KeyUpイベントに、"エンターキー押下で、タブキー押下"と
していますので・・・。
よろしくお願いします。


けど  2012-10-11 07:48:12  No: 43159

XE2は持ってませんが変換中かどうか判定すればいいと思うので
「Delphi WM_IME_ENDCOMPOSITION」でググってみてください


ない  2012-10-12 03:46:12  No: 43160

"けど"さん、ありがとうございます。
ただ、その辺りは、いろいろと調べつくしました。

とりあえず、VCLで
IME変換中は赤色にするって感じでやったところOKっぽいですが、
FMXで実現するのは、どうすればいいのか皆目見当が付きません。

  private
    WndMethod1:TWndMethod;
    WndMethod2:TWndMethod;
    procedure WindowProc1(var Msg:TMessage);
    procedure WindowProc2(var Msg:TMessage);

var
  flg: Boolean;

procedure TForm1.Edit1KeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
  if flg then begin
    Edit1.Color := clRed;
  end else begin
    Edit1.Color := clWindow;
  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  WndMethod1 := Edit1.WindowProc;
  Edit1.WindowProc := WindowProc1;

  WndMethod2 := Edit2.WindowProc;
  Edit2.WindowProc := WindowProc2;
end;

procedure TForm1.WindowProc1(var Msg: TMessage);
begin
  case Msg.Msg of
    WM_IME_ENDCOMPOSITION:begin
      flg := False;
    end;
    WM_IME_COMPOSITION:begin
      flg := True;
    end;
  end;
  WndMethod1(Msg);
end;

procedure TForm1.WindowProc2(var Msg: TMessage);
begin
  case Msg.Msg of
    WM_IME_ENDCOMPOSITION:begin
      flg := False;
    end;
    WM_IME_COMPOSITION:begin
      flg := True;
    end;
  end;
  WndMethod2(Msg);
end;


KHE00221  2012-10-12 10:56:16  No: 43161

たぶんこれでいけると思う

var
  SaveKey1,SaveKey2: WORD;

procedure TForm1.Edit1KeyUp(Sender: TObject; var Key: Word; var KeyChar: Char; Shift: TShiftState);
begin
    if Key = vkReturn then
    begin
      if SaveKey1 <> 0 then Edit2.SetFocus;
    end;
    SaveKey1 := Key;
end;

procedure TForm1.Edit2KeyUp(Sender: TObject; var Key: Word; var KeyChar: Char; Shift: TShiftState);
begin
    if Key = vkReturn then
    begin
      if SaveKey2 <> 0 then Edit1.SetFocus;
    end;
    SaveKey2 := Key;
end;


ない  2012-10-12 19:02:51  No: 43162

"KHE00221"さん、ありがとうございます。
理想の動きになりました、すばらしいです。
3日間も考えずに、もう少し早く
掲示板に書き込みすればよかったです。

で、結局、ソースは下記のようになりました。
動作確認は、4個のEditで行いましたが、
実際は、30個ぐらいあります。
イベントはすべてのEdit共通です。

var
  SaveKey: array [1..4] of WORD;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Edit1.Tag := 1;
  Edit2.Tag := 2;
  Edit3.Tag := 3;
  Edit4.Tag := 4;
end;

procedure TForm1.Edit1Enter(Sender: TObject);
begin
  SetImeMode(FmxHandleToHWND(Self.Handle), imHira);
end;

procedure TForm1.Edit1Exit(Sender: TObject);
begin
  SetImeMode(FmxHandleToHWND(Self.Handle), imClose);
end;

procedure TForm1.Edit1KeyUp(Sender: TObject; var Key: Word; var KeyChar: Char;
  Shift: TShiftState);
var
  idx: Integer;
begin
  idx := (Sender as TEdit).Tag;
  if (Key = vkReturn) then begin
    if (SaveKey[idx] <> 0) then begin
      (タブキー押下処理)
    end;
  end;
  SaveKey[idx] := Key;
end;


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

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






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