Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / OnClick у динамически созданного пункта MainMenu. / 25 сообщений из 26, страница 1 из 2
13.05.2007, 11:05
    #34521509
yura-007
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
OnClick у динамически созданного пункта MainMenu.
Всем привет! Ранее я спрашивал как удалять динамически созданные пункты в 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
13.05.2007, 11:09
    #34521513
Alexandr Kochmin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
OnClick у динамически созданного пункта MainMenu.
y> Она работает, но какой бы пункт меню я не выбрал, выполняются одни и
y> теже действия, а хотелось бы чтоб разные, пробовал условие сообразить,
y> но чёт не получилось. Что можно придумать? Заранее благодарен!

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


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

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
13.05.2007, 11:10
    #34521514
кошмар
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
OnClick у динамически созданного пункта MainMenu.
Код: 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
13.05.2007, 11:42
    #34521528
yura-007
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
OnClick у динамически созданного пункта MainMenu.
Условие самое обычное, если выбран пункт такой-то, то так-то и всё!

сейчас вот так попробую:
Код: plaintext
addsubitem(s, too, newitemClick);
За идею спасибо Кошмару!
...
Рейтинг: 0 / 0
13.05.2007, 12:28
    #34521564
Infernal V. Raven
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
OnClick у динамически созданного пункта MainMenu.
Если действия однотипные, разумнее импользовать Tag, или присвоение имени итемам с последующим мх чтением в событии TComponent(Sender).Name
---
aka VIR. No pity. No mercy. No remorse. No Regret
...
Рейтинг: 0 / 0
13.05.2007, 13:12
    #34521613
yura-007
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
OnClick у динамически созданного пункта MainMenu.
Что-то никак не получается сделать этот 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
13.05.2007, 13:57
    #34521651
A.K.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
OnClick у динамически созданного пункта MainMenu.
Пиши в TMenuItem.Tag номер книги, а в едином обработчике OnClick считывай Tag кликнутого пункта меню. Для этого нужно все-таки понять суть и назначение Sender'а в обработчиках событий:
Код: plaintext
1.
  Kniga := (TSender  as  TMenuItem).Tag;
  OtkroyKnigu (Kniga);
...
Рейтинг: 0 / 0
13.05.2007, 15:47
    #34521727
yura-007
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
OnClick у динамически созданного пункта MainMenu.
A.K.Пиши в TMenuItem.Tag номер книги, а в едином обработчике OnClick считывай Tag кликнутого пункта меню. Для этого нужно все-таки понять суть и назначение Sender'а в обработчиках событий:
Код: plaintext
1.
  Kniga := (TSender  as  TMenuItem).Tag;
  OtkroyKnigu (Kniga);

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

Был какой-то нюанс с этими меню. Я сейчас не вспомню точно, но как-то нарвался, что в качестве Sender приходил TAction.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
17.03.2009, 17:55
    #35874975
konffetkA
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
OnClick у динамически созданного пункта MainMenu.
Всем, добрый день!
сталкнулась с такой же проблемой... не могу присвоить 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
17.03.2009, 21:21
    #35875287
Gator
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
OnClick у динамически созданного пункта MainMenu.
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
18.03.2009, 08:32
    #35875637
Green2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
OnClick у динамически созданного пункта MainMenu.
2 konffetkA
Предлагаю создать таблицу записнй из 2 полей вида:
имя процедуры, ссылка на процедуру

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

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
18.03.2009, 09:55
    #35875761
konffetkA
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
OnClick у динамически созданного пункта MainMenu.
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
18.03.2009, 10:00
    #35875773
konffetkA
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
OnClick у динамически созданного пункта MainMenu.
Green2
2 konffetkA
Предлагаю создать таблицу записнй из 2 полей вида:
имя процедуры, ссылка на процедуру

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

как правильно организовать?
...
Рейтинг: 0 / 0
18.03.2009, 11:08
    #35875974
konffetkA
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
OnClick у динамически созданного пункта MainMenu.
а можно как то определить, когда я вытаскиваю из ини-файла название процедуры,чтоб процедура опредилялась как процедура, а не как просто вытащенная строка из файла???
...
Рейтинг: 0 / 0
18.03.2009, 11:57
    #35876190
rilio
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
OnClick у динамически созданного пункта MainMenu.
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
18.03.2009, 12:27
    #35876303
konffetkA
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
OnClick у динамически созданного пункта MainMenu.
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
18.03.2009, 12:30
    #35876318
Michael Longneck
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
OnClick у динамически созданного пункта MainMenu.
автор M.Data:=Pointer(Self);
M.Code:=Self.MethodAddress('Dummy');
Proc := TProc(M);
Proc;


Истинная жесть. Не надо так делать.
...
Рейтинг: 0 / 0
18.03.2009, 13:18
    #35876503
konffetkA
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
OnClick у динамически созданного пункта MainMenu.
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
18.03.2009, 13:21
    #35876514
OracleLover
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
OnClick у динамически созданного пункта MainMenu.
EgaFedor_71Спасибо!! Fedor_71
Чего только не придумают с этим Sender и Self весь день голову ломал, как выловить имя нажатой кнопки в MDI приложении.
Label1.Caption := (Sender as TMenuItem).Name;

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

Возможно по клику на меню висел ActionList, который и вызывал Action.Execute?
...
Рейтинг: 0 / 0
19.03.2009, 14:10
    #35879260
konffetkA
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
OnClick у динамически созданного пункта MainMenu.
тут опять проблемка возникла..
у меня 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
19.03.2009, 14:21
    #35879297
rilio
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
OnClick у динамически созданного пункта MainMenu.
Вам надо объявить TProc как
Код: plaintext
1.
TProc =  procedure (Sender: TObject)  of   object ;
и вызывать потом
Код: plaintext
Proc(Sender);
...
Рейтинг: 0 / 0
19.03.2009, 14:27
    #35879322
konffetkA
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
OnClick у динамически созданного пункта MainMenu.
rilioВам надо объявить TProc как
Код: plaintext
1.
TProc =  procedure (Sender: TObject)  of   object ;
и вызывать потом
Код: plaintext
Proc(Sender);


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


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


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


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