Форум: "Основная";
Текущий архив: 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.055 c