[Delphi] フリガナを自動で入力する (for Win32)

WM_IME_COMPOSITION メッセージが発生したときに、ImmGetCompositionString 関数を使ってFEP (IME など) が持つフリガナを取得します。

この例は、フリガナ機能付きコンポーネントの作成例です。
TEdit コンポーネントに KanaOut プロパティを追加しています。この追加したプロパティに、Edit1(TEdit クラス) を設定すると、入力した文字のフリガナが Edit1.Text に入力されていきます。

unit KanaEdit;

interface

uses
  Windows, Messages, Classes, Graphics, Controls, StdCtrls;

type
  { TKanaEdit }
  TKanaEdit = class(TEdit)
  private
    FKanaOut: TEdit; // KanaOutプロパティ
  protected
    procedure SetKanaOut(AValue: TEdit);
    procedure WndProc(var Msg: TMessage); override;
  published
    // プロパティ
    ...
    property KanaOut: TEdit read FKanaOut write SetKanaOut;
    ...
  end;

procedure Register;

implementation

uses
  IMM;

procedure Register;
begin
  RegisterComponents('Samples', [TKanaEdit]);
end;

{*******************************************************************************
機能: カナ出力プロパティーセット
引数:
戻値:
*******************************************************************************}
procedure TKanaEdit.SetKanaOut(AValue: TEdit);
begin
  if (AValue = nil) or (AValue = Self) then
  begin
    FKanaOut := nil;
  end
  else
  begin
    FKanaOut := AValue;
  end;
end;

{*******************************************************************************
機能: メッセージ処理
引数:
戻値:
*******************************************************************************}
procedure TKanaEdit.WndProc(var Msg: TMessage);
var
  imc: HIMC; // IMEのコンテキストを格納
  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);
          SetLength(strKana, nSize+1);
          ImmGetCompositionString(imc, GCS_RESULTREADSTR, PChar(strKana), nSize+1);
          SetLength(strKana, nSize);
          // 更新後文字列作成
          FKanaOut.Text := FKanaOut.Text + strKana;
        end; // WM_IME_ENDCOMPOSITION
      end; // case
      ImmReleaseContext(Handle, imc);
    end;  // if
  end;  // if
  inherited;
end;
end.

サンプルプログラムのダウンロードは→[Delphi FAQ用サンプル] フリガナを自動で入力する (for Win32)

コメント (0件)


くろねこ研究所
https://www.blackcat.xyz/article.php/ProgramingFAQ_del0002