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

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

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

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

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

Сообщение BadBoyAlex »

Здравствуйте, уважаемые форумчане!
Столкнулся с проблемой. Имеется куча форм. Из одной формы я рисую на каждой меню. Так вот, для каждого меню у меня есть событие "onclick". Для передачи форме, где эти меню генерируются, использую переменную:

Код: Выделить всё

var OnClick: procedure (Sender: TObject);


Суть проблемы: при привязывании к этой переменной процедуры OnClick возникают проблемы.
Аватара пользователя
vada
энтузиаст
Сообщения: 691
Зарегистрирован: 14.02.2006 12:43:17

Сообщение vada »

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

Сообщение BadBoyAlex »

Суть проблемы вот в этом:

Код: Выделить всё

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>"
Аватара пользователя
Лекс Айрин
долгожитель
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград
Контактная информация:

Сообщение Лекс Айрин »

А зачем?

Код: Выделить всё

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 не требуется.
Аватара пользователя
BadBoyAlex
постоялец
Сообщения: 119
Зарегистрирован: 08.06.2010 12:42:23
Откуда: Россия, Белгород
Контактная информация:

Сообщение BadBoyAlex »

Лекс Айрин писал(а):А зачем?

Код: Выделить всё

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;
Аватара пользователя
vada
энтузиаст
Сообщения: 691
Зарегистрирован: 14.02.2006 12:43:17

Сообщение vada »

Если все в одном модуле, то нет проблем.
А так чтоб обработчик события был описан в другой форме... Чёта как-то криво :(
Может модуль какой Tools создать, а в нем описать обработчик события который будет месаджи рассылать формам, а те обрабатывать соответствующее событие?
Мутно это как-то получается. Может что в консерватории перепроектировать стоит?
Аватара пользователя
Sharfik
энтузиаст
Сообщения: 839
Зарегистрирован: 20.07.2013 01:04:30

Сообщение Sharfik »

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;
Аватара пользователя
BadBoyAlex
постоялец
Сообщения: 119
Зарегистрирован: 08.06.2010 12:42:23
Откуда: Россия, Белгород
Контактная информация:

Сообщение BadBoyAlex »

Sharfik, спасибо! Сработало!
Ответить