Editから入力をしたときのフリガナを取得する、
というのを一歩すすめて
漢字の再変換機能を使って入力もしてないのに読み仮名を取得するコードはいかがでしょうか?
以前、どこかで拾ったサンプルです。
unit Unit7;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Imm;
type
TForm7 = class(TForm)
ListBox1: TListBox;
Edit1: TEdit;
Label1: TLabel;
Label2: TLabel;
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private 宣言 }
public
{ Public 宣言 }
end;
var
Form7: TForm7;
implementation
{$R *.dfm}
procedure TForm7.Button1Click(Sender: TObject);
var
imc: HIMC; // 入力コンテキストのハンドル
KeyBoardLayout: HKL; // キーボードレイアウト
DataList: PCandidateList; // CANDIDATELIST 構造体へのポインタ
intSize: integer; // サイズ
tmpPChar: PChar;
offSet: DWORD;
i, intIndex: Integer;
begin
Edit1.SetFocus;
Label1.Caption := '';
Label2.Caption := '';
ListBox1.Clear;
// 指定されたウィンドウに関連付けられている入力コンテキストを取得します。
imc := ImmGetContext(Application.Handle);
try
KeyBoardLayout := GetKeyboardLayout(0);
// 変換結果を受け取るために必要なバッファサイズを取得します。
intSize := ImmGetConversionList(
KeyBoardLayout, imc, PChar(Edit1.Text), nil, 0, GCL_REVERSECONVERSION);
// DataListに、intSize分のメモリを割り当てます。
GetMem(DataList, intSize);
try
// Edit1.Textに入力された文字列を逆変換し、DataListに保存します。
ImmGetConversionList(
KeyBoardLayout, imc, PChar(Edit1.Text), DataList, intSize, GCL_REVERSECONVERSION);
tmpPChar := PChar(DWORD(DataList) + DataList^.dwOffset[1]);
// フリガナを表示します。
Label1.Caption := String(tmpPChar);
offset := 0;
// 変換候補数を表示します。
Label2.Caption := IntToStr(DataList^.dwCount) + ' 件';
for i := 0 to DataList^.dwCount - 1 do
begin
tmpPChar := PChar(DWORD(tmpPChar) + offset);
intIndex := ListBox1.Items.Add(String(tmpPChar));
offSet := Length(ListBox1.Items[intIndex]) + 1;
end;
finally
// メモリを解放します。
FreeMem(DataList);
end;
finally
// 入力コンテキストを解放し、コンテキスト内の関連メモリのロックを解除します。
ImmReleaseContext(Application.Handle, imc);
end;
end;
end.
Vistaでも動きます。
|