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


Автор: Timonn 13.9.2005, 13:46
призапуске программы нужно сформировать пункты меню, это у меня еще кое-как получилось, но как обратиться к событиям каждого пункта (т.е. присвоить каждому пункту событие) я не знаю...

пологите ПЖАЛУЙСТА!!!!

Автор: _hunter 13.9.2005, 13:56
ты справку бы посмотрел...
Цитата
This example demonstrates how to add and delete menu items to a popup menu at runtime and assign an event handler to the OnClick event.

void __fastcall TForm1::AddButtonClick(TObject *Sender)
{
    const int num_items = 4;
    for (int index = 0; index < num_items; ++index)
    {
        TMenuItem *NewItem = new TMenuItem(PopupMenu1); // create the new item
        PopupMenu1->Items->Add(NewItem);// add it to the Popupmenu
        NewItem->Caption = "Menu Item " + IntToStr(index);
        NewItem->Tag = index;
        NewItem->OnClick = PopupMenuItemsClick;// assign it an event handler

    }
}

void __fastcall TForm1::PopupMenuItemsClick(TObject *Sender)
{
    TMenuItem *ClickedItem = dynamic_cast<TMenuItem *>(Sender);
    if (ClickedItem)
    {
        switch (ClickedItem->Tag)
        {
            case 0:
            {
                ShowMessage("first item clicked");
                break;
            }
            case 1:
            {
                ShowMessage("second item clicked");

                break;
            }
            // etc...
        }
    }
}

To edit or destroy an item, grab its pointer via the TMenuItem::Items property.

void __fastcall TForm1::EditButtonClick(TObject *Sender)
{
    const int index = 1;
    TMenuItem *ItemToEdit = PopupMenu->Items->Items[index];
    ItemToEdit->Caption = "Changed Caption";
}

void __fastcall TForm1::DestroyButtonClick(TObject *Sender)
{
    const int index = 2;
    TMenuItem *ItemToDelete = PopupMenu->Items->Items[index];
    delete ItemToDelete;
}

Автор: Timonn 13.9.2005, 14:10
а то же самое но на делфи ?

Автор: _hunter 13.9.2005, 14:51
открой справку делфи...

в принципе все аналогично ( только вместо new TMenuItem() -- TMenuItem.Create() )

Автор: Akella 13.9.2005, 17:10
//dbgCustomSelect - TDBGrid, pmColumns2 - TPopupMenu


Код

procedure TfmCustomSelect.MenuItem1Click(Sender: TObject);
begin
  ShowHideColumn((sender as TMenuItem).Caption);
end;



Код

procedure TfmCustomSelect.ShowHideColumn(MenuItemCaption:String);
Var
 i,j:Cardinal;
begin
  with dbgCustomSelect 
  do begin
     For i := 0 to Columns.Count-1
     do begin
       For j := 0 to pmColumns2.Items.Count-1
       do begin
         if Columns[i].Title.Caption = MenuItemCaption//pmColumns.Items[j].Caption
         then Columns[i].Visible := not Columns[i].Visible;//pmColumns.Items[j].Checked;


       end;//if

     end;//for
 end;//with
end;//proc


Код

procedure TfmCustomSelect.pmColumns2Popup(Sender: TObject);
Var
 i:Cardinal;
 MenuItem : TMenuItem;
begin
  with dbgCustomSelect
  do begin
//------------------------------------------------------------------------------
//устанавливаем Caption и видимость меню, соответственно сетке
     pmColumns2.Items.Clear;
     For i := 0 to Columns.Count-1
     do begin
       MenuItem := TMenuItem.Create(pmColumns2);
       MenuItem.Caption := Columns[i].Title.Caption;
       MenuItem.Checked := Columns[i].Visible;

---->       MenuItem.OnClick := MenuItem1Click; <----------

       pmColumns2.Items.Add(MenuItem);
     end;//for
 end;//with
end;


Добавлено @ 17:11
На стадии проектирования меню пустое

Автор: Timonn 14.9.2005, 08:07
а есть разница в том, что мне этот алгоритм для MainMenu нужен, а не для PopUpMenu ???

Автор: Akella 14.9.2005, 10:43
нет разницы,
разве у MainMenu нет Items??? smile

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