☆よみがなを取得する。
「簡単やし、メールしておいて」
そして届いた名簿は・・・なんと漢字の名前が並んでいるだけ・・・。
これだけで、よみがなで並び替えができると思っているなんてすごい(^^;
ということで、よみがな入力から始めることになりました。
とりあえず漢字からよみがなを変換し、それを確認してもらい、無事作業を終了しました。
よみがなを取得する関数です。
uses
Imm;
function GetYomi(Str: String; var SL: TStringList): Boolean;
var
IMC: HIMC;
KL: HKL;
lpDst: PCandidateList;
Offset: DWORD;
I, Size: Integer;
P: PChar;
S: String;
DummyEdit: TEdit;
begin
DummyEdit := TEdit.Create(nil);
DummyEdit.Width := 1;
DummyEdit.Parent := Application.MainForm;
DummyEdit.Left := 1000;
DummyEdit.Top := 1000;
Application.MainForm.ActiveControl := DummyEdit;
SL.Clear;
Result := False;
IMC := ImmGetContext(DummyEdit.Handle);
try
if IMC = 0 then Exit;
KL := GetKeyboardLayout(0);
Size := ImmGetConversionList(KL, IMC, PChar(Str), nil, 0,
GCL_REVERSECONVERSION);
GetMem(lpDst, Size);
try
ImmGetConversionList(KL, IMC, PChar(Str), lpDst, Size,
GCL_REVERSECONVERSION);
P := PChar(DWORD(lpDst) + lpDst^.dwOffset[1]);
Offset := 0;
for I := 0 to lpDst^.dwCount - 1 do
begin
P := PChar(DWORD(P) + Offset);
S := String(P);
Offset := Length(S) + 1 ;
// なぜか同じ読みを複数取得するので、同じものは追加させない。
if SL.IndexOf(S) < 0 then
SL.Add(S);
end;
Result := True;
finally
FreeMem(lpDst);
end;
finally
ImmReleaseContext(DummyEdit.Handle, IMC);
DummyEdit.Free;
end;
end;
上記関数の使用例です。
procedure TForm1.Button1Click(Sender: TObject);
var
SL: TStringList;
begin
SL := TStringList.Create;
try
if GetYomi(Edit1.Text, SL) then
ListBox1.Items.Assign(SL)
else
ShowMessage('取得できませんでした');
Button1.SetFocus;
finally
SL.Free;
end;
end;
[参考にしたサイト]
Programming Library
Delphi Q & A掲示板
漢字からかなへの変換
MSDN
Input Method Editor (IME)
| 固定リンク
