初めまして、アスカといいます。
早速、質問させて頂きます。
現在、フォーム上にMemoを4つ配置しております。
そのMemo1にフォーカスがある時に↑↓キーでフォーカスを
他のMemo2,3,4に移したいのですが、うまくいきません。
(Memoは、1行入力用として使用しています。)
現在は、OnKeyDown内で下記のように記述しております。
procedure TForm1.Memo1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if Key = 40 then
begin
Memo2.SetFocus;
end;
end;
こうすると、↑↓キーではフォーカスが移ってくれません。
試しに、OnKeyUp内で記述するとうまくいくのですが、
キーが押されたときにフォーカスを移したいのです。
Editを使用すればうまくいくのですが、Editを使用したくない
訳がありますので、Memoでフォーカスを移す方法をご教授ください。
よろしくお願いいたします。
アスカ
Memo2.SetFocus;
を、
Key:=0;
Memo2.SetFocus;
にしてみてください。
うちの環境(Delphi5Professional+WinXPProfessional)ではフォーカス移動できています。
おはようございます、アスカです。
にしのさん、回答ありがとうございます。
無事解決致しました。
そこで、新たな疑問なのですが、なぜ、keyを0にすると
フォーカスが移ったのでしょうか?
↑↓キーは、OnKeyDown後にどこかで引っかかるのでしょうか?
たぶん、MemoのText内を上下するために使われているのではと
推測しています。よろしければ、その辺を詳しく教えていただけ
ないでしょうか?宜しく御願い致します。
アスカ
Athlon 1.54GHz
Memory 512Mbyte
HDD AVVA07-40G×4台RAID0
OS WinXp Pro
言語 Delphi 6 Enterprise SP2
Key=0にする理由は、ソースを追うとわかります。
TMemoは、辿っていくとTWinControlが親クラスです。
TWinControlのWMKeyDownで、DoKeyDownがfalseなら親クラスのWMKeyDownを呼び出します(つまり再帰的に)。
DoKeyDownでは、KeyDown(OnKeyDownを呼び出している)を呼び、Keyが0ならTrueを返します。
つまり、OnKeyDownイベント(またはWMKeyDown,CNKeyDown)は、Keyが0になるまで,自分自身から順に親クラスで定義された関数を呼び出しています。
そのどこかでSetFocusに似た処理がされているのだと思います。
0をセットすると、それ以降親クラスを呼び出しませんから、期待した処理になります。
詳しいことが知りたい場合は、
http://www.asahi-net.or.jp/~HA3T-NKMR/vcl3-3.htm
こういうページをどうぞ。
他にも、検索するといろいろ出てきます。
こんにちわ、アスカです。
にしのさん、丁寧にありがとうございました。
非常に参考になりました。
アスカ
Athlon 1.54GHz
Memory 512Mbyte
HDD AVVA07-40G×4台RAID0
OS WinXp Pro
言語 Delphi 6 Enterprise SP2
ツイート | ![]() |