Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.01.01;
Скачать: CL | DM;

Вниз

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

 
Иевлев Дмитрий   (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;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.026 c
2-1134803785
MAXHO
2005-12-17 10:16
2006.01.01
Как узнать запущен процесс или нет?


6-1126594397
VS
2005-09-13 10:53
2006.01.01
Интернетпочта


11-1116100264
Thaddy
2005-05-14 23:51
2006.01.01
TlistEx?


2-1134333611
Destroyer
2005-12-11 23:40
2006.01.01
Как выделить расширение файла из его имени?


4-1130580452
Hando
2005-10-29 14:07
2006.01.01
Сканирование изображения