powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / OnClick у динамически созданного пункта MainMenu.
25 сообщений из 26, страница 1 из 2
OnClick у динамически созданного пункта MainMenu.
    #34521509
yura-007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем привет! Ранее я спрашивал как удалять динамически созданные пункты в MainMenu, это я сделал, спасибо добрым людям. Теперь у меня не получается сделать OnClick у каждого созданного пункта свой .
Процедура дабавления:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
 procedure  TForm2.addsubitem(s: string ; too : integer);
 var 
newitem, toitem : Tmenuitem;
 begin 
too:= 3 ;
toitem:=MainMenu1.items[too];
newitem:=tmenuitem.create(toitem);
newitem.caption:=S;
newitem.OnClick:=newitemClick;
toitem.onclick:= nil ;
toitem.insert(toitem.count,newitem);
 end ;
И вот такая процедура OnClick

Код: plaintext
1.
2.
3.
4.
 procedure  TForm2.newitemClick(Sender: TObject);
 begin 
-------------------------------------------------
------------------------------------------------
 end ;
Она работает, но какой бы пункт меню я не выбрал, выполняются одни и теже действия, а хотелось бы чтоб разные , пробовал условие сообразить, но чёт не получилось. Что можно придумать? Заранее благодарен!
...
Рейтинг: 0 / 0
OnClick у динамически созданного пункта MainMenu.
    #34521513
Alexandr Kochmin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
y> Она работает, но какой бы пункт меню я не выбрал, выполняются одни и
y> теже действия, а хотелось бы чтоб разные, пробовал условие сообразить,
y> но чёт не получилось. Что можно придумать? Заранее благодарен!

какое условие то надо?
sender.name на пойдет?


--
С уважением
Кочмин Александр
Firebird Foundation associate member #257

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
OnClick у динамически созданного пункта MainMenu.
    #34521514
кошмар
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
 procedure  TForm2.addsubitem(s: string ; too : integer; handler: TNotifyEvent);
 var 
  newitem, toitem : Tmenuitem;
 begin 
  too:= 3 ;
  toitem:=MainMenu1.items[too];
  newitem:=tmenuitem.create(toitem);
  newitem.caption:=S;
  newitem.OnClick:= handler;
  toitem.onclick:= nil ;
  toitem.insert(toitem.count,newitem);
 end ;


 procedure  TForm2.newitemClick(Sender: TObject);
 begin 
-------------------------------------------------
------------------------------------------------
 end ;


...
  addsubitem(s, too, newitemClick);
...
...
Рейтинг: 0 / 0
OnClick у динамически созданного пункта MainMenu.
    #34521528
yura-007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Условие самое обычное, если выбран пункт такой-то, то так-то и всё!

сейчас вот так попробую:
Код: plaintext
addsubitem(s, too, newitemClick);
За идею спасибо Кошмару!
...
Рейтинг: 0 / 0
OnClick у динамически созданного пункта MainMenu.
    #34521564
Фотография Infernal V. Raven
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если действия однотипные, разумнее импользовать Tag, или присвоение имени итемам с последующим мх чтением в событии TComponent(Sender).Name
---
aka VIR. No pity. No mercy. No remorse. No Regret
...
Рейтинг: 0 / 0
OnClick у динамически созданного пункта MainMenu.
    #34521613
yura-007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что-то никак не получается сделать этот OnClick.

автор Infernal V. Raven
Если действия однотипные, разумнее импользовать Tag, или присвоение имени итемам с последующим мх чтением в событии TComponent(Sender).Name
Действия однотипные, моя прога запускается и в меню создаются пункты по такому принципу:
while not DataModule8.Table1.Eof do
begin
Kniga:=DataModule8.Table1.fieldbyname('N_Knigi').AsInteger;
Form2.addsubitem('Книга №'+ inttostr(Kniga), Kniga);
DataModule8.Table1.Next;
end;
т.е. из БД читается запись, создаётся пункт меню с именем ‘Книга №’+номер из БД.
А OnClick, у каждого пункта, нужен чтоб открыть в БД запись с этим номером.
Например: меню с Caption Книга №1, должна открыть в БД запись N_Knigi=1
...
Рейтинг: 0 / 0
OnClick у динамически созданного пункта MainMenu.
    #34521651
