WindousXP Delphi7を使用しております
EditBoxなどで文字を入力中のまだ未確定の状態の文字列
(まだ文字の下に点線の下線が出ている状態、または、青いハイライトが出ている状態といってわかってもらえるでしょうか?)
を取得する方法はあるんでしょうか?
過去ログやその他で調べたのですがどうしてもわからなくて質問させて頂きました。過去ログを見てComboBoxオートコンプリートなどを調べたんですが挙動がおかしい点があるのと未確定文字列入力中にデータベースに接続して候補をListBoxなどに表示したいと思っております。
どうぞよろしくお願いいたします
こんにちは。ImmGetCandidateList がキーワードかな?
ここはどうですか? IMEの操作について勉強になりますょ。
http://homepage2.nifty.com/c_lang/sdk3/sdk_282.htm
DELPHIのコードなら
http://pc.2ch.net/tech/kako/1003/10036/1003664165.html
の#534を参照してみてください。
なつめぐさん どうもありがとうございます!!
http://homepage2.nifty.com/c_lang/sdk3/sdk_282.htm
http://pc.2ch.net/tech/kako/1003/10036/1003664165.html
↑レスNo:534
まさにやりたい内容です!
なかなか複雑で難しいです
まず自分でちょっとやってみようとして、コードを参考にしているのですが、
最初の最初の段階でつまずいてます・・・
HMC: HIMC;
という最初の変数の所で、未定義の識別子とでてエラーがでてしまいます
たぶんusesに何か書けば良いというのはわかるのですが、何を追加して良いのかわかりません
本当に初心者で申し訳ありませんが、まずこの部分をお教え頂きたく、お手数ですがどうぞよろしくお願い致します
Mr.XRAYです.
>何を追加して良いのかわかりません
未定義のエラーが現れた場合,Delphi標準の(他の方が提供しているのではなく)
のものであれば,1つの方法として[Source]フォルダ内を検索する方法があります.
すると,今回の場合,Delphi7であれば,Imm.pas内に以下の定義があります.
(Delphiのバージョンによって異なる場合があります)
つまり,usesにImmを追加すればいいことになります.
{$EXTERNALSYM HIMC}
HIMC = Integer;
Mr.Xrayさん ありがとうございます
前々からホームページ読ませて頂き、とても参考にさせて頂いております
なつめぐさん、Mr.Xrayさんのおかげで#534のコードが無事動くようになりました!すごいコードですね 変換までできるんですね!
ですが、コードが難しすぎてどこがどの動作をしているのか解析できません
自分が必要なのは入力中の文字の取得までの部分で良いんですが、どうにか解析しようと思い、やってるんですが思うように行きません
ImmGetCandidateListで検索をしてみたんですがヒットが少なく良い情報を得られませんでした
入力中の文字をLabelに書き出すことができれば助かるのですが、頼ってばかりで本当に申し訳なく思うのですがお教えして頂ければ幸いです
ゆたっぴーさん、先に紹介したところの第278章から第283章までの
「IMEの操作1〜6」を読んでみましたか?
コードはアレでも、何が出来るとかパラメータの意味とか・・・
私は復習がてら勉強になりました。苦しんだ思い出もよみがえりましたけど
以下でいかがでしょう?Turbo Delphi Xp sp3 です。
新規で、EditとMemoをひとつづつ置きます。
private部に
private
{ Private 宣言 }
OldWndProc: TWndMethod;
procedure WMImeComposition(var Msg: TMessage);
・・・・
implementation
{$R *.dfm}
uses imm;
procedure TForm1.FormCreate(Sender: TObject);
begin
OldWndProc := Edit1.WindowProc;
Edit1.WindowProc := WMImeComposition;
end;
procedure TForm1.WMImeComposition(var Msg: TMessage);
var
Imc: HIMC;
L : Integer;
S : String;
begin
OldWndProc(Msg);
if ((Msg.LParam and GCS_COMPSTR) <> 0) then begin
Imc := ImmGetContext(Handle);
L := ImmGetCompositionString(Imc, GCS_COMPSTR, nil, 0);
SetLength(S, L + 1);
ImmGetCompositionString(Imc, GCS_COMPSTR, PChar(S), L + 1);
ImmReleaseContext(Handle, Imc);
SetLength(S, L);
Memo1.Lines.Add(S);
end;
end;
GCS_COMPSTR は第281章にでてますよ。
なつめぐ様 どうもありがとうございます
お蔭様で目的の処理ができるようになりました
心より御礼申し上げます
Memoに書き出すと、どういう訳か私の環境では、入力した文字がたくさん出てきて無限ループみたいになってしまうため
Memo1.Lines.Add(S);を
Label1.Caption:=S;に変えた所、無事動作致しました
仰られました通り、第278章から第283章までのIMEの操作1〜6」を読み返し、勉強中です。まだまだ理解できませんが、とても参考になります。
この度は、本当にどうもありがとうございました
ツイート | ![]() |