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

解決


のり  2004-03-22 23:26:01  No: 7835

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


るるとん@K  2004-03-22 23:35:15  No: 7836

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


のり  2004-03-22 23:42:21  No: 7837

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


るるとん@K  2004-03-23 00:23:11  No: 7838

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

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


にしの  2004-03-23 00:28:53  No: 7839

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


のり  2004-03-23 00:38:24  No: 7840

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

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


のり  2004-03-23 00:38:39  No: 7841

押し忘れました^^;


るるとん@K  2004-03-23 01:08:49  No: 7842

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


のり  2004-03-23 04:41:27  No: 7843

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


にしの  2004-03-23 05:28:46  No: 7844

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


jok  2004-03-23 09:47:45  No: 7845

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


のり  2004-03-23 18:11:23  No: 7846

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


のり  2004-03-23 18:17:00  No: 7847

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


jok  2004-03-23 19:51:09  No: 7848

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

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


るるとん@K  2004-03-23 22:42:09  No: 7850

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


jok  2004-03-23 22:45:12  No: 7851

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

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

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

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


のり  2004-03-23 22:46:52  No: 7852

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


のり  2004-03-23 22:57:16  No: 7853

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


jok  2004-03-23 23:25:24  No: 7854

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


のり  2004-03-23 23:44:10  No: 7855

すいません・・・。

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


  2004-03-23 23:49:34  No: 7856

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


のり  2004-03-23 23:52:25  No: 7857

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


  2004-03-23 23:58:13  No: 7858

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

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


のり  2004-03-24 00:04:24  No: 7859

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


jok  2004-03-24 00:20:18  No: 7860

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

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


のり  2004-03-24 00:29:02  No: 7861

実現できましたぁ!!!

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

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


  2004-03-24 02:08:22  No: 7862

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


jok  2004-03-24 03:12:16  No: 7863

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

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


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

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






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