Фотография A.K.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пиши в TMenuItem.Tag номер книги, а в едином обработчике OnClick считывай Tag кликнутого пункта меню. Для этого нужно все-таки понять суть и назначение Sender'а в обработчиках событий:
Код: plaintext
1.
  Kniga := (TSender  as  TMenuItem).Tag;
  OtkroyKnigu (Kniga);
...
Рейтинг: 0 / 0
OnClick у динамически созданного пункта MainMenu.
    #34521727
yura-007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
A.K.Пиши в TMenuItem.Tag номер книги, а в едином обработчике OnClick считывай Tag кликнутого пункта меню. Для этого нужно все-таки понять суть и назначение Sender'а в обработчиках событий:
Код: plaintext
1.
  Kniga := (TSender  as  TMenuItem).Tag;
  OtkroyKnigu (Kniga);

ОК, спасибо за совет! Буду разбираться.
...
Рейтинг: 0 / 0
OnClick у динамически созданного пункта MainMenu.
    #34928732
Fedor_71
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо!! Fedor_71
Чего только не придумают с этим Sender и Self весь день голову ломал, как выловить имя нажатой кнопки в MDI приложении.
Label1.Caption := (Sender as TMenuItem).Name;
...
Рейтинг: 0 / 0
OnClick у динамически созданного пункта MainMenu.
    #34928832
Ega
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Fedor_71Спасибо!! Fedor_71
Чего только не придумают с этим Sender и Self весь день голову ломал, как выловить имя нажатой кнопки в MDI приложении.
Label1.Caption := (Sender as TMenuItem).Name;

Был какой-то нюанс с этими меню. Я сейчас не вспомню точно, но как-то нарвался, что в качестве Sender приходил TAction.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
OnClick у динамически созданного пункта MainMenu.
    #35874975
konffetkA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем, добрый день!
сталкнулась с такой же проблемой... не могу присвоить OnClick у каждого созданного пункта свой.
у меня проблема в том что надо читать имя процедури из ини файла:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
  

 var 
  s :  string ;
  i : longint;
  tm : TMenuItem;
  Click : TNotifyEvent;
 begin 
IniFile := TIniFile.Create(ExtractFilePath(Application.ExeName) + 'main.ini');
 for  i:= 0   to  fs.MainMenu1.Items.Count- 1   do   begin 
     s := IniFile.ReadString('Menu1', 'Item'+IntToStr(i),'');
     tm := TMenuItem.Create(NSet);
     tm.Caption := Piece(s,';', 2 );
     tm.Name:=Piece(s,';', 1 );
 //причем имя присваевается повторное которое уже есть в программе но вот клик не работает... 
 //     tm.OnClick:=Click(tm.Find(Piece(s,';',2))  );; 
 //     tm.OnClick := Piece(s,';',1);  
 //строка то из ини файла считывается но вот присваевается как строка.. а не как процедура... 
 //а для каждого пункта меню процедуры разные... 

     NSet.Add(tm);
    end ;
   IniFile.Free;
   end ;

в файле main.ini:
[Menu1]
Item0=N1;Название
Item1=N2;Сумма

[Menu2]
Item0=N3;ФИО
Item1=N4;Адрес

пожалуйста, очень надо!!помогите разобраться!!
...
Рейтинг: 0 / 0
OnClick у динамически созданного пункта MainMenu.
    #35875287
Фотография Gator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
konffetkA, Вот это?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
 procedure  TForm1.MyClick(Sender: TObject);
 begin 
   ShowMessage('Wow!');
 end ;
...
  tm.OnClick := MyClick;
...


...
Рейтинг: 0 / 0
OnClick у динамически созданного пункта MainMenu.
    #35875637
Фотография Green2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 konffetkA
Предлагаю создать таблицу записнй из 2 полей вида:
имя процедуры, ссылка на процедуру

При присваивании искать ссылку в этой таблице.

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
OnClick у динамически созданного пункта MainMenu.
    #35875761
