こんにちは。
いつも参考させていただいています。
過去ログを参照し、
入力した文字の半角カナを取得するプログラムをテストしました。
delphi7では正常に動いているのですが、
delphi2010だと、入力した文字の後ろに、
余計な文字が入ってしまい、
正常に取得することができません。
どうかご教授よろしくお願いします。
uses imm;
function GetFurigana (Control:TwinControl):String;
var
IMC:HIMC;
Len:Longint;
Str:String;
begin
Imc:=ImmGetContext(Control.Handle);
Len:=ImmGetCompositionString(Imc,GCS_RESULTREADSTR,nil,0);
SetLength(Str,Len+1);
ImmGetCompositionString(IMC,GCS_RESULTREADSTR,PChar(Str),Len+1);
SetLength(Str,Len);
Result:=Str;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
Edit2.Text:=GetFurigana(Edit1);
end;
正解は知りません、一応動作させると言う事で。
function GetFurigana (Control:TwinControl):String;
var
IMC:HIMC;
Len:Longint;
Str:AnsiString;
begin
Control.SetFocus;
Imc:=ImmGetContext(Control.Handle);
Len:=ImmGetCompositionStringA(Imc,GCS_RESULTREADSTR,nil,0);
SetLength(Str,Len+1);
ImmGetCompositionStringA(IMC,GCS_RESULTREADSTR,PAnsiChar(Str),Len + 1);
SetLength(Str,Len);
Result:=Str;
end;
function GetFurigana(Control: TwinControl): String;
var
IMC: HIMC;
Len: Longint;
Str: String; //String型はデフォルトでUnicode
begin
Imc := ImmGetContext(Control.Handle);
Len := ImmGetCompositionString(Imc, GCS_RESULTREADSTR, nil, 0);
//返値(Len)がバイト単位らしいので、Unicode文字列の長さは 2で割る。(ImmGetCompositionStringWでも返値はバイト単位らしい)
Len := Len div 2;
SetLength(Str, Len+1);
ImmGetCompositionString(IMC,GCS_RESULTREADSTR, PChar(Str), Len+1);
SetLength(Str, Len);
Result := Str;
end;
//ImmGetCompositionString(IMC,GCS_RESULTREADSTR, PChar(Str), Len+1);
ここも直さないとまずいのかな?
ImmGetCompositionString(IMC,GCS_RESULTREADSTR, PChar(Str), Len*2+2);
ありがとうございました!
正常に動作しました。
Unicode対応に変更になってから、
旧バージョンで作成したプログラムが上手く動作しなくて、苦労してます。
まだ手に入れたばかりなので、
どう変わったのか、今後勉強することにします。
TSさん、お世話になりました。
解決忘れてました。
ツイート | ![]() |