• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

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

    Запись на курс до 25 апреля. Получить промодоступ ...

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

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

brink

Добрый день.

Пишу компоненту, смысл таков: заполнение 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

Что значит в определенном?

В поле которое указанно в свойствах компоненты.

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


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

Нужно объявить переменную типа события (посмотрел в хидере компоненнта 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]

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

Обучение наступательной кибербезопасности в игровой форме. Начать игру!