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

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

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

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

Сообщение Keeper » 05.08.2009 13:43:25

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

Возникла неожиданная проблема с назначением события 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 так сделать почему-то не получается. Если в нём принцип обработки событий другой, то как можно назначить компоненту обработчик?
Keeper
новенький
 
Сообщения: 22
Зарегистрирован: 05.08.2009 13:11:06
Откуда: Ярославль

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

Сообщение grigoreo » 05.08.2009 14:00:22

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


измени на Edit.OnMouseDown := @TabMouseDown;
Аватара пользователя
grigoreo
постоялец
 
Сообщения: 195
Зарегистрирован: 10.03.2009 15:43:43
Откуда: С нашей Раши

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

Сообщение Keeper » 05.08.2009 14:13:54

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


Точно! Спасибо. Хм, получается, что Delphi при присвоении переменной процедурного типа процедуры сам подставляет её адрес. Буду знать, что не надо привыкать к нехорошему :)
Keeper
новенький
 
Сообщения: 22
Зарегистрирован: 05.08.2009 13:11:06
Откуда: Ярославль

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

Сообщение yuray » 05.08.2009 15:41:46

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


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


или измени директиву {$mode objfpc} на {$mode delphi}. Тогда код Edit.OnMouseDown := TabMouseDown станет рабочим. :wink:
yuray
новенький
 
Сообщения: 95
Зарегистрирован: 22.05.2008 14:19:19
Откуда: Ровно, Украина


Вернуться в Lazarus

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

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

Рейтинг@Mail.ru