Компонент-наследник. Как правильно подменить событие.
Модератор: Модераторы
- wofs
- постоялец
- Сообщения: 379
- Зарегистрирован: 05.10.2009 10:16:55
- Откуда: Астрахань
- Контактная информация:
Компонент-наследник. Как правильно подменить событие.
Доброго дня.
Унаследовался от TTreeView, описал нужные мне функции. Но возник вопрос.
У TTreeView есть событие OnSelectionCanged. Я его использую в своем компоненте-наследнике, что делает невозможным корректное использование его в дальнейшем. То есть при использовании этого события в программе событие в компоненте-наследнике не работает, что нарушает логику работы наследника.
Как правильно выйти из данной ситуации?
Унаследовался от TTreeView, описал нужные мне функции. Но возник вопрос.
У TTreeView есть событие OnSelectionCanged. Я его использую в своем компоненте-наследнике, что делает невозможным корректное использование его в дальнейшем. То есть при использовании этого события в программе событие в компоненте-наследнике не работает, что нарушает логику работы наследника.
Как правильно выйти из данной ситуации?
- Снег Север
- долгожитель
- Сообщения: 3071
- Зарегистрирован: 27.11.2007 15:14:47
- Контактная информация:
Извините, непонятно ничего. У вашего наследника свой экземпляр, у которого свой конкретный OnSelectionCanged. Каким образом какое использование OnSelectionCanged у других экземпляров класса в другом месте может на него повлиять?
- wofs
- постоялец
- Сообщения: 379
- Зарегистрирован: 05.10.2009 10:16:55
- Откуда: Астрахань
- Контактная информация:
Снег Север писал(а):Извините, непонятно ничего.
Создаю компонент-наследник
Код: Выделить всё
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; ожидаемо перестает работать.
Как сделать так, что бы событие не перекрывалось?
есть два пути
1) не совсем неправильный
в потомке указать на внутреннюю функцию-обработчик callback вызова.
- тогда OnSelectionChanged будет занята, и если другой решит предопределить OnSelectionChanged тогда внутренний код перестанет работать.
2) выяснить кто вызывает OnSelectionChanged
DoSelectionChanged - вызывается внутри, имеет virtual, можно перекрыть своим DoSelectionChanged.
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.
wofs
А зачем прямо в классе присутствует присвоение событию OnSelectionChanged? Уберите его и делайте присвоение только в экземпляре класса. И всё будет тип-топ.
А зачем прямо в классе присутствует присвоение событию OnSelectionChanged? Уберите его и делайте присвоение только в экземпляре класса. И всё будет тип-топ.
- Снег Север
- долгожитель
- Сообщения: 3071
- Зарегистрирован: 27.11.2007 15:14:47
- Контактная информация:
Да, конечно, так и надо.Vadim писал(а):А зачем прямо в классе присутствует присвоение событию OnSelectionChanged? Уберите его и делайте присвоение только в экземпляре класса. И всё будет тип-топ.
- Ichthyander
- энтузиаст
- Сообщения: 701
- Зарегистрирован: 04.04.2007 08:32:43
- Откуда: Астрахань
- Контактная информация:
Кажется единственно правильное и самое простое здесь это то что описал olegy123 во втором пункте. Практически для всех событий OnSomeMethod есть процедура DoSomeMethod, которую можно и нужно override'ить для этих целей
