FireMonkeyでIMEを制御するには?

解決


Quest  2015-02-06 13:23:20  No: 47044

VCLではimmを使ってIMEの状態を制御できましたが、Firemonkeyではどうすればいいんでしょう?
無理やりimmを使おうと思いましたがImmGetContext()に渡すHandleを何にすればいいのかわかりません。

FMX.TEditにもImeModeプロパティがあり、そのコンポにフォーカスが移るときにIMEが制御されるので
ソースを追えばそれらしい箇所が見つかるかと思いましたが、それらしい箇所はみつからず。
TTextServiceってのが怪しそうだと思って、GetTextServiceをpublicにして
GetTextService.SetImeMode()を呼び出してみても症状に変化なし。(ImeModeプロパティを設定してるだけ?)

具体的に問題になってるのは、ImeModeをimHiraにしたEditにフォーカスが入った後
マウスでTDateEditコンポにフォーカスを移すと漢字変換が有効になったままになり
DateEditで直接日付を入力しようとしても半角数字が入らない状態になってしまいます。
TDateEditだけでなくImeModeプロパティを持たない入力系コンポ全般ですが。

ImeModeがimHiraになっているEditのOnExitで漢字変換をオフにできればいいんですけど。


Quest  2015-02-06 13:26:19  No: 47045

おっと、環境を忘れました。
Windows7-64bit XE6 Entです。


au  2015-02-06 21:09:19  No: 47046

XE6の環境が手元にないので、XE7での情報です。
FMXはあんま触ってないので良く判らんのですが、Windows 限定だとEditのOnExitで以下一応無効化は出来ました。
usesにWinapi.Imm,FMX.Platform.Win追加
{$IFDEF MSWINDOWS}
  ImmAssociateContext(WindowHandleToPlatform(Handle).Wnd, 0);
{$ENDIF}

IMEの制御自体は、FMX.TextユニットのTTextService.EnterControl,TTextService.ExitControlでやってるみたいですね。
なので、TTextServiceを取得してImeModeにimDisableを指定した後EnterControlを呼ぶとIME自体は無効化されるんですがOnExitでEnterControlを呼んで他に影響がないのか良く判らんので何とも言えません。ExitControlは呼んでもIMEの無効化は出来ませんでした。


Quest  2015-02-06 22:36:25  No: 47047

auさん、ありがとうございます。
Windows限定でよかったので
ImmAssociateContext(WindowHandleToPlatform(Handle).Wnd, 0);
XE6でもこれでIMEをオフにできました。


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

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






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