☆よみがなを取得する。

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

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

|

その他のカテゴリー

ADO | ADT | API | ArrayList | ASP.NET | BDE | BDP.NET | BdpConnection | Borland Developer Studio 2006 | CAPICOM | class | ClipBoard | CodeEditor | Convert.ToString | Custom component | DBExpress | Delphi 2005 | Delphi 2006 | Delphi 2007 | Delphi XE2 | Delphi7 | Delphi8 | Device Driver | Dialog | Docking | DocuWorks | Docuworks SDK | Drag&Drop | Evernote | EXCEL | Firebird | FireMonkey | Game | General | Generics | Google Earth COM API | Google Maps | Google SketchUp | Graphic | IDE | Imm | Indy | InstallAware Express6 | InterBase Admin | JWW | Microsoft SQL Server | MyBase | OnMouseDown | Oracle XE | Paradox | PreviewHandler | PrintDialog | PrintPreviewDialog | PropertyGrid | PSDファイル | Ribbon Controls | RichTextBox | Servers | SubClass | TAction | TActionList | TAnimate | TButton | TCategoryButtons | TClientDataSet | TComboBox | TComboBoxEx | TCustomEdit | TDBGrid | TDockTabSet | TDrawGrid | TEdit | TExcelApplication | TFont | TForm | third party | TImage | TLabel | TList | TListBox | TListView | TMemo | TOpenDialog | TOutlookApplication | TPageControl | TPanel | TRichEdit | TShellResources | TStringGrid | TTabControl | TToolBar | TToolButton | TTreeView | TWebBrowser | Update | VCL Styles | WinInet | XE2 | XPman | オープン配列パラメータ | グループ化 | トランスレーションマネージャー | ファイル処理 | ファイル名処理 | 動的配列 | 投票 | 文字列処理 | 日本語入力 | 暗号 | | 音声合成利用