• ベストアンサー

delphi imageコンポでOnKeyイベント

PaintBoxコンポーネントの中にマウスがあって、マウスで描画している時(マウスは動いていない、ボタンは押されたまま)、キーが押されたことを察知する方法はないでしょうか? imageコンポーネントにOnKeyPressとかOnKeyDownのイベントがあれば、ありがたかったのですが? 例えばIllustratorで、選択されたものを移動させながら、ALTキーを押せば複製移動できるような機能です。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

こんにちは。 おっしゃるとおり、TImage には OnKeyPress 等のイベントはありませんね。 なので、フォームでキー入力を受け付ければ良いのです。 Form1 のプロパティに KeyPreview というプロパティがあるので、これを true に設定します。こうすることで、フォームに置かれている各コンポーネントより先に、入力されたキーをフォームが受け取るようになります。 あとは Form1 の OnKeyPress 等で受け付けたキーを処理するだけです。 どうしても TImage でキー入力の処理をしたければ、TImage から拡張(派生)した自前のコンポーネントを作るしかないでしょう。

situmonnsya
質問者

補足

>Form1 のプロパティに KeyPreview これに気がつきませんでした。 ありがとうございます。 ところで、 >Form1 の OnKeyPress 等で受け付けたキーを処理するだけです 処理に if key=18 then paintbox1.Cursor :=crCross; としたいのですが(18はALTキー)、最初に2回押さないとcrCrossにならないのは、このキーが特殊だからでしょうか? 他のキーは1回目から変わるのですが。 よろしければ、御指導をお願いします。

その他の回答 (1)

回答No.2

こんにちは。 ALT キーはショートカットのコンビネーションキーとして使用されますので、DELPHI で普通に入力を得るのは難しいですね。これは、1回目の ALT を入力してすぐに SPACE を入力するとわかりやすいでしょう。 どうしても ALT キーを使いたければ、キー入力を関知するようにウィンドウプロシージャを自前で作って対処する必要がありますが、かなり面倒です。 どうしても…というのでなければ、Ctrl や Shift に仕様変更した方が早くてカンタンでしょう。

situmonnsya
質問者

お礼

ありがとうございます。 いろいろやっています。 FormKeyDownイベントで if key=18 then SetCursor(5) にすると、ALTキー1回目から受付けました。 でも、まだ希望どうりの動きができません。 また、新しい質問をした時よろしくお願いします。

関連するQ&A

専門家に質問してみよう