[Delphi] 漢字入力内容からフリガナを取得する(改良版)
・usesに Imm を追加
・TEditコンポーネントを2つ貼り付け、edSimeiKとedSimeiFの名前にする
・edSimeiKのOnChangeイベントに下記を記述する
・TTimerコンポーネントを貼り付け、Intervalプロパティを0にして
  OnTimerイベントに下記を記述する
・プロジェクトオプションの[型付き定数への代入]をチェックする

implementation

{$R *.dfm}

const
        svItem: TEdit = Nil;
var
        K_Simei, F_Simei: TEdit;

//======================================================================
//  機能:漢字入力内容からフリガナを取得する
//======================================================================
procedure TForm1.edSimeiKChange(Sender: TObject);
var
        ws: string;
begin
    K_Simei := TEdit(Sender);
    ws := 'edSimeiF';
    F_Simei := TEdit(FindComponent(ws));
    Timer1.Interval := 100;     {氏名入力からフリガナをセット}
end;


//======================================================================
//  機能:漢字入力内容からフリガナを取得する
//======================================================================
procedure TForm1.Timer1Timer(Sender: TObject);

    //  機能:漢字の1バイト目かチェック
    function    iskanji1( cc: char ): boolean;
    begin
        Result := (($81<=Ord(cc)) and (Ord(cc)<=$9F)) or
                  (($E0<=Ord(cc)) and (Ord(cc)<=$FC));
    end;

const
        svSimei: string = '';
var
        IMC: HIMC;
        Len: Longint;
        Str, InpChar: String;
begin
    if K_Simei.Text='' then begin
        //氏名が未入力ならフリガナや作業用変数をクリア
        F_Simei.Text := '';
        svSimei := '';
        Exit;
    end;

    if K_Simei<>svItem then svSimei:='';
    if (svSimei<>K_Simei.Text) then begin
        //追加入力された文字を取得
        InpChar := Copy( K_Simei.Text, Length(svSimei)+1, 2 );
        svSimei := K_Simei.Text;
        if (InpChar=' ') or (InpChar=' ') then begin
            //半角・全角スペースならフリガナに半角スペース追加
            F_Simei.Text := F_Simei.Text + ' ';
            Exit;
        end;
    end;
    //(下記は半角入力時に前回漢字入力のフリガナが付かない様に対策)
    if (InpChar='') or (isKanji1(InpChar[1])=FALSE) then Exit;

    //フリガナの取得
    SetLength( Str,255 );
    Imc := ImmGetContext( K_Simei.Handle );
    Len := ImmGetCompositionString( IMC,GCS_RESULTREADSTR,PChar(Str),255 );
    SetLength( Str,Len );
    F_Simei.Text := F_Simei.Text + Str;
    ImmReleaseContext( K_Simei.Handle,Imc );

    Timer1.Interval := 0;
    svItem := K_Simei;
end;

      

・インターネット上の情報や書籍の内容を一部参考に作成してます。
・コーディング内容は著作権フリーですが、使用する場合は自己責任にてお願いします。
・記述内容に問題点や改善点がありましたらこちらまでお願いします。

サンプル集の一覧に戻る