Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > MainMenu - как работать с элементами ?


Автор: Erazer 20.6.2008, 02:21
Есть у меня MainMenu,структуры File,Edit,about. В Edit,пунктик paste, так вот, как к нему правильно обратиться чтобы сделать  .Enabled := True/.Enabled := False; ? с popupmenu разобрался эмпирическим путем 
Код

JvPopupMenu1.Items[2].Enabled := True;
, а тут не врублюсь  smile 

Автор: Max_Rendel 20.6.2008, 03:04
Допустим твоё меню состоит из 2-х пунктов: 1)File и 2)Edit. Пункт Edit
 содержит два подпункта: 1)Copy и 2)Paste.
Вот код чтобы выключить подпункт Paste:
Код

MainMenu1.Items.Items[1].Items[1].Enabled := False;

Автор: THandle 20.6.2008, 06:17
Структура TMainMenu такова:

Сначала идут Items, отвечающие за верхние пункты меню(на рисунке обведено красным). Индексы этого меню начинаются с нуля, то есть к ним надо обращаться так:

Код

MainMenu.Items[0];
MainMenu.Items[1];
MainMenu.Items[2];


И тд.

Дальше идут выпадающие меню, которые появляются по щелчку по пункту в первой полосе. Эти помечены на рисунке зеленым. Индексация у них начинается тоже с нуля. Обращаться к ним надо так:
Код


MainMenu.Items[x].Items[0];
MainMenu.Items[y].Items[0];
MainMenu.Items[x].Items[1];


и тд.

Где x, y - какие-то индексы верхней полосы.

Теперь у каждого пункта выпадающих меню, может быть любой вложенности SubMenu. Индексация всех SubMenuб как впрочем и всех других Items MainMenu начинается с нуля. На рисунке они помечены желтым. Обращаться к ним можно так:

Код

MainMenu.Items[x].Items[0].Items[2].Items[0].Items[z];
MainMenu.Items[y].Items[x].Items[1];
MainMenu.Items[x].Items[x].Items[y].Items[1];



и тому подобное...

Нерусские буквы, как вы уже поняли, являются некими индексами.



Теперь рисунок:

http://ipicture.ru/


Разберемся на примере свойства Caption, каждого Items, какие же индексы имеют элементы меню на рисунке:
Код


procedure TForm1.Button1Click(Sender: TObject);
begin
  ShowMessage(MainMenu1.Items[0].Caption);  //&Menu
  ShowMessage(MainMenu1.Items[0].Items[0].Caption); //1
  ShowMessage(MainMenu1.Items[0].Items[1].Caption); //2
  ShowMessage(MainMenu1.Items[0].Items[0].Items[0].Caption); //3
  ShowMessage(MainMenu1.Items[0].Items[0].Items[0].Items[0].Caption); //4
end;



В комментариях показано, то что находится в нашем меню по соответствующим индексам.

Автор: Erazer 20.6.2008, 09:36
 smile  smile 

Автор: FromUZB 24.1.2009, 21:52
Как их находить понятно, спасибо за разъяснение.
А вот мне тут автоматом нужно меню заполнять из названий PageControl'a не подскажите каким образом?
Вот наработки так сказать  smile 
Код

procedure TfmMain.FormCreate(Sender: TObject);
var
  i : integer;
  a,b : string;
begin

  for I := 0 to (PageControl.PageCount) - 1 do
    begin
      a := PageControl.Pages[i].Caption;
      b := PageControl.Pages[i].Name;
      //MainMenu.Items[2].Add(); тут должно быть что-то, но я не въеду что конкретно  :(
      mmFilter.Name := b;
      mmFilter.Caption := a;
    end;
end;

Автор: Quartz 25.1.2009, 02:10
Код
var
  item: TMenuItem;
begin
  item := TMenuItem.Create(Self);
  item.Caption := 'My item';
  item.OnClick := MyItemClick;
  MainMenu.Items[2].Add( item );
end;

Только лучше к элементу обращаться по имени (если возможно), а не по индексу.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)