Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2006.01.01;
Скачать: [xml.tar.bz2];

Вниз

добавить событие для пункта меню   Найти похожие ветки 

 
Иевлев Дмитрий   (2005-12-04 21:05) [0]

Добрый вечер.
Подскажите пожалуйста как повесить реакцию на клик для динамически созданых пунктах меню.
Я создаю пункты меню, вызывая для этого мою процедуру из dll.
Возникла проблемка с реакциями этих пуктов меню, на OnClick  они не реагируют.
Я для ChildItem (класс TMenuItem) присваиваю свойство OnClick:  ChildItem.OnClick:=myClass.myReaction.
Объект myClass я уже создал.  
Посмотрел, после присваивания FOnClick у ChildItem уже меняется с nil на $4AB... , т.е. вроде бы уже присвоил.
Когда прога запускается никакой реакции на клик нет, но появился побочный эффект...
В пунктах меню которые я создаю и которые являются родительскими, событие OnClick такое как я и назначил.
Наверное уже с этим боролись, подскажите где посмотреть прочесть или что я не так делаю.


 
Palladin ©   (2005-12-04 21:19) [1]


> Я создаю пункты меню, вызывая для этого мою процедуру из
> dll.

Подробней


 
Иевлев Дмитрий   (2005-12-04 21:57) [2]

Попробую поподробнее, ситуация такова:
в DLL находится ф-ция, назовём её MenuBuilder, она получает массив, по которому выстраивает главное меню формы.
выглядит примерно так:
   ChildItem:=TMenuItem.Create(MainMenu);
   ChildItem.Name:=fnListPTR^[i].fnMenuItemName;<--fnListPTR массив строк
   ChildItem.Caption:=fnListPTR^[i].fnMenuItemCaption;
   ChildItem.OnClick:=zxReactor.OnClickReaction;!!!!!
   TMenuItem(index).Add(ChildItem);

zxReactor объявлял так:

type
 TzxReactor=class(TObject)
 public
 procedure OnClickReaction(sender: TObject);
 end;

implementation

{ TzxReactor }

procedure TzxReactor.OnClickReaction(sender: TObject);
begin
ShowMessage("Oh my God! It`s working!!!");
end;
   
менюитемы создаются, вот не известно куда реакция на онклик пропадает...


 
Иевлев Дмитрий   (2005-12-04 22:05) [3]

если эту же ф-цию сделать, как метод главной формы, то без вопросов работает, а в DLL нет, хотя и ошибок не выкидывает


 
Profi ©   (2005-12-05 03:18) [4]

Иевлев Дмитрий   (04.12.05 22:05) [3]
Нужно делать через COM.


 
Andron.Ru ©   (2005-12-05 08:42) [5]

type
TMyMenuIt=class(TMenuItem)
private
 .....
public
  procedure Click; override;
  constructor Create(Aowner: TComponent); override;
end;

implementation

constructor TMyMenuIt.Create(Aowner: TComponent);
begin
  inherited Create(Aowner);
  Здесь прописывваешь поэтапно создание строки меню
end;  

procedure TMyMenuIt.Click;
begin
 Твой обработчик нажатия....
end;

end.

Чтото наподобие.......
Почитай FAQ по созданию компонентов, там как раз нароешь то что тебе надо.....
А лучше создай свой компонент от TMenu и добавь к нему то что тебе надо...

Вот...


 
TStas ©   (2005-12-05 13:27) [6]

OnClick: TNotifyEvent //procedure(Sender: TObject) of object То есть есть обработчик не метод объекта, работать не будет


 
SergGG ©   (2005-12-05 14:45) [7]

попробуй так


 public
   { Public declarations }
   procedure WMClick(var Msg:TWMMenuSelect);message messages.WM_MENUSELECT;
 end;

 var NewItem:array[0..10]of TMenuItem;

var
 Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.WMClick;
begin
 if msg.IDItem>0 then
 begin
   ShowMessage(NewItem[msg.IDItem-1].Caption);
 end;
end;



 
Leonid Troyanovsky ©   (2005-12-05 15:03) [8]


> TStas ©   (05.12.05 13:27) [6]

> То есть есть обработчик не метод объекта, работать не будет


