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

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のコンテキストを格納
  sbKana: StringBuilder;
  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
          // 変換結果の「読み」を取得
          nSize := ImmGetCompositionString(imc, GCS_RESULTREADSTR, nil, 0);
          sbKana := StringBuilder.Create;
          sbKana.Length := nSize;
          ImmGetCompositionString(imc, GCS_RESULTREADSTR, sbKana, nSize+1);
          ImmReleaseContext(Handle, imc);
          // 更新後文字列作成
          FKanaOut.Text := FKanaOut.Text + sbKana.ToString;
        end; // WM_IME_ENDCOMPOSITION
      end; // case
    end;  // if
  end;  // if
  inherited;
end;
end.

コメント (0件)


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