konffetkA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
GatorkonffetkA, Вот это?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
 procedure  TForm1.MyClick(Sender: TObject);
 begin 
   ShowMessage('Wow!');
 end ;
...
  tm.OnClick := MyClick;
...




так я пробывала...но в MyClick тоже надо указать что за имя процедуры ведь для каждого пункта в меню действия абсолютно разные..
...
Рейтинг: 0 / 0
OnClick у динамически созданного пункта MainMenu.
    #35875773
konffetkA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Green2
2 konffetkA
Предлагаю создать таблицу записнй из 2 полей вида:
имя процедуры, ссылка на процедуру

т.е. просто создать табл. stringGrid куда это и указывать?
а это:
Green2
При присваивании искать ссылку в этой таблице.

как правильно организовать?
...
Рейтинг: 0 / 0
OnClick у динамически созданного пункта MainMenu.
    #35875974
konffetkA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
а можно как то определить, когда я вытаскиваю из ини-файла название процедуры,чтоб процедура опредилялась как процедура, а не как просто вытащенная строка из файла???
...
Рейтинг: 0 / 0
OnClick у динамически созданного пункта MainMenu.
    #35876190
rilio
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
konffetkAа можно как то определить, когда я вытаскиваю из ини-файла название процедуры,чтоб процедура опредилялась как процедура, а не как просто вытащенная строка из файла???

Можно.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
 type 
  TfrmMain =  class (TForm)
    Button1: TButton;
     procedure  Button1Click(Sender: TObject);
   private 
   public 
   published 
     procedure  Dummy;
   end ;

  TProc =  procedure   of   object ;

 var 
  frmMain: TfrmMain;

 implementation 

 {$R *.dfm} 

 procedure  TfrmMain.Button1Click(Sender: TObject);
 var  M:TMethod;
    Proc: TProc;
 begin 
  M.Data:=Pointer(Self);
  M.Code:=Self.MethodAddress('Dummy');
  Proc := TProc(M);
  Proc;
 end ;

 procedure  TfrmMain.Dummy;
 begin 
  ShowMessage('Привет');
 end ;
...
Рейтинг: 0 / 0
OnClick у динамически созданного пункта MainMenu.
    #35876303
konffetkA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
riliokonffetkAа можно как то определить, когда я вытаскиваю из ини-файла название процедуры,чтоб процедура опредилялась как процедура, а не как просто вытащенная строка из файла???

Можно.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
 type 
  TfrmMain =  class (TForm)
    Button1: TButton;
     procedure  Button1Click(Sender: TObject);
   private 
   public 
   published 
     procedure  Dummy;
   end ;

  TProc =  procedure   of   object ;

 var 
  frmMain: TfrmMain;

 implementation 

 {$R *.dfm} 

 procedure  TfrmMain.Button1Click(Sender: TObject);
 var  M:TMethod;
    Proc: TProc;
 begin 
  M.Data:=Pointer(Self);
  M.Code:=Self.MethodAddress('Dummy');
  Proc := TProc(M);
  Proc;
 end ;

 procedure  TfrmMain.Dummy;
 begin 
  ShowMessage('Привет');
 end ;


ооооооооо то что НАДО!!!!!!! спасибо огромное!!!
...
Рейтинг: 0 / 0
OnClick у динамически созданного пункта MainMenu.
    #35876318
Michael Longneck
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
автор M.Data:=Pointer(Self);
M.Code:=Self.MethodAddress('Dummy');
Proc := TProc(M);
Proc;


Истинная жесть. Не надо так делать.
...
Рейтинг: 0 / 0
OnClick у динамически созданного пункта MainMenu.
    #35876503
konffetkA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Michael Longneckавтор M.Data:=Pointer(Self);
M.Code:=Self.MethodAddress('Dummy');
Proc := TProc(M);
Proc;


Истинная жесть. Не надо так делать.

почему? оно так работает
единственное что у меня все клики сразу вылазят а не только для выбранного пункта меню...:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
...
tm.OnClick:=NSetClick;
...

 procedure  NSetClick(Sender: TObject);
 var 
 s,ss :  string ;
 i : longint;
 M:TMethod;
 Proc: TProc;
 begin 
