Delphi Tips 
-----------------------------

0066  D1   D2   D3   D4   D5   D6   D7   3.1   95   98    作成: 1999/02/08 osamu rev 1.1
   B1   B3   B4   B5   B6   B7   NT3   NT4   2K   XP  更新: 1999/02/08 osamu 編集
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;

参照: [builder:5012] <コンポーネント > <Standard> <メニュー>

[新規作成] [最新の情報に更新]

How To
Lounge
KeyWords


Tips
Delphi
Home
Osamu Takeuchi osamu@big.or.jp