XPPro,Dl6Proです。
画面に、Editを2つ貼り付け、
フリガナ Edit1
名前 Edit2(姓名 山田太郎)
とし、Edit2に入力すると、自動でEdit1へフリガナ(半角)が入るようにプログラムを、下記サイトを参考に作成しました。
ここで、問題なのですが、姓(山田)を入力、リターンキーで確定すると姓の部分(ヤマダ)がフリガナ項目Edit1に入力される。続けて、名前をEdit2に入力(太郎)にすると、Edit1は、姓のフリガナのみ(タロウ)が入る。この場合、Edit2には姓名(山田太郎)が入っている。期待している結果は、Edit1にヤマダタロウと入るようにすることです。
どなたか、識者の方ご指導お願いします。
https://www.petitmonte.com/bbs/answers?question_id=1150
自分も以前フリガナを自動設定する際にいろいろとやりましたが、その際の結論は、
「文字を入力し確定(リターン)キーを押した際に取得するフリガナは確定の対象になるものだけ。」
です。
つまり、”やまだ”を入力し変換→リターン時に取得出来るのは”ヤマダ”のみ
で、次に”たろう”を入力し変換→リターン時に取得出来るのは”タロウ”のみ
のため、”たろう”を入力した際に、Edit1.txt := フリガナ取得関数(Edit1)とかで処理を行うと、”ヤマダ”は取得出来ないため、”タロウ”
のみになるのだと思います。
Edit1.txt := Edit1.txt + フリガナ取得関数(Edit1);
とかで対応できるのではないでしょうか?
ごめんなさい。
フリガナ取得関数(Edit2);
です。
OnChangeだと速度的に遅いのですが、サンプルとして参考にしてください。
こんな感じで取得できます。
usesにimmを追加してください。
procedure TForm1.Edit1Change(Sender: TObject);
var
i: integer;
imc: HIMC;
kl: HKL; // キーボードレイアウト
Dst: PCandidateList;
sz: integer; // サイズ
tmppchar: PChar;
begin
Edit1.SetFocus;
ListBox1.Clear;
imc := ImmGetContext(Handle);
kl := GetKeyboardLayout(0);
sz := ImmGetConversionList(kl, imc, PChar(Edit1.Text), nil, 0, GCL_REVERSECONVERSION);
GetMem(Dst, sz);
ImmGetConversionList(kl, imc, PChar(Edit1.Text), Dst, sz, GCL_REVERSECONVERSION);
for i := 0 to Dst.dwCount - 1 do
begin
tmppchar := PChar(DWORD(Dst) + Dst.dwOffset[i]);
if tmppchar^ <> #0 then
begin
//最初に見つけたふりがなを表示
Edit2.Text := tmppchar;
break;
end;
end;
FreeMem(Dst);
ImmReleaseContext(Handle, imc);
end;
> ListBox1.Clear;
ListBox1は関係なかったです。消してください。
むくさん、にしのさん有難うございました。期待通りの結果が得られました。
但しにしのさんのご指摘のように、
>OnChangeだと速度的に遅いのですが、
のようですね。御開示のコードを参考に、もう少し私なりに研究してみます
王道は、WM_IME_COMPOSITIONメッセージが起た時に処理すべきでしょう。
ツイート | ![]() |