Если б даже он был таковым, то работать в dll, все равно, не обязан,
бо Menus and Menus - две разные вещи.

--
Regards, LVT.


 
Leonid Troyanovsky ©   (2005-12-05 15:08) [9]


> SergGG ©   (05.12.05 14:45) [7]

>    procedure WMClick(var Msg:TWMMenuSelect);message WM_MENUSELECT;


А почему "Ы"?

--
Regards, LVT.


 
SergGG ©   (2005-12-05 15:47) [10]


> А почему "Ы"?

Не понял!


 
Leonid Troyanovsky ©   (2005-12-05 15:51) [11]


> SergGG ©   (05.12.05 15:47) [10]

> Не понял!


Почему WMClick? Т.е., чтоб никто не догадался?

--
Regards, LVT.


 
SergGG ©   (2005-12-05 15:59) [12]


> Почему WMClick? Т.е., чтоб никто не догадался?


всё равно не понял.

Вот весь код с Click-ом:

unit UMenuCklik;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls, Menus, ComCtrls;

type
 TForm1 = class(TForm)
   Button1: TButton;
   MainMenu1: TMainMenu;
   procedure Button1Click(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
   procedure WMClick(var Msg:TWMMenuSelect);message messages.WM_MENUSELECT;
 end;

 var NewItem:array[0..10]of TMenuItem;

var
 Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
I : integer;
begin
 NewItem[0] := TMenuItem.Create(Self);
 NewItem[0].Caption := "serg";
 MainMenu1.Items.Add(NewItem[0]);
 for i:=1 to 10 do begin
  NewItem[i] := TMenuItem.Create(Self);
  NewItem[i].Caption := FloatToStr(i);
  MainMenu1.Items.Add(NewItem[i]);
 end;
end;

procedure TForm1.WMClick;
begin
 if msg.IDItem>0 then
 begin
   ShowMessage(NewItem[msg.IDItem-1].Caption);
 end;
end;

end.


 
Leonid Troyanovsky ©   (2005-12-05 16:40) [13]


> SergGG ©   (05.12.05 15:59) [12]

> Вот весь код с Click-ом:


Во-первых, это код не с кликом, а с Select.
Во-вторых, Popupmenu в дельфи обрабатывает оное иначе.

В-третьих, чтоб не путаться, дельферы давно используют соглашение
об именовании message method, и в данном случае, он бы именовался
WMMenuSelect. См. для примера исходники VCL.

--
Regards, LVT.


 
SergGG ©   (2005-12-05 16:56) [14]


> Leonid Troyanovsky ©   (05.12.05 16:40) [13]

Я Согласен!


 
TStas ©   (2005-12-05 19:20) [15]

>Leonid Troyanovsky ©  
Скажите, а разве как-то можно в dll поселить метод объекта? Читал у Фленова, что умельцы в них аж объекты поселяют, но метод отдельно...


 
Leonid Troyanovsky ©   (2005-12-06 08:48) [16]


> TStas ©   (05.12.05 19:20) [15]

> Скажите, а разве как-то можно в dll поселить метод объекта?


В общем-то, методу в классической dll делать нечего.
Но, учитывая, что этот метод может пригодиться лишь дельфийскому
объекту, можно задействовать регулярную процедуру вроде
procedure X(ASelf, Sender: TObject) с приведением типа
TNotifyEvent(TMethod).
Понятно, что такое использование требует включения рантайм-пакетов
в исполнимый файл и библиотеку и пр. и пр.

--
Regards, LVT.



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2006.01.01;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.011 c
1-1133719530
Иевлев Дмитрий
2005-12-04 21:05
2006.01.01
добавить событие для пункта меню


14-1134112577
begin...end
2005-12-09 10:16
2006.01.01
С Днём рождения! 9 декабря


1-1133769750
Харько
2005-12-05 11:02
2006.01.01
Вопрос по пакетам


1-1133612665
SergP.
2005-12-03 15:24
2006.01.01
Позиция Popupmenu. Как привязать к нижнему левому углу.


14-1134197036
Kerk
2005-12-10 09:43
2006.01.01
Ура! В Самаре зима наступила! Снег кружится и падает! :)





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский