ホーム
|
アプリケーション | Tips | ダウンロード | プログラム
| コラム

CBアプリ工房


Tips >   

MainMenu を PopupMenu にコピー 

更新 : 2010/06/25

 


解説:
MainMenu と同じ内容のメニューを PopupMenu にも実装したいときがあります。
メニューがひとつふたつであれば、MainMenu で作成したイベントハンドラをそのまま PopupMenu で実行させればいいので、それほど手間ではありません。しかし、メニュー数が多くなると、それなりに煩雑になります。
もう少し簡単に管理する方法はないでしょうか?

今回は、[ファイル] メニューにある [開く] メニューを PopupMenu にコピーしてみます。複数のメニューをコピーする場合は、for 文などをうまく使って処理してください。

使用例:
アプリケーションを起動して、Form 上で右クリックします(何も起こりません)。
次に Button1 をクリックしてから、再び右クリックすると、今度は PopupMenu が表示されます。

コンポーネントは、 MainMenu、PopupMenu、Button を適当に置くだけです。
Form1 の PopupMenu プロパティに PopupMenu1 を設定します。
MainMenu に [ファイル | 開く] メニューを作って、Name プロパティを OpenMenu としておきます。

コーディングでは、まず PopupMenu にメニューを追加するのに使う、変数 pitem を private に宣言します。
コンストラクタで pitem を動的に作成して、OnDestroy イベントハンドラで解放させます。
OpenMenu のクリックには、処理が確認できるようにメッセージ表示のコードを書いておきます。

Button1 の OnClick イベントハンドラでは、MainMenu の [開く] ニューの Name, Caption, OnClick を pitem に設定して、PopupMenu に追加します。
これで MainMenu と PopupMenu の [開く] メニューの機能が同じになります。

複数のメニューを MainMenu に用意して、PopupMenu にコピーしてみてください。
関数などを作っておくと、使い回しが効いて便利かもしれません。

//-------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
    pitem = new TMenuItem(this);
}
//-------------------------------------------------------------------
void __fastcall TForm1::FormDestroy(TObject *Sender)
{
    delete pitem;
}
//-------------------------------------------------------------------
void __fastcall TForm1::OpenMenuClick(TObject *Sender)
{
    ShowMessage("Open");
}
//-------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    pitem->Name = "Pop_" + File1->Items[0]->Name;
    pitem->Caption = File1->Items[0]->Caption;
    pitem->OnClick = File1->Items[0]->OnClick;
    PopupMenu1->Items->Add(pitem);
}
//-------------------------------------------------------------------



[ ホーム | ページトップ | ブック | リンク | サイトマップ ]
Copyright(c) 2003 Shibu All rights reserved.