Динамически создаваемый popup

Sergij Gromov
Дата: 13.05.2011 18:09:08
Имеется меню, в котором одной из позиций конструктором описано наличие субменю.

Пишу следующий код:

InUseDataSet.Open;
InUseDataSet.First;
while not InUseDataSet.Eof do
begin
i := InUseDataSet.FieldByName('Id').AsInteger;
AppendMenu(AnyUserId.Handle, mf_ByCommand, i, PChar(InUseDataSet.FieldByName('UserName').AsString));
InUseDataSet.Next;
end;
InUseDataSet.Close;

При этом чудесно создаются записи этого субменю, но тут я ламерски тупикнулся - как каждой нововозданной позиции присвоить конкретное событие, к примеру вызов функции Change(i), подставляя по событию OnClick в зависимости от клика требуемый индекс ?
Barmaley57
Дата: 13.05.2011 18:10:54
Как вариант tag
Sergij Gromov
Дата: 13.05.2011 18:40:50
Barmaley57
Как вариант tag


пардоньте, можно пример ?
Johnmen
Дата: 13.05.2011 20:52:45
СтОит заглядывать в хелп. Ну хоть иногда...
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.

procedure TForm1.AddButtonClick(Sender: TObject);
var
  index: Integer;
  NewItem: TMenuItem;
begin
  for index := 0 to 3 do
  begin
    NewItem := TMenuItem.Create(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
  end;

end;

procedure TForm1.PopupMenuItemsClick(Sender: TObject);
begin
  with Sender as TMenuItem do
  begin
    case Tag of
      0:  ShowMessage('first item clicked');
      1:  ShowMessage('second item clicked');
      2:  ShowMessage('third item clicked');
      3:  ShowMessage('fourth item clicked');
    end;
  end;
end;

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

procedure TForm1.EditButtonClick(Sender: TObject);
var
  ItemToEdit: TMenuItem;
begin
  ItemToEdit := PopupMenu.Items[1];
  ItemToEdit.Caption := 'Changed Caption';
}

procedure TForm1.DestroyButtonClick(Sender: TObject);
var
  ItemToDelete: TMenuItem;
begin
  ItemToDelete := PopupMenu.Items[2];
  ItemToDelete.Free;
end;
Sergij Gromov
Дата: 16.05.2011 10:30:26
Johnmen
СтОит заглядывать в хелп. Ну хоть иногда...


Конечно, стОит, подвожу резюме для чайников таких как я :-P

У меня имеется позиция AnyUserId среди списка PopupMenu1. Я пытался чёта мутить через AppendMenu( и это оказалось тупиковым ибо потом "ни-как".

Оказывается, по аналогии с работой с PopupMenu1 можно манипулировать с любой позицией этого меню "как с отдельным меню", то есть указав AnyUserId.Clear я очищаю всё что было в под-меню определённой позиции, и далее по примеру создание нового списка.

Благодарю всем ;)
Ramin Hashimzade
Дата: 16.05.2011 10:59:21
на всякий случаи, для mainmenu? может кому то понадибится:
  frm_Login.cmp_OraSQL_User.First;
  while not frm_Login.cmp_OraSQL_User.Eof do
  begin
    MENU_NAME := frm_Login.cmp_OraSQL_User.FieldByName('MENU_NAME').Asstring;
    REPORT_NAME := frm_Login.cmp_OraSQL_User.FieldByName('REPORT_NAME').AsString;

    toitem := cmp_MainMenu.Items[4];
    newitem := TMenuItem.Create(toitem);
    newitem.Caption := MENU_NAME;
    newitem.Name := REPORT_NAME;
    newitem.OnClick := ReportClick;
    toitem.OnClick := nil;
    toitem.Insert(toitem.Count, newitem);

    frm_Login.cmp_OraSQL_User.Next;
  end;


procedure Tfrm_Main.ReportClick(Sender: TObject);
begin

  frm_Login.cmp_OraSQL_User.Close;
  frm_Login.cmp_OraSQL_User.SQL.Clear;
  frm_Login.cmp_OraSQL_User.SQL.Add('select t.*  from mytest t');
  frm_Login.cmp_OraSQL_User.SQL.Add('where t.mytest_name = :rep_name');
  frm_Login.cmp_OraSQL_User.ParamByName('rep_name').AsString := TMenuItem(Sender).Name;
  frm_Login.cmp_OraSQL_User.Open;
  
   myfunc(myparam1, myparam2, ...)
    
end;