Topic: Как динамически создать контекстное меню для TableGrid ?

Есть таблица в БД "Шаблоны писем".
Таблица содержит поля "Имя шаблона","Тема письма", "Текст письма"
На форме есть таблица "Товары".
Надо при запуске приложения создать динамически контекстные пункты меню (правый клик) для этой таблицы, где каждый пункт меню соответствует шаблонам писем.
Т.е. сколько есть разных шаблонов в БД, столько и пунктов меню.
При клике на выбранный пункт шаблона должна запускаться одна и та же процедура, но в нее надо передать список выбранных строк товаров (массив ID товаров) и ID шаблона письма.
Каким образом динамически задавать пункты меню, если обычно их надо объявлять в блоке var?

Re: Как динамически создать контекстное меню для TableGrid ?

Задачу свою решил по материалам форума.
Может кому-нибудь полезно будет:
//
procedure CreateTblMenu();
var
       TemplateItem:TMenuItem;
    SData:TDataSet;
begin
        // построение всплывающего меню шаблонов писем

       SQLQuery('SELECT id, template_name FROM tbl_email_templates', SData);//список всех id шаблонов писем

       while not SData.eof do
       begin
           TemplateItem:= TMenuItem.Create(Form_1);
           TemplateItem.Caption := SData.FieldByName('template_name').asString; // пункт меню = наименование шаблона письма
           TemplateItem.Hint := SData.FieldByName('id').asString; // запоминаем id шаблона письма у данного пункта меню
           Form_1.TableGrid_1.dbPopupMenu.Items.Insert(3, TemplateItem); // Отображаем пункт меню
           TemplateItem.OnClick := @CreateMessage; //у всех пунктов меню одна и та же процедура
           SData.Next;
       end;


end;

procedure CreateMessage(Sender:string);
begin
    // создаем сообщение
     Frm_Email_Message.Edit_TemplateID.Text := TMenuItem(Sender).Hint; // получаем ID шаблона выбранного пункта меню
     ...
     Frm_Email_Message.Show; // отображаем форму письма, применив шаблон письма в соотв. с его ID

end;
//
А если кто-нибудь подскажет, как создавать подобным образом пункты меню, передавая еще и имя процедуры, которую он должен выполнить, то совсем здорово будет.

Re: Как динамически создать контекстное меню для TableGrid ?

mikhail_a wrote:

А если кто-нибудь подскажет, как создавать подобным образом пункты меню, передавая еще и имя процедуры, которую он должен выполнить, то совсем здорово будет.

Можно передать имя процедуры как строку:

procedure CreateTblMenu( AProcName:string );
var
  TemplateItem:TMenuItem;
begin
   ...
  TemplateItem.OnClick := AProcName; 
   ...
end;
Визуальное программирование: блог и телеграм-канал.