TPaintBox上のKeyPlessイベントは拾えますか?

解決


のり  2004-03-22 14:26:01  No: 7835  IP: 192.*.*.*

TPaintBoxがActiveな状態でキーボードのボタンを押したときに処理を
拾いたいのですが、何か方法はあるでしょうか?
どなたかご教授願います。

編集 削除
るるとん@K  2004-03-22 14:35:15  No: 7836  IP: 192.*.*.*

TPaintBoxはアクティブにならないのでは?

編集 削除
のり  2004-03-22 14:42:21  No: 7837  IP: 192.*.*.*

言い方が悪かったです、フォーカスが当たっているか当たっていないか
の判断です^^;

編集 削除
るるとん@K  2004-03-22 15:23:11  No: 7838  IP: 192.*.*.*

TPaintBoxにフォーカスは当たらないのでは?

フォームにボタンとPaintBox1を作成し、実行します。
ボタンがアクティブな時PaintBox1をクリックしてもボタンはアクティブなままです。
SetFocusメソッドもActiveプロパティもありません。
フォームCloseイベントでShowMessage(Self.ActiveControl.name);を試してみましたが、PaintBox1とは表示されません。
TPaintBoxがアクティブとはどのような状態なのですか?

編集 削除
にしの  2004-03-22 15:28:53  No: 7839  IP: 192.*.*.*

TGraphicControlから派生しているので、フォーカスを受け取ることはできません。
一応、キーを取得するには、WindowProcプロパティを変更しておけば出来ますが、キーは(直接メッセージをとばさない限り)取得できないと思います。
同じ理由で、TImageクラスもフォーカスを受け取ることは出来ません。

編集 削除
のり  2004-03-22 15:38:24  No: 7840  IP: 192.*.*.*

そうなんですか。。
るるとん@Kさん、にしのさん、ありがとうございます。

何か、違う方法で出来るか調べてみます。

編集 削除
のり  2004-03-22 15:38:39  No: 7841  IP: 192.*.*.*

押し忘れました^^;

編集 削除
るるとん@K  2004-03-22 16:08:49  No: 7842  IP: 192.*.*.*

