|
|
||||
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); } //------------------------------------------------------------------- |