先日、ひらがな一覧表フォームと文字入力フォームについて質問させていただいたきよです。
今回は、Editに入力されたひらがなを漢字に変換することを考えて進めています。
そこで、以前この掲示板で漢字変換のことについて書かれたものがあったので、それを引用させて頂いたのですが、それではひらがなを変換して確定し、その続きにまた新しくひらがなを入力して変換ボタンを押すと、前に入力された文字も再び変換の対象になってしまいました。
新しく入力された文字だけを変換の対象にするにはどうしたらよいでしょうか?
いろいろ考えてはみたのですが、どうにもこうにもわからなくて・・・
またご指導お願いします。
下のコードを引用させて頂いたのですが・・・↓
var
S:String;
Imc:HIMC;
begin
Form1.Edit1.SetFocus;
S := Form1.Edit1.Text;
if S = '' then Exit;
Form1.Edit1.Clear;
Imc := ImmGetContext(Form1.Edit1.Handle);
ImmSetCompositionStringA(Imc, SCS_SETSTR, PChar(S),Length(S),nil,0);
ImmNotifyIME(Imc, NI_COMPOSITIONSTR, CPS_CONVERT, 0);
ImmNotifyIME(Imc, NI_OPENCANDIDATE, 0,0 );
IMMReleaseContext(Form1.Edit1.Handle, Imc);
end;
S := Form1.Edit1.Text;
で、すでに入力されている(新規入力でない)部分を含む全てを代入しているのが原因でしょう。
S := 新規入力文字のみ
とすればよろしいかと。
そーいうことだったんですね・・・。
全く気づきませんでした・・。
思い当たることをいくつか試してみましたが、
新規入力文字のみを判断することができませんでした。
どうしたら判断できるようになるのでしょうか?
本当に初心者で一から十までお聞きして申し訳ありません。
新規入力文字というものがどういうものかによります。
例えば、
今日は
と、既に入力されていて、次の入力の後が
今日ははれだ
となるのであれば、以前の入力をPrevSなどの変数を用意し、
S := Copy(Form1.Edit1.Text, Length(PrevS) + 1, Length(Form1.Edit1.Text));
PrevS := PrevS + S;
とすればよろしいかと思います。
PrevSはローカル変数では駄目ですよ。Form1のメンバ変数か、無理であればグローバル変数に用意する必要があります。
# グローバル変数はおすすめしません。
取得が困難なパターンは、
晴れだ
と既に入力されていて、そこに「あしたは」と追加した状態
あしたは晴れだ
の場合などを考慮するパターンです。
もっと複雑なパターンもあり得ますよね。
明日は晴れだ
と既に入力されていて、
明日のとうきょうちほうは晴れだ。
と打ち込まれたとき、
「のとうきょうちほう」を取得するのは困難です。
これが取得できたとして、次のパターンは判別不可能です。
にわにはにわとりがいる
のあとに、「にわ」と打ち込んだ結果、
にわにはにわにわとりがいる
という文字列になった場合は、
・にわにはにわ「にわ」とりがいる
・にわには「にわ」にわとりがいる
のどちらなのかを判別できません。
この場合、文字の入力順序、位置などを記録しなければ取得できません。
返答ありがとうございました。
もっと簡単なものかと思っていましたが、複雑なんですね・・・
どうやらもう少し自分なりの工夫が必要ですね・・・
細かく説明してくださって感謝します。
本当にありがとうございました。
ツイート | ![]() |