PopupMenu に MainMenu のサブ項目をそのまま表示する
|
一つのメニューアイテムを、同時に二つのメニューに結び付ける事は出来ないようなので、実行時に、MainMenu と PopupMenu 、それぞれが開く時点で、共有するアイテムをそのメニューに結びつけ直す、という方法をとりました。ある位置から下を全部共有アイテムとする仕様です。
結び付け直すタイミングですが、PopupMenu の方は、OnPopup イベントで良いのですが、MainMenu の方は、(エディットメニュー以下をすべて使う場合に) Edit1 のOnClick だと、位置がずれたりしてうまくないので、WndProc をオーバーライドして、WM_INITMENU メッセージに応答させました。
以下は PASCAL 翻訳版
const COMMON_ITEM_START = 3; // 共有アイテムの始まる位置
procedure TForm1.PopupMenu1Popup(Sender: TObject);
var Item: TMenuItem;
begin
while Edit1.Count > COMMON_ITEM_START do begin
Item:= Edit1.Items[COMMON_ITEM_START];
Edit1.Remove(Item);
PopupMenu1.Items.Add(Item);
end;
end;
procedure TForm1.WndProc(var Msg: TMessage);
var Item: TMenuItem;
begin
if (Msg.Msg=WM_INITMENU) and (Msg.WParam=Menu.Handle) then begin
while PopupMenu1.Items.Count > COMMON_ITEM_START do begin
Item:= PopupMenu1.Items[COMMON_ITEM_START];
PopupMenu1.Items.Remove(Item);
Edit1.Add(Item);
end;
end;
inherited WndProc(Msg);
end;
|
|