ふりがなの取得について

解決


Sara  2013-11-12 03:46:29  No: 45542

開発環境
DelphiXE2 Pro  Windows8 Pro 64Bit

ふりがなを自動的に取得する為に、CustumEditを作成していますが、
動作に不満があります・・・

WM_IME_ENDCOMPOSITIONでふりがな文字列を取得しているわけですが、
これだと、確定時にEnterキー等を明示的に押下しなければ、取得できません。

例えば、「東京都葛飾区」と入力する際に、「とうきょうと」で一端変換、Enterキーを
押さずに「かつしかく」と続けて入力してEnterキーを押した場合、取得できるのは「カツシカク」
となってしまいます。(WM_IME_ENDCOMPOSITIONが来ないので当然ですが・・・)

途中途中変換しつつ、連続で入力しても ふりがなを取得するにはどうしたら良いでしょう?

よろしくお願いいたします。
*****************************************************************************************

procedure TFuriganaEdit.WndProc(var Msg: TMessage);
var
  imc: HIMC;
  strKana: string;
  nSize: Integer;
begin
  if (FKanaOut <> nil) then
  begin
    if (Msg.Msg = WM_IME_ENDCOMPOSITION) then
    begin
      imc := ImmGetContext(Handle);
      case Msg.Msg of
        WM_IME_ENDCOMPOSITION:
        begin
          strKana := '';
          nSize := ImmGetCompositionString(imc, GCS_RESULTREADSTR, nil, 0);
          nSize := nSize div 2;
          SetLength(StrKana, nSize + 1);
          ImmGetCompositionString(IMC,GCS_RESULTREADSTR, PChar(StrKana), nSize*2+2);
          SetLength(StrKana, nSize);
          FKanaOut.Text := FKanaOut.Text + strKana;
        end;
      end;
      ImmReleaseContext(Handle, imc);
    end;
  end;
  inherited;
end;


igy  2013-11-12 20:27:37  No: 45543

Delphi 関連書籍
http://ht-deko.minim.ne.jp/delphiforum/?vasthtmlaction=viewtopic&t=46

の大野さんの「Delphi 3 Q&A 150 選」にある「ヨミガナの取得」
(Delphi2用のヘルプファイルに記載されてたかも・・)
の方法では、ダメですか?


Sara  2013-11-13 02:18:20  No: 45544

igyさん  こんばんは

できました。

(Msg.LParam and GCS_RESULTREADSTR) <> 0)があると大丈夫なんですね。

ありがとうございました。m(_ _)m

procedure TFuriganaEdit.WndProc(var Msg: TMessage);
var
  imc: HIMC;
  strKana: string;
  nSize: Integer;
begin
  if (FKanaOut <> nil) then begin
      imc := ImmGetContext(Handle);
      if (Msg.Msg = WM_IME_COMPOSITION) and ((Msg.LParam and GCS_RESULTREADSTR) <> 0) then begin
          strKana := '';
          nSize := ImmGetCompositionString(imc, GCS_RESULTREADSTR, nil, 0);
          nSize := nSize div 2;
          SetLength(StrKana, nSize + 1);
          ImmGetCompositionString(IMC,GCS_RESULTREADSTR, PChar(StrKana), nSize*2+2);
          SetLength(StrKana, nSize);
          FKanaOut.Text := FKanaOut.Text + strKana;
      end;
      ImmReleaseContext(Handle, imc);
  end;
  inherited;
end;


Sara  2013-11-13 18:23:40  No: 45545

>(Msg.LParam and GCS_RESULTREADSTR) <> 0)があると大丈夫なんですね。
ぢゃないですね・・・(そもそもandでつないであるし・・・)

余分なCASEをとるだけでOKってことですね・・・(^^;

ちゃんと動くし・・・

どこで間違えた・・・orz


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

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






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