IniFile := TIniFile.Create(ExtractFilePath(Application.ExeName) + 'main.ini');
   for  i:= 0   to  MainMenu1.Items.Count- 1   do   begin 
     s :=IniFile.ReadString('Menu1', 'Item'+IntToStr(i),'');
     ss:=Piece(s,';', 3 );
     M.Data:=Pointer(Self);
     M.Code:=Self.MethodAddress(ss);
     Proc := TProc(M);
     Proc;
    end ;
 end ;
...
Рейтинг: 0 / 0
OnClick у динамически созданного пункта MainMenu.
    #35876514
Фотография OracleLover
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
EgaFedor_71Спасибо!! Fedor_71
Чего только не придумают с этим Sender и Self весь день голову ломал, как выловить имя нажатой кнопки в MDI приложении.
Label1.Caption := (Sender as TMenuItem).Name;

Был какой-то нюанс с этими меню. Я сейчас не вспомню точно, но как-то нарвался, что в качестве Sender приходил TAction.

Возможно по клику на меню висел ActionList, который и вызывал Action.Execute?
...
Рейтинг: 0 / 0
OnClick у динамически созданного пункта MainMenu.
    #35879260
konffetkA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
тут опять проблемка возникла..
у меня TMenuItem(Sender).Name (имя пункта меню) теряется при переходе на процедуру.
а в некоторых процедурах нужно как раз это имя.почему оно теряется? и как можно исправить?

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
 procedure  NkSetClick(Sender: TObject);
 var 
 s,s1,Value :  string ;
 i : longint;
 M:TMethod;
 Proc: TProc;
 begin 
 IniFile := TIniFile.Create(ExtractFilePath(Application.ExeName) + 'main.ini');
 i:=TMenuItem(Sender).MenuIndex;
 s := IniFile.ReadString('Menu', 'Item'+IntToStr(i),'');
 value:=TMenuItem(Sender).Name; //тут вижу что имя есть 
 s1:=Piece(s,';', 3 );
 M.Data:=Pointer(Self);
 M.Code:=Self.MethodAddress(s1); //вытаскивается имя процедуры NBSClick 
 Proc := TProc(M);
 Proc; //тут процедура запускается 
 IniFile.Free;
 end ;

 procedure  NBSClick(Sender: TObject);
 var  s: string ;
 begin 
   if  tmenuitem(sender).name='tiNN'  then   begin   //а тут имя уже неопределенно!!! 
     s:='r5';
     tiNNClick(Self);
   end 
   else     if  tmenuitem(sender).name='tiNN1  then  
              tiNNClick(Self);
 end ;
...
Рейтинг: 0 / 0
OnClick у динамически созданного пункта MainMenu.
    #35879297
rilio
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вам надо объявить TProc как
Код: plaintext
1.
TProc =  procedure (Sender: TObject)  of   object ;
и вызывать потом
Код: plaintext
Proc(Sender);
...
Рейтинг: 0 / 0
OnClick у динамически созданного пункта MainMenu.
    #35879322
konffetkA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
rilioВам надо объявить TProc как
Код: plaintext
1.
TProc =  procedure (Sender: TObject)  of   object ;
и вызывать потом
Код: plaintext
Proc(Sender);


точно! получилось!! СПАСИБО!!!!!!!!!!! :)
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
OnClick у динамически созданного пункта MainMenu.
    #39666242
aleks0aleks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
При создании динамического события для TMenuItem, чтобы узнать номер выбранного динамического пункта, надо обратиться к его полю MenuIndex. Пример для OnClick динамического элемента:


procedure TForm1.OnClickPunktMenu(Sender: TObject);
Var punkt:TMenuItem;
begin
punkt:=(Sender as TMenuItem);
x:=punkt.MenuIndex;
...
end;


x - это выбранный пункт меню, его порядковый номер, независимо от поля Tag. Дальше обрабатываете полученное значение как вам надо по типу "если х=..., то выполнить то-то и то-то".
...
Рейтинг: 0 / 0
25 сообщений из 26, страница 1 из 2
Форумы / Delphi [игнор отключен] [закрыт для гостей] / OnClick у динамически созданного пункта MainMenu.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]