Компонент-наследник. Как правильно подменить событие.

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

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

Ответить
Аватара пользователя
wofs
постоялец
Сообщения: 379
Зарегистрирован: 05.10.2009 10:16:55
Откуда: Астрахань
Контактная информация:

Компонент-наследник. Как правильно подменить событие.

Сообщение wofs »

Доброго дня.
Унаследовался от TTreeView, описал нужные мне функции. Но возник вопрос.
У TTreeView есть событие OnSelectionCanged. Я его использую в своем компоненте-наследнике, что делает невозможным корректное использование его в дальнейшем. То есть при использовании этого события в программе событие в компоненте-наследнике не работает, что нарушает логику работы наследника.

Как правильно выйти из данной ситуации?
Аватара пользователя
Снег Север
долгожитель
Сообщения: 3071
Зарегистрирован: 27.11.2007 15:14:47
Контактная информация:

Сообщение Снег Север »

Извините, непонятно ничего. У вашего наследника свой экземпляр, у которого свой конкретный OnSelectionCanged. Каким образом какое использование OnSelectionCanged у других экземпляров класса в другом месте может на него повлиять?
Аватара пользователя
wofs
постоялец
Сообщения: 379
Зарегистрирован: 05.10.2009 10:16:55
Откуда: Астрахань
Контактная информация:

Сообщение wofs »

Снег Север писал(а):Извините, непонятно ничего.

Создаю компонент-наследник

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

TwfTreeView = class(TTreeView)

В конструкторе

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

constructor TwfTreeView.Create(AnOwner: TComponent);

Использую событие для своих нужд

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

OnSelectionChanged:= @wfOnSelectionChanged;


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

procedure TwfTreeView.wfOnSelectionChanged(Sender: TObject);
begin
   fCurrentId:= GetCurrentId;
   fParentId:= GetParrentId;
end;     


Если я в коде программы, создав экземпляр своего компонента:

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

wfTreeView1: TwfTreeView;

использую событие

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

wfTreeView1.OnSelectionChanged:=@fOnSelectionChanged;

то конструкция, располагающаяся в коде моего наследника

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

procedure TwfTreeView.wfOnSelectionChanged(Sender: TObject);
begin
   fCurrentId:= GetCurrentId;
   fParentId:= GetParrentId;
end;     

ожидаемо перестает работать.
Как сделать так, что бы событие не перекрывалось?
olegy123
долгожитель
Сообщения: 1643
Зарегистрирован: 25.02.2016 11:10:20

Сообщение olegy123 »

есть два пути
1) не совсем неправильный
в потомке указать на внутреннюю функцию-обработчик callback вызова.

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

OnSelectionChanged:= @wfOnSelectionChanged;
..
procedure TwfTreeView.wfOnSelectionChanged(Sender: TObject);


- тогда OnSelectionChanged будет занята, и если другой решит предопределить OnSelectionChanged тогда внутренний код перестанет работать.

2) выяснить кто вызывает OnSelectionChanged

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

  TCustomTreeView = class(TCustomControl)
..
procedure DoSelectionChanged; virtual;
..
  if Assigned(OnSelectionChanged) then OnSelectionChanged(Self);
..

DoSelectionChanged - вызывается внутри, имеет virtual, можно перекрыть своим DoSelectionChanged.
Vadim
долгожитель
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Сообщение Vadim »

wofs
А зачем прямо в классе присутствует присвоение событию OnSelectionChanged? Уберите его и делайте присвоение только в экземпляре класса. И всё будет тип-топ.
Аватара пользователя
Снег Север
долгожитель
Сообщения: 3071
Зарегистрирован: 27.11.2007 15:14:47
Контактная информация:

Сообщение Снег Север »

Vadim писал(а):А зачем прямо в классе присутствует присвоение событию OnSelectionChanged? Уберите его и делайте присвоение только в экземпляре класса. И всё будет тип-топ.
Да, конечно, так и надо.
Аватара пользователя
Ichthyander
энтузиаст
Сообщения: 701
Зарегистрирован: 04.04.2007 08:32:43
Откуда: Астрахань
Контактная информация:

Сообщение Ichthyander »

Кажется единственно правильное и самое простое здесь это то что описал olegy123 во втором пункте. Практически для всех событий OnSomeMethod есть процедура DoSomeMethod, которую можно и нужно override'ить для этих целей
Аватара пользователя
wofs
постоялец
Сообщения: 379
Зарегистрирован: 05.10.2009 10:16:55
Откуда: Астрахань
Контактная информация:

Сообщение wofs »

olegy123 писал(а):2) выяснить кто вызывает OnSelectionChanged

Спасибо! То, что надо!
Ответить