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

  • Автор темы Автор темы 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 для грида со своим кодом, то при использовании компоненты оно накроется событием описанным в компоненте.

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

Спасибо!
 
Не привязыватся к RxDBGrid и уж тем более к его пользовательским событиям.

Это не решение. Мне всё-равно нужно построить пиклист в определённом поле грида...
 
Что значит в определенном?

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

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


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

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

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

Взломай свой первый сервер и прокачай скилл — Начни игру на HackerLab

Похожие темы

🚀 Первый раз на Codeby?
Гайд для новичков: что делать в первые 15 минут, ключевые разделы, правила
Начать здесь →
🔴 Свежие CVE, 0-day и инциденты
То, о чём ChatGPT ещё не знает — обсуждаем в реальном времени
Threat Intel →
💼 Вакансии и заказы в ИБ
Pentest, SOC, DevSecOps, bug bounty — работа и проекты от проверенных компаний
Карьера в ИБ →

HackerLab