DelphiXE2にて
TEditで、
IMEの変換中は、KeyUpイベントをスルーしたいのですが、
何か良い方法はないでしょうか?
KeyUpイベントに、"エンターキー押下で、タブキー押下"と
していますので・・・。
よろしくお願いします。
XE2は持ってませんが変換中かどうか判定すればいいと思うので
「Delphi WM_IME_ENDCOMPOSITION」でググってみてください
"けど"さん、ありがとうございます。
ただ、その辺りは、いろいろと調べつくしました。
とりあえず、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;
たぶんこれでいけると思う
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;
"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;
ツイート | ![]() |