TPaintBoxがActiveな状態でキーボードのボタンを押したときに処理を
拾いたいのですが、何か方法はあるでしょうか?
どなたかご教授願います。
TPaintBoxはアクティブにならないのでは?
言い方が悪かったです、フォーカスが当たっているか当たっていないか
の判断です^^;
TPaintBoxにフォーカスは当たらないのでは?
フォームにボタンとPaintBox1を作成し、実行します。
ボタンがアクティブな時PaintBox1をクリックしてもボタンはアクティブなままです。
SetFocusメソッドもActiveプロパティもありません。
フォームCloseイベントでShowMessage(Self.ActiveControl.name);を試してみましたが、PaintBox1とは表示されません。
TPaintBoxがアクティブとはどのような状態なのですか?
TGraphicControlから派生しているので、フォーカスを受け取ることはできません。
一応、キーを取得するには、WindowProcプロパティを変更しておけば出来ますが、キーは(直接メッセージをとばさない限り)取得できないと思います。
同じ理由で、TImageクラスもフォーカスを受け取ることは出来ません。
そうなんですか。。
るるとん@Kさん、にしのさん、ありがとうございます。
何か、違う方法で出来るか調べてみます。
押し忘れました^^;
Panel上に置き、PaintBox1ClickでPanelにSetFocusすればどうでしょう?(意味不明
Panelにはフォーカスは当てれるのですか?
フォーカスは、SetFocusすればあてられますが、OnKeyDownイベントなどはありません。
実行時に、WindowProcプロパティを設定し、メッセージを処理する必要があります。
PaintBox にフォーカスはあたりませんが、のりさんはあるタイミングでキーを
押したことを感知したいのですね? フォームの KeyPreview を true にして、
ある Boolean 型のフラグが true なら処理することにしたらよいのでは?
おすきなタイミングでフラグのtrue/falseを切り替えられると思います。
そうです、あるタイミングでKeyを押してそのKeyが
←→↑↓のよっつだったら処理を行うというのを実現させたいのです。
KeyPreview、WindowProcですね。調べてやってみます!!
KeyPreviewの場合、私がやろうとしている4っつのキーを押しても
キーイベントが無効になってしまい実現は難しいです。
WindowProcプロパティしメッセージを処理するというのを調べてみよう
と思います。先ほどHELPを見たんですが、ちょっと難しくて^^;
矢印キーはフォーカスを移動させるので Panel の WindowProc を入れ替えても
処理は難しいでしょう。
Application.OnMessage で横取りするとうまくいきます。
以下では Panel1 をクリックしてフォーカスをあて、そのとき矢印キーを押した
ら、それを Panel1.Caption に表示します。Haldled を true にしてフォーカス
の移動を防ぎます。
procedure TForm1.ApplicationEvents1Message(var Msg: tagMSG;
var Handled: Boolean);
begin
if Msg.hwnd <> Panel1.Handle then exit;
case Msg.message of
WM_KEYDOWN:
case Msg.wParam of
VK_LEFT:begin
Panel1.Caption := 'Left';
Handled := true;
end;
VK_RIGHT:begin
Panel1.Caption := 'Right';
Handled := true;
end;
VK_UP:begin
Panel1.Caption := 'Up';
Handled := true;
end;
VK_DOWN:begin
Panel1.Caption := 'Down';
Handled := true;
end;
end;
end;
end;
procedure TForm1.Panel1Click(Sender: TObject);
begin
Panel1.SetFocus;
end;
実行してみたのですが、うまく行きません^^;
ApplicationEvents1Messageを呼び出すタイミングは、
Panal1がクリックされたときで良いのでしょうか?
>ApplicationEvents1Messageを呼び出すタイミングは、
>Panal1がクリックされたときで良いのでしょうか?
ApplicationEvents1がかってにやってくれるのでは?
> 実行してみたのですが、うまく行きません^^;
どううまくいきませんか?
> ApplicationEvents1Messageを呼び出すタイミングは、
> Panal1がクリックされたときで良いのでしょうか?
Panel1 にフォーカスを当てれば、あとはキーを押すだけです。
新規で Button1 とか Edit1 とかデフォルトでフォーカスを得るコンポと
Panel1 と ApplicationEvents1 を置いて試してください。
そうかと思いテストしたのですが、トレースしても
そのLineまで行かないので、こちら側で呼ぶのかと思ったのですが^^;
クリックをして矢印Keyを押してもCaptionにうまくセットされません;;
すみませんが、これ以上アドバイスできません。
すいません・・・。
先ほどのソースを実行するとApplicationEvents1Messageは
自動的に動作するんですか?
panel1が他のpanelの上に乗ってたりなどの場合、
上記のコードだと、うまく動かないと思われます。
フォームの上にPanelを乗せているだけですが、SetFocusまでは
行くのですが、その後が動作しません。
FormにApplicationEventsを配置してありますか?
ApplicationEvents1のOnMessageに
上記のApplicationEvents1Messageを指定してありますか?
してないです^^;
配置したら出来ました!!
すいませんでした。。
> panel1が他のpanelの上に乗ってたりなどの場合、
> 上記のコードだと、うまく動かないと思われます。
そんなことはありません。どうしてうまくいかないと思いますか?
実現できましたぁ!!!
jokさんありがとうございますぅぅぅ;;
TForm上にPaintBoxを載せてPaintBoxがクリックされたらPanelに
Focusを当ててという感じで擬似的にPaintBox上のKeyイベントを
実現できました!!
本当にありがとうございました!!!
動かないとかいた理由は、Panel2.EnabledがFalse
では無いかと思ったからです。
> 動かないとかいた理由は、Panel2.EnabledがFalse
> では無いかと思ったからです。
あっ、そうですね。それだとそもそもフォーカスを得ることもできませんね。
ありがとうございます。
ツイート | ![]() |