Как передать ссылку на событие?

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Как передать ссылку на событие?

Сообщение BadBoyAlex » 14.07.2015 17:00:56

Здравствуйте, уважаемые форумчане!
Столкнулся с проблемой. Имеется куча форм. Из одной формы я рисую на каждой меню. Так вот, для каждого меню у меня есть событие "onclick". Для передачи форме, где эти меню генерируются, использую переменную:
Код: Выделить всё
var OnClick: procedure (Sender: TObject);


Суть проблемы: при привязывании к этой переменной процедуры OnClick возникают проблемы.
Аватара пользователя
BadBoyAlex
постоялец
 
Сообщения: 119
Зарегистрирован: 08.06.2010 12:42:23
Откуда: Россия, Белгород

Re: Как передать ссылку на событие?

Сообщение vada » 14.07.2015 17:55:34

Понятно. Суть проблемы в проблеме.
Аватара пользователя
vada
энтузиаст
 
Сообщения: 691
Зарегистрирован: 14.02.2006 13:43:17

Re: Как передать ссылку на событие?

Сообщение BadBoyAlex » 14.07.2015 17:59:32

Суть проблемы вот в этом:
Код: Выделить всё
CompilerForm.pas(130,24) Error: Incompatible types: got "TPRToolBarVars.<procedure variable type of procedure(TObject);Register>" expected "<procedure variable type of procedure(TObject) of object;Register>"
Аватара пользователя
BadBoyAlex
постоялец
 
Сообщения: 119
Зарегистрирован: 08.06.2010 12:42:23
Откуда: Россия, Белгород

Re: Как передать ссылку на событие?

Сообщение Лекс Айрин » 14.07.2015 18:01:04

А зачем?
Код: Выделить всё
procedure TMainForm.MenuCreateClick(Sender: TObject);
begin
  if MyFile = '' then
  begin

    {MainForm.}MenuSaveAs.Click; //вызов процедуры MenuSaveAsClick(Sender: TObject);
    MainEditor.Clear;
  end
  else
  begin
    F_Save;
    MyFile := 'новый.txt';
    MainForm.Caption := MyFile + ':LexEditor';
    MainForm.MainEditor.Clear;
  end;
end;       

Никакого onclick не требуется.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Как передать ссылку на событие?

Сообщение BadBoyAlex » 14.07.2015 18:28:23

Лекс Айрин писал(а):А зачем?
Код: Выделить всё
procedure TMainForm.MenuCreateClick(Sender: TObject);
begin
  if MyFile = '' then
  begin

    {MainForm.}MenuSaveAs.Click; //вызов процедуры MenuSaveAsClick(Sender: TObject);
    MainEditor.Clear;
  end
  else
  begin
    F_Save;
    MyFile := 'новый.txt';
    MainForm.Caption := MyFile + ':LexEditor';
    MainForm.MainEditor.Clear;
  end;
end;       

Никакого onclick не требуется.

Дело в том, что я программно добавляю элементы меню.
Код: Выделить всё
function TCompilerFrm.AddMenuItem (const ARootItemIndex: integer; const ACaption: string; const AImageIndex: integer; const AScriptID: byte): integer;
var RootItem, MItem: TMenuItem;
begin
RootItem:= (MainFrm.ToolBarVars.tvrToolBarOwner as TMenu).Items.Items[ARootItemIndex];
MItem:= TMenuItem.Create(MainFrm.ToolBarVars.tvrToolBarOwner);
MItem.Caption:= ACaption;
MItem.ImageIndex:= AImageIndex;
MItem.Tag:= AScriptID;
{ TODO -oI -cБаги : Удалить зависимость от MainFrm }
MItem.OnClick:= MainFrm.ToolBarVars.tvrMenuOnClick;
RootItem.Add(MItem);
Result:= RootItem.IndexOf(MItem);
end;
Аватара пользователя
BadBoyAlex
постоялец
 
Сообщения: 119
Зарегистрирован: 08.06.2010 12:42:23
Откуда: Россия, Белгород

Re: Как передать ссылку на событие?

Сообщение vada » 14.07.2015 18:55:25

Если все в одном модуле, то нет проблем.
А так чтоб обработчик события был описан в другой форме... Чёта как-то криво :(
Может модуль какой Tools создать, а в нем описать обработчик события который будет месаджи рассылать формам, а те обрабатывать соответствующее событие?
Мутно это как-то получается. Может что в консерватории перепроектировать стоит?
Аватара пользователя
vada
энтузиаст
 
Сообщения: 691
Зарегистрирован: 14.02.2006 13:43:17

Re: Как передать ссылку на событие?

Сообщение Sharfik » 14.07.2015 19:10:23

BadBoyAlex писал(а):Здравствуйте, уважаемые форумчане!
Столкнулся с проблемой. Имеется куча форм. Из одной формы я рисую на каждой меню. Так вот, для каждого меню у меня есть событие "onclick". Для передачи форме, где эти меню генерируются, использую переменную:
Код: Выделить всё
var OnClick: procedure (Sender: TObject);


Суть проблемы: при привязывании к этой переменной процедуры OnClick возникают проблемы.

По реализации уже писали без меня, напишу про саму переменную.
Почему ты не посмотрел как реализовано хранение указателей на процедуры такие как OnClick в классах компонентах и формах?
Переменная неправильно описана, переменная должна хранить указатель на тип данных. Для твоей процедуры это TNotifyEvent. Изучи класс TCustomForm и его переменные/свойства.
Исходя из того, что:
Код: Выделить всё
TNotifyEvent = procedure(Sender: TObject) of object;

получаем
Код: Выделить всё
var
MyProc:TNotifyEvent;
begin
MyProc;=nil;
...
MyProc:=@btnDoSomething;
//btnDoSomething должен быть частью какого то класса, потому что выше сказано "of object".
...
if Assigned(MyProc) then
begin
  MyProc(nil);
end;
end;
Аватара пользователя
Sharfik
энтузиаст
 
Сообщения: 809
Зарегистрирован: 20.07.2013 01:04:30

Re: Как передать ссылку на событие?

Сообщение BadBoyAlex » 14.07.2015 19:30:26

Sharfik, спасибо! Сработало!
Аватара пользователя
BadBoyAlex
постоялец
 
Сообщения: 119
Зарегистрирован: 08.06.2010 12:42:23
Откуда: Россия, Белгород


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 225

Рейтинг@Mail.ru