PanelをPopupMenuのように自動的にかくすには?

解決


かんとく  2012-01-07 20:01:36  No: 41409

お世話になっています。

WindowsXP,DelphiXE2です。

Panelの上にImageをおいて、PopupMenuのようなメニューを作りました。

Panelの上のImageをクリックすると、クリックした座標によって処理をするというものです。

Panelの上のImageがクリックされれば、そのときにPanelのVisibleをFalseにしてPanelを隠すのですが、Panel以外の場所をクリックされた場合も、そのPanelを隠すようにしたいのです。

Form上にあるすべてのオブジェクトのOnClickイベントにPanelのVisibleをFalseにする処理を入れればよいと思うのですが、Form上にあるオブジェクトは100個以上あり、すべてに記述するのは大変なので、もしよい方法があれば、と思って質問しました。

よろしくお願いします。


  2012-01-07 21:12:46  No: 41410

procedure TForm1.ApplicationEvents1Message(var Msg: tagMSG;
  var Handled: Boolean);
begin
  case Msg.message of
    WM_LButtonDown, WM_RButtonDown: Panel1.Visble := False;
  end;
end;

これに適当に座標の判定を組み込むとか。


かんとく  2012-01-08 07:39:52  No: 41411

ありがとうございます。

試してみましたが、思うとおりに動きませんでした。

Formの上部の、

unit Unit1;

interface

uses

type
の部分に
    procedure FormCreate(Sender: TObject);
がもともとあって、その下に
    procedure ApplicationEvents1Message(var Msg: tagMSG; var Handled: Boolean);
を置いたのですが、この置き方が違うのでしょうか?

よろしくお願いします。


Mr.XRAY  2012-01-08 09:21:33  No: 41412

こんにちは.

>TForm1.ApplicationEvents1Message

は,コンポーネントパレットの[Additional]タブのTApplicationEventコンポーネント
を配置して,OnMessageイベントを作成します.
TApplicatonEventコンポは,IDEの検索窓でTApplまで入力すれば現れます.

>    procedure FormCreate(Sender: TObject);
>がもともとあって、その下に
>    procedure ApplicationEvents1Message(var Msg: tagMSG; var Handled: Boolean);
>を置いたのですが、この置き方が違うのでしょうか?

こういうことをしてはいけません.それに「置いた」ではなく「書いた」ですね.
雑談ではいいかも知れませんが,質問の時は俗語は使用しない方がいいですよ.
「実行すると失敗して怒られます」とかもね
(PC ? それともDelphiに怒鳴られたのかよ.えっ!?  どんなPCで,どのバージョンのDelphiなんだ!?).

参考ページ
[イベントの作成方法 ( 入門者用 )]
http://mrxray.on.coocan.jp/Delphi/Others/A_UltraIntro01.htm#list1


かんとく  2012-01-11 09:45:00  No: 41413

ありがとうございます。

TApplicationEventコンポーネント
というのを知りませんでした。

TApplicationEventコンポーネントを配置して,OnMessageイベントを作成したら、うまく動きました。

プログラムのフォーム以外の部分(デスクトップ)をクリックした場合、Panelが消えませんでしたが、TApplicationEventコンポーネントのOnDeactivateイベントにPanel1.Visible:=falseを書くと、うまく動きました。

しかし、プログラムのフォームのキャプション部分をクリックした場合に、Panelを消す方法がわかりませんでした。

よろしくお願いします。


かんとく  2012-01-11 09:54:18  No: 41414

あと、もうひとつ[イベントの作成方法 ( 入門者用 )]もありがとうございました。
まだ入門者なので、助かります。

その部分でも質問なのですが、
procedureやfunctionを自分で作った場合に、
「この部分はDelphiの特別領域」の部分にprocedure名やfunction名を書く場合は、どのようにしたらよいのでしょうか?

今までは、何も考えずに、「Delphiの特別領域」のTypeの部分に書いていました。

「オブジェクト・インスペクタで行う」とありますが、オブジェクトのイベントとは関係がないprocedureやfunctionの場合、どうしたらよいかわかりません。

よろしくお願いします。


Mr.XRAY  2012-01-11 18:21:04  No: 41415

こんにちは.

