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)

以下のコメントは、その投稿者が所有するものでサイト管理者はコメントに関する責任を負いません。