Обработчик событий для созданного в Runtime компонента

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

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

Ответить
Keeper
новенький
Сообщения: 22
Зарегистрирован: 05.08.2009 13:11:06
Откуда: Ярославль

Обработчик событий для созданного в Runtime компонента

Сообщение Keeper »

Всем доброго времени суток!

Возникла неожиданная проблема с назначением события OnMouseDown компоненту. Извиняюсь, если вопрос несколько "нубский", Lazarus начал осваивать недавно, до этого писал только в разных версиях Delphi.

У меня есть на форме компонент TPageControl и мне необходимо в него в Runtime добавлять TTabSheet. С этим вроде как никаких проблем нет, вкладки добавляются. Но, при попытке назначить свойству OnMouseDown собственно обработчик, компилятор не воспринимает его как переменную процедурного типа и выдаёт ошибку:

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

 InterfaceUnit.pas(74,52) Error: Wrong number of parameters specified for call to "TabSheetMouseDown" 


Ранее, когда я делал подобное в Delphi, я пользовался следующим способом: добавлял в секцию Private класса формы процедуру с параметрами, соответствующими типу TMouseEvent:

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

  type
  TForm1 = class(TForm)
    procedure FormActivate(Sender: TObject);
  private
    procedure TabMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
  public
    { Public declarations }
  end;


писал в раздел implementation собственно код обработки:

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

procedure TForm1.TabMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  //какой-то код
end;


а потом присваивал этот метод формы свойству OnMouseDown компонента:

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

procedure TForm1.FormActivate(Sender: TObject);
var Edit: TEdit;
begin
  Edit := TEdit.Create(form1);
  Edit.Parent := form1;
  Edit.OnMouseDown := TabMouseDown;
end;


При этом всё нормально работало. В Lazarus так сделать почему-то не получается. Если в нём принцип обработки событий другой, то как можно назначить компоненту обработчик?
Аватара пользователя
grigoreo
постоялец
Сообщения: 195
Зарегистрирован: 10.03.2009 14:43:43
Откуда: С нашей Раши

Сообщение grigoreo »

Keeper писал(а): Edit.OnMouseDown := TabMouseDown;


измени на Edit.OnMouseDown := @TabMouseDown;
Keeper
новенький
Сообщения: 22
Зарегистрирован: 05.08.2009 13:11:06
Откуда: Ярославль

Сообщение Keeper »

grigoreo писал(а):измени на Edit.OnMouseDown := @TabMouseDown;


Точно! Спасибо. Хм, получается, что Delphi при присвоении переменной процедурного типа процедуры сам подставляет её адрес. Буду знать, что не надо привыкать к нехорошему :)
yuray
новенький
Сообщения: 95
Зарегистрирован: 22.05.2008 14:19:19
Откуда: Ровно, Украина

Сообщение yuray »

grigoreo писал(а):
Keeper писал(а): Edit.OnMouseDown := TabMouseDown;


измени на Edit.OnMouseDown := @TabMouseDown;


или измени директиву {$mode objfpc} на {$mode delphi}. Тогда код Edit.OnMouseDown := TabMouseDown станет рабочим. :wink:
Ответить