サイトカレンダー

サイトカレンダーをスキップ

2018年 01月
«
»
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31

記事カテゴリ

ユーザー機能


 2018年1月21日(日) 19:39 JST

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

  • 2004年6月30日(水) 00:02 JST
  • 投稿者:
  • 表示回数
    2,285

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.

トラックバック

このエントリのトラックバックURL:
http://www.blackcatlab.com/trackback.php/ProgramingFAQ_del0051

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