TWebMainMenu

Hi,

How can I switch menus in the same container?

Thanks,

Ken

I'm not sure what you mean.
What is 'switch menus'? You have two menus you want to alternate with at form level?
Or something else?

Yes. I have multible tabs. When the tab is changed I want to use the appropriate menu for that tab.

The best solution I can find so far i to have a base menu and update this menu in the TWebPageControl OnChange event:

  if WebPageControl1.ActivePage.Tag=1 then
  begin
    BaseMenu.BeginUpdate;
    BaseMenu.Items.Assign(WebMainMenu1.Items);
    BaseMenu.EndUpdate;
  end else
  if WebPageControl1.ActivePage.Tag=2 then
  begin
    BaseMenu.BeginUpdate;
    BaseMenu.Items.Assign(WebMainMenu2.Items);
    BaseMenu.EndUpdate;
  end;

I spoke to soon. The TMenuItem events aren't assigned.

This works:

  case WebPageControl1.ActivePageIndex of
    0:BaseMenu:=WebMainMenu1;
    1:BaseMenu:=WebMainMenu2;
  end;
  BaseMenu.Container:=WebHTMLDiv2;
  BaseMenu.Visible:=True;

  TfrmMain = class(TWebForm)
    MainMenu: TWebMainMenu
  public
    { Public declarations }
    procedure MainMenuDelete();
    procedure MainMenuInsert();
    procedure MainMenuInsertSub();
    procedure DoMainMenuClick(Sender: TObject);
  end;


procedure TfrmMain.MainMenuDelete();
var
  I: Integer;
  LMenuItem: TMenuItem;
begin
  MainMenu.BeginUpdate;
  try
    LMenuItem := TMenuItem(MainMenu.Components[0]);
    for I := LMenuItem.Items.Count-1 downto 0 do
    begin
      LMenuItem.Items.Delete(I);
    end;
  finally
    MainMenu.EndUpdate;
  end;
end;

procedure TfrmMain.MainMenuInsert(AParentItem: TMenuItem);
var
  LMenuItemNew: TMenuItem;
  LMenuIndex: Integer;
begin
  MainMenu.BeginUpdate;
  try
    if AParentItem=nil then
      LMenuIndex := MainMenu.Items.Count
    else
      LMenuIndex := AParentItem.Count;

    LMenuItemNew := TMenuItem.Create(nil);
    LMenuItemNew.Name := 'ITEM_' + IntToStr(LMenuIndex); // encode parameter data in name
    LMenuItemNew.Tag := LMenuIndex; // or tag
    LMenuItemNew.Caption := 'NewMenuItem ' + IntToStr(LMenuIndex);
    LMenuItemNew.OnClick := DoMainMenuClick; // common event handler
    LMenuItemNew.Enabled := True; // or False

    if AParentItem=nil then
    begin
      //MainMenu.Items.Insert(0, LMenuItemNew); // insert item at start
      MainMenu.Items.Insert(LMenuIndex, LMenuItemNew); // insert item in the end
    end else
      AParentItem.Insert(LMenuIndex, LMenuItemNew);

  finally
    MainMenu.EndUpdate;
  end;
end;

procedure TfrmMain.MainMenuInsertSub();
var
  LMainMenuItem: TMenuItem;
  LParentItem: TMenuItem;
begin
  MainMenuInsert(nil);
  LMainMenuItem := TMenuItem(MainMenu.Components[0]);
  LParentItem := TMenuItem(LMainMenuItem.Items[LMainMenuItem.Count-1]);
  MainMenuInsert(LParentItem);
  MainMenuInsert(LParentItem);
  MainMenuInsert(LParentItem);
  MainMenuInsert(LParentItem);
  MainMenuInsert(LParentItem);
  MainMenuInsert(LParentItem);
  MainMenuInsert(LParentItem);
end;

procedure TfrmMain.DoMainMenuClick(Sender: TObject);
begin
  // read name or tag to determine action
  ShowMessage(TMenuItem(Sender).Name);
end;