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

解決


のり  2004-03-22 23:26:01  No: 7835  IP: [192.*.*.*]

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

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

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

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

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

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

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

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

編集    削除
にしの  2004-03-23 00:28:53  No: 7839  IP: [192.*.*.*]

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

編集    削除
のり  2004-03-23 00:38:24  No: 7840  IP: [192.*.*.*]

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

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

編集    削除
のり  2004-03-23 00:38:39  No: 7841  IP: [192.*.*.*]

押し忘れました^^;

編集    削除
るるとん@K  2004-03-23 01:08:49  No: 7842  IP: [192.*.*.*]

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

編集    削除
のり  2004-03-23 04:41:27  No: 7843  IP: [192.*.*.*]

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

編集    削除
にしの  2004-03-23 05:28:46  No: 7844  IP: [192.*.*.*]

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

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

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

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

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

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

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

編集    削除
jok  2004-03-23 19: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 20:16:32  No: 7849  IP: [192.*.*.*]

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

すいません・・・。

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

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

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

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

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

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

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

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

編集    削除
のり  2004-03-24 00:04:24  No: 7859  IP: [192.*.*.*]

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

編集    削除
jok  2004-03-24 00:20:18  No: 7860  IP: [192.*.*.*]

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

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

編集    削除
のり  2004-03-24 00:29:02  No: 7861  IP: [192.*.*.*]

実現できましたぁ!!!

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

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

編集    削除
 2004-03-24 02:08:22  No: 7862  IP: [192.*.*.*]

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

編集    削除
jok  2004-03-24 03:12:16  No: 7863  IP: [192.*.*.*]

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

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

編集    削除