Написание компоненты

  • Автор темы brink
  • Дата начала
B

brink

#1
Добрый день.

Пишу компоненту, смысл таков: заполнение PickList'a компоненты RxDBGrid для указанного поля, списком значений отфильтрованной таблицы.

PickList заполняется если сработало событие OnShowEditor.

В компоненте есть свойство RxDBGrid, при его заполнении происходит привязка обработчика событий описанного в компоненте к обработчику в RxDBGrid:

<!--shcode--><pre><code class='CPP'>void __fastcall TPickListMaker::SetDBGrid(TRxDBGrid* dbGrid)
{
DBGrid = dbGrid;
if (dbGrid) DBGrid->OnShowEditor = __OnShowEditor;
}[/CODE]

Но при таком подходе, если в основном коде было определено событие OnShowEditor для грида со своим кодом, то при использовании компоненты оно накроется событием описанным в компоненте.

Как избежать данную ситуацию?

Спасибо!
 
B

brink

#3
Что значит в определенном?
В поле которое указанно в свойствах компоненты.

ПикЛист - это свойство любой колонки в гриде. И представляет собой выпадающий список значений при попытке редактировать ячейку колонки в которой определён ПикЛист.


Решение я нашёл, нужно сохранить старый обработчик и вызвать из своего.

Нужно объявить переменную типа события (посмотрел в хидере компоненнта RxDBGrid):
<!--shcode--><pre><code class='CPP'>TDBEditShowEvent FSavedOnShowEditor;[/CODE]

И просто в эту переменную сохранить старый обработчик:
<!--shcode--><pre><code class='CPP'>void __fastcall TPickListMaker::SetDBGrid(TRxDBGrid* dbGrid)
{
DBGrid = dbGrid;
if (dbGrid) {
//сначала сохраняем событие определённое в DBGrid->OnShowEditor
if (DBGrid->OnShowEditor) FSavedOnShowEditor = DBGrid->OnShowEditor;
//накрываем своим
DBGrid->OnShowEditor = __OnShowEditor;
}
}[/CODE]

А в обработчике, который описан в компоненте, я сделал так :

<!--shcode--><pre><code class='CPP'>void __fastcall TPickListMaker::__OnShowEditor(TObject *Sender, TField *Field, bool &AllowEdit)
{
if (FSavedOnShowEditor) FSavedOnShowEditor(Sender,Field,AllowEdit);

....
}[/CODE]

И вуаля всё счастливы, все довольны :)