OnKeyPressイベントで2バイト文字を受け取るには?

解決


senzin  2005-06-08 05:17:45  No: 15437

何時も参考にさせて頂いております。
早速ですが、質問をさせて頂きます。
現在、エディタを作成中なのですが、複数回のUndo機能を実装する為にスタックを用い、OnKeyPressイベントでデータをプッシュする事にしました。
実際に動作させると1バイト文字は期待通りの動作をするのですが、2バイト文字を入力すると全く動きません。2バイト文字の時は違う処理をしないといけないようですが、現在入力されているのが2バイト文字かどうか判断する方法ってあるのでしょうか?(C++BuilderのIsDBCSLeadByte関数みたいなものがあればいいのですが・・)
どなたかご教授お願いします。


あれ・・  2005-06-08 05:33:12  No: 15438

> C++BuilderのIsDBCSLeadByte関数みたいなものがあればいいのですが・・

ほんとうにこれで解決できるんですか?
これは API ですから Delphi からも使えもすけど。

Windows.pas より

function IsDBCSLeadByte(TestChar: Byte): BOOL; stdcall;

MSDN より

http://www.microsoft.com/japan/msdn/library/ja/jpintl/html/_win32_isdbcsleadbyte.asp?frame=true


senzin  2005-06-08 05:46:10  No: 15439

すみません、完全に勘違いしていました。
あれ・・さんの仰るとおりAPIでしたね。
どうもすみませんでした。


にしの  2005-06-08 07:35:05  No: 15440

OnKeyPressイベントでは、2バイト文字は受け取れませんよ。
たとえば、「あいうえお」と入力すると、$82が5回飛んできます。
IMEで入力された文字は、WM_IMECHARメッセージで飛んできます。


senzin  2005-06-09 06:41:22  No: 15441

にしのさん、ありがとうございます。
あれ・・さんからAPIだとのご指摘を受けた後、データを保持するクラスの変数にフラグ等を使って何とか格納しようとしたのですが上手くいきませんでした。
OnKeyPressイベントでは受け取れないのですか。
勉強不足でお恥ずかしい限りですが、WM_IMECHARメッセージで飛んでくると教えて頂いてもそれをどう処理したらいいのか皆目見当が付きません。
Googleで検索をかけても3件しかヒットせずさっぱりです。ヒントだけでも結構なのでご教授頂けないでしょうか。
よろしくお願い致します。


あれ・・  2005-06-09 08:39:43  No: 15442

public
    OldProc: TWndMethod;
    procedure MemoSubClassProc(var Message: TMessage);
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  OldProc := Memo1.WindowProc;
  Memo1.WindowProc := MemoSubClassProc;
end;

procedure TForm1.MemoSubClassProc(var Message: TMessage);
begin
  OldProc(Message);
  if Message.Msg = WM_IME_CHAR then
    Edit1.Text  := Edit1.Text + Char(Message.WParamLo shr 8)+Char(Message.WParamLo);
end;

として Memo1 に 'あいうえお' と IME で入力して決定すると・・・


senzin  2005-06-10 05:17:32  No: 15443

あれ・・さん、ありがとうございます。
コード試してみました。
見事にEdit1にMemo1の文字が表示されました。
コードの中に良く分からない部分が幾つかありましたが、これから学習して理解に努めようと思います。
取敢えず、現時点での問題はあれ・・さんの示して下さったコードの最後の部分をいじってみようと思います。


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

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






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