入力中の文字列の取得

解決


ゆたっぴー  2009-03-07 17:01:22  No: 33583

WindousXP Delphi7を使用しております

EditBoxなどで文字を入力中のまだ未確定の状態の文字列
(まだ文字の下に点線の下線が出ている状態、または、青いハイライトが出ている状態といってわかってもらえるでしょうか?)
を取得する方法はあるんでしょうか?

過去ログやその他で調べたのですがどうしてもわからなくて質問させて頂きました。過去ログを見てComboBoxオートコンプリートなどを調べたんですが挙動がおかしい点があるのと未確定文字列入力中にデータベースに接続して候補をListBoxなどに表示したいと思っております。

どうぞよろしくお願いいたします


なつめぐ  2009-03-09 21:16:07  No: 33584

こんにちは。ImmGetCandidateList  がキーワードかな?

ここはどうですか?  IMEの操作について勉強になりますょ。
http://homepage2.nifty.com/c_lang/sdk3/sdk_282.htm

DELPHIのコードなら
http://pc.2ch.net/tech/kako/1003/10036/1003664165.html
の#534を参照してみてください。


ゆたっぴー  2009-03-09 22:35:22  No: 33585

なつめぐさん  どうもありがとうございます!!

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  2009-03-09 22:55:29  No: 33586

Mr.XRAYです.

>何を追加して良いのかわかりません

未定義のエラーが現れた場合,Delphi標準の(他の方が提供しているのではなく)
のものであれば,1つの方法として[Source]フォルダ内を検索する方法があります.
すると,今回の場合,Delphi7であれば,Imm.pas内に以下の定義があります.
(Delphiのバージョンによって異なる場合があります)
つまり,usesにImmを追加すればいいことになります.

  {$EXTERNALSYM HIMC}
  HIMC = Integer;


ゆたっぴー  URL  2009-03-10 00:09:22  No: 33587

Mr.Xrayさん  ありがとうございます
前々からホームページ読ませて頂き、とても参考にさせて頂いております

なつめぐさん、Mr.Xrayさんのおかげで#534のコードが無事動くようになりました!すごいコードですね 変換までできるんですね!

ですが、コードが難しすぎてどこがどの動作をしているのか解析できません
自分が必要なのは入力中の文字の取得までの部分で良いんですが、どうにか解析しようと思い、やってるんですが思うように行きません

ImmGetCandidateListで検索をしてみたんですがヒットが少なく良い情報を得られませんでした

入力中の文字をLabelに書き出すことができれば助かるのですが、頼ってばかりで本当に申し訳なく思うのですがお教えして頂ければ幸いです


なつめぐ  2009-03-10 09:47:00  No: 33588

ゆたっぴーさん、先に紹介したところの第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章にでてますよ。


ゆたっぴー  2009-03-10 15:04:07  No: 33589

なつめぐ様  どうもありがとうございます

お蔭様で目的の処理ができるようになりました
心より御礼申し上げます

Memoに書き出すと、どういう訳か私の環境では、入力した文字がたくさん出てきて無限ループみたいになってしまうため
Memo1.Lines.Add(S);を
Label1.Caption:=S;に変えた所、無事動作致しました

仰られました通り、第278章から第283章までのIMEの操作1〜6」を読み返し、勉強中です。まだまだ理解できませんが、とても参考になります。

この度は、本当にどうもありがとうございました


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加