TMemo使用時のフォーカス変更

解決


アスカ  2002-06-04 07:53:05  No: 973

初めまして、アスカといいます。
早速、質問させて頂きます。
現在、フォーム上に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でフォーカスを移す方法をご教授ください。
よろしくお願いいたします。

アスカ


にしの  2002-06-04 08:52:35  No: 974

Memo2.SetFocus;
を、
Key:=0;
Memo2.SetFocus;
にしてみてください。
うちの環境(Delphi5Professional+WinXPProfessional)ではフォーカス移動できています。


アスカ  2002-06-04 17:27:55  No: 975

おはようございます、アスカです。
にしのさん、回答ありがとうございます。
無事解決致しました。
そこで、新たな疑問なのですが、なぜ、keyを0にすると
フォーカスが移ったのでしょうか?
↑↓キーは、OnKeyDown後にどこかで引っかかるのでしょうか?
たぶん、MemoのText内を上下するために使われているのではと
推測しています。よろしければ、その辺を詳しく教えていただけ
ないでしょうか?宜しく御願い致します。

アスカ
Athlon 1.54GHz
Memory 512Mbyte
HDD AVVA07-40G×4台RAID0
OS WinXp Pro
言語 Delphi 6 Enterprise SP2


にしの  2002-06-04 18:45:48  No: 976

Key=0にする理由は、ソースを追うとわかります。
TMemoは、辿っていくとTWinControlが親クラスです。
TWinControlのWMKeyDownで、DoKeyDownがfalseなら親クラスのWMKeyDownを呼び出します(つまり再帰的に)。
DoKeyDownでは、KeyDown(OnKeyDownを呼び出している)を呼び、Keyが0ならTrueを返します。
つまり、OnKeyDownイベント(またはWMKeyDown,CNKeyDown)は、Keyが0になるまで,自分自身から順に親クラスで定義された関数を呼び出しています。
そのどこかでSetFocusに似た処理がされているのだと思います。
0をセットすると、それ以降親クラスを呼び出しませんから、期待した処理になります。


にしの  2002-06-04 18:46:44  No: 977

詳しいことが知りたい場合は、
http://www.asahi-net.or.jp/~HA3T-NKMR/vcl3-3.htm
こういうページをどうぞ。
他にも、検索するといろいろ出てきます。


アスカ  2002-06-04 21:33:57  No: 978

こんにちわ、アスカです。
にしのさん、丁寧にありがとうございました。
非常に参考になりました。

アスカ
Athlon 1.54GHz
Memory 512Mbyte
HDD AVVA07-40G×4台RAID0
OS WinXp Pro
言語 Delphi 6 Enterprise SP2


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








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