何時も参考にさせて頂いております。
早速ですが、質問をさせて頂きます。
現在、エディタを作成中なのですが、複数回のUndo機能を実装する為にスタックを用い、OnKeyPressイベントでデータをプッシュする事にしました。
実際に動作させると1バイト文字は期待通りの動作をするのですが、2バイト文字を入力すると全く動きません。2バイト文字の時は違う処理をしないといけないようですが、現在入力されているのが2バイト文字かどうか判断する方法ってあるのでしょうか?(C++BuilderのIsDBCSLeadByte関数みたいなものがあればいいのですが・・)
どなたかご教授お願いします。
> 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
すみません、完全に勘違いしていました。
あれ・・さんの仰るとおりAPIでしたね。
どうもすみませんでした。
OnKeyPressイベントでは、2バイト文字は受け取れませんよ。
たとえば、「あいうえお」と入力すると、$82が5回飛んできます。
IMEで入力された文字は、WM_IMECHARメッセージで飛んできます。
にしのさん、ありがとうございます。
あれ・・さんからAPIだとのご指摘を受けた後、データを保持するクラスの変数にフラグ等を使って何とか格納しようとしたのですが上手くいきませんでした。
OnKeyPressイベントでは受け取れないのですか。
勉強不足でお恥ずかしい限りですが、WM_IMECHARメッセージで飛んでくると教えて頂いてもそれをどう処理したらいいのか皆目見当が付きません。
Googleで検索をかけても3件しかヒットせずさっぱりです。ヒントだけでも結構なのでご教授頂けないでしょうか。
よろしくお願い致します。
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 で入力して決定すると・・・
あれ・・さん、ありがとうございます。
コード試してみました。
見事にEdit1にMemo1の文字が表示されました。
コードの中に良く分からない部分が幾つかありましたが、これから学習して理解に努めようと思います。
取敢えず、現時点での問題はあれ・・さんの示して下さったコードの最後の部分をいじってみようと思います。
ツイート | ![]() |