>「この部分はDelphiの特別領域」の部分にprocedure名やfunction名を書く場合は、どのようにしたらよいのでしょうか?

書かないことです(キッパリ!!).

>「オブジェクト・インスペクタで行う」とありますが、オブジェクトのイベントとは関係がないprocedureやfunctionの場合、どうしたらよいかわかりません。

[イベントの作成方法 ( 入門者用 )]
http://mrxray.on.coocan.jp/Delphi/Others/A_UltraIntro01.htm#list1

の説明にあるように,private 部か,public 部に書きます.
このようにする理由はいくつかありますが,その1つは次のようなものです.

1. 「特別な領域」に書いてあるものは,常にフォームに配置したコンポーネントのイベント,または
    フォームに配置したコンポーネントである.
    それ以外は,そのプログラムの作成者が作成した関数やメソッドであることの区別がつく
2.  [Ctrl]+[Shift]+[↓]または[Ctrl]+[Shift]+[↑]で,宣言部と実装部を往復できる. 
   このキー操作については以下を参照
   [コード補完機能等の利用]
   http://mrxray.on.coocan.jp/Delphi/Others/A_IDETechnique.htm

手前みそですが,私のサイトに掲載しているのサンプルコードのほとんどは,宣言部も掲載しています.
これは,上記の意味も含めてそうしています.

既に他の方が,ほとんど説明なしに

>procedure TForm1.ApplicationEvents1Message(var Msg: tagMSG;

をレスしていますが,実はこのイベントの名前で,それがコンポーネントのイベントであるか,
独自に作成して,private 部か,public 部に書いたものかを知ることができます.
オブジェクト・インスペクタをダブルクリックして作成したイベントの名前には,ある一定の規則があるからです.
これは敢えて説明しません.自分で研究してみてください.

>プログラムのフォームのキャプション部分をクリックした場合に、

折角私のサイトに来たのですから,トップページの[検索]を使って欲しかったですね(半分冗談です)
「フォーム  キャプション」で検索すると,サンプルプログラム集の[127]番がヒットします.
この中に,

[03_キャプションバー ( タイトルバー ) のマウスイベント]
http://mrxray.on.coocan.jp/Delphi/plSamples/127_FormSystemMenuETC.htm#03

というのがあります.メッセージのスペルから判断して WMNCLButtonDownと予想します.すると,例えば
以下のようなテストプログラムを書いてテストしてみることになります.

procedure TForm1.ApplicationEvents1Message(var Msg: tagMSG;
  var Handled: Boolean);
begin
  if Msg.message = WM_NCLBUTTONDOWN then begin
    ShowMessage('キャプションバーがクリックされたよ');
  end;
end;

これらのことを含めて,参考書やネット上のサンプルコードは,「見る」のではなく,「読んで」実際にその
プロジェクトをIDEで開いて動作させてみることをお勧めします.
そうすれば,いろいろな事が「見えて」きます.
浅田真央ちゃんだって,いきなり世界大会やオリンピックで技をやったわけではありません.
先輩達の演技を「見る」だけでできたのではなく,実際に「真似」してやってみて,自分自身の技を創って
いったのだと思います.
もちろん,「見る」だけで理解,出来てしまう方もいるかも知れませんが.私に限って言えば,そのような
高級な脳味噌を持っていません.


Mr.XRAY  2012-01-11 18:41:47  No: 41416

>2.  [Ctrl]+[Shift]+[↓]または[Ctrl]+[Shift]+[↑]で,宣言部と実装部を往復できる. 

これは,private 部か,public 部に書かなくてもできます.
往復できて,それが独自のものと判断できるという意味です.
つまり,

>理由はいくつかありますが,その1つは次のようなものです.

1つということです.


かんとく  2012-01-13 07:44:01  No: 41417

ありがとうございます。

せっかく教えていただいたMr.XRAYさんのサイトをじっくり読まずにすみませんでした。
[03_キャプションバー ( タイトルバー ) のマウスイベント]
のおかげで、プログラムのフォームのキャプション部分をクリックした場合に、Panelを消すことができました。

あと、procedureやfunctionの書き方もわかりました。
今まで知らずに、「Delphiの特別領域」に書いていました。

これからはPublicに書くようにします。

いつもわかりやすいご指導感謝しています。

ありがとうございました。


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

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






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