Panel上に置き、PaintBox1ClickでPanelにSetFocusすればどうでしょう?(意味不明

編集 削除
のり  2004-03-22 19:41:27  No: 7843  IP: 192.*.*.*

Panelにはフォーカスは当てれるのですか?

編集 削除
にしの  2004-03-22 20:28:46  No: 7844  IP: 192.*.*.*

フォーカスは、SetFocusすればあてられますが、OnKeyDownイベントなどはありません。
実行時に、WindowProcプロパティを設定し、メッセージを処理する必要があります。

編集 削除
jok  2004-03-23 00:47:45  No: 7845  IP: 192.*.*.*

PaintBox にフォーカスはあたりませんが、のりさんはあるタイミングでキーを
押したことを感知したいのですね? フォームの KeyPreview を true にして、
ある Boolean 型のフラグが true なら処理することにしたらよいのでは?
おすきなタイミングでフラグのtrue/falseを切り替えられると思います。

編集 削除
のり  2004-03-23 09:11:23  No: 7846  IP: 192.*.*.*

そうです、あるタイミングでKeyを押してそのKeyが
←→↑↓のよっつだったら処理を行うというのを実現させたいのです。
KeyPreview、WindowProcですね。調べてやってみます!!

編集 削除
のり  2004-03-23 09:17:00  No: 7847  IP: 192.*.*.*

KeyPreviewの場合、私がやろうとしている4っつのキーを押しても
キーイベントが無効になってしまい実現は難しいです。
  WindowProcプロパティしメッセージを処理するというのを調べてみよう
と思います。先ほどHELPを見たんですが、ちょっと難しくて^^;

編集 削除
jok  2004-03-23 10:51:09  No: 7848  IP: 192.*.*.*

矢印キーはフォーカスを移動させるので 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;

編集 削除
のり  2004-03-23 11:16:32  No: 7849  IP: 192.*.*.*

実行してみたのですが、うまく行きません^^;
ApplicationEvents1Messageを呼び出すタイミングは、
Panal1がクリックされたときで良いのでしょうか?

編集 削除
るるとん@K  2004-03-23 13:42:09  No: 7850  IP: 192.*.*.*

>ApplicationEvents1Messageを呼び出すタイミングは、
>Panal1がクリックされたときで良いのでしょうか?
ApplicationEvents1がかってにやってくれるのでは?

編集 削除
jok  2004-03-23 13:45:12  No: 7851  IP: 192.*.*.*

> 実行してみたのですが、うまく行きません^^;

どううまくいきませんか?

> ApplicationEvents1Messageを呼び出すタイミングは、
> Panal1がクリックされたときで良いのでしょうか?

Panel1 にフォーカスを当てれば、あとはキーを押すだけです。
新規で Button1 とか Edit1 とかデフォルトでフォーカスを得るコンポと
Panel1 と ApplicationEvents1 を置いて試してください。

編集 削除
のり  2004-03-23 13:46:52  No: 7852  IP: 192.*.*.*

そうかと思いテストしたのですが、トレースしても
そのLineまで行かないので、こちら側で呼ぶのかと思ったのですが^^;

編集 削除
のり  2004-03-23 13:57:16  No: 7853  IP: 192.*.*.*

クリックをして矢印Keyを押してもCaptionにうまくセットされません;;

編集 削除
jok  2004-03-23 14:25:24  No: 7854  IP: 192.*.*.*

すみませんが、これ以上アドバイスできません。

編集 削除
のり  2004-03-23 14:44:10  No: 7855  IP: 192.*.*.*

すいません・・・。

  先ほどのソースを実行するとApplicationEvents1Messageは
自動的に動作するんですか?

編集 削除
 2004-03-23 14:49:34  No: 7856  IP: 192.*.*.*

panel1が他のpanelの上に乗ってたりなどの場合、
上記のコードだと、うまく動かないと思われます。

編集 削除
のり  2004-03-23 14:52:25  No: 7857  IP: 192.*.*.*

フォームの上にPanelを乗せているだけですが、SetFocusまでは
行くのですが、その後が動作しません。

編集 削除
 2004-03-23 14:58:13  No: 7858  IP: 192.*.*.*

FormにApplicationEventsを配置してありますか?

ApplicationEvents1のOnMessageに
上記のApplicationEvents1Messageを指定してありますか?

編集 削除
のり  2004-03-23 15:04:24  No: 7859  IP: 192.*.*.*

してないです^^;
配置したら出来ました!!
すいませんでした。。

編集 削除
jok  2004-03-23 15:20:18  No: 7860  IP: 192.*.*.*

> panel1が他のpanelの上に乗ってたりなどの場合、
> 上記のコードだと、うまく動かないと思われます。

そんなことはありません。どうしてうまくいかないと思いますか?

編集 削除
のり  2004-03-23 15:29:02  No: 7861  IP: 192.*.*.*

実現できましたぁ!!!

jokさんありがとうございますぅぅぅ;;
TForm上にPaintBoxを載せてPaintBoxがクリックされたらPanelに
Focusを当ててという感じで擬似的にPaintBox上のKeyイベントを
実現できました!!

本当にありがとうございました!!!

編集 削除
 2004-03-23 17:08:22  No: 7862  IP: 192.*.*.*

動かないとかいた理由は、Panel2.EnabledがFalse
では無いかと思ったからです。

編集 削除
jok  2004-03-23 18:12:16  No: 7863  IP: 192.*.*.*

> 動かないとかいた理由は、Panel2.EnabledがFalse
> では無いかと思ったからです。

あっ、そうですね。それだとそもそもフォーカスを得ることもできませんね。
ありがとうございます。

編集 削除