☆よみがなを取得する。

エクセルで作られた名簿をよみがなで五十音順に並べたいと相談を受けました。
「簡単やし、メールしておいて」
そして届いた名簿は・・・なんと漢字の名前が並んでいるだけ・・・。
これだけで、よみがなで並び替えができると思っているなんてすごい(^^;
ということで、よみがな入力から始めることになりました。
とりあえず漢字からよみがなを変換し、それを確認してもらい、無事作業を終了しました。

よみがなを取得する関数です。
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)

|