vvoid |
Отправлено: 12.11.2004, 15:23 |
|
Машинист паровоза
Группа: Участник
Сообщений: 171
|
Всем привет!! Столкнулся с проблемой при написании компонента.
Одно из свойств (1) моего компонента (А) — указатель на другой компонент (В).
Другое свойство (2) моего компонента А может принимать определённые значения, в зависимости от установленных свойств компонента В.
Проблема в том, что свойство (1) при запуске програмы инициализируется значением из ObjectInsoector-a ПОЗЖЕ, чем свойство (2). Таким образом получается, что свойство (2) при инициализации пытается прочесть данные по неинициализированному указателю из свойства (1) (он в это время содержит банальный NULL).
Я подозреваю, что есть возможность организации чёткой последовательности инициализайции свойств, но пока не могу нащупать механизм реализации этой возможности. Подскажите, пжл, как можно решить эту проблему.
СПАСИБО!!! ЖДУ ОТВЕТОВ!!!
|
|
Konstantine |
Отправлено: 12.11.2004, 15:54 |
|
Мастер участка
Группа: Модератор
Сообщений: 545
|
кинь кода немного.... а то чё-то Я запутался...
какие компоненты? если с формы — там есть порядок создания
|
|
AVC |
Отправлено: 12.11.2004, 16:07 |
|
Ветеран
Группа: Модератор
Сообщений: 1583
|
Вариант:
Свойство 2 проверяет 1 и если там NULL ни чего не делает.
Свойство 1 заполняется через метод и при заполнении просит 2 уточнить параметры. |
|
olegenty |
Отправлено: 12.11.2004, 16:28 |
|
Ветеран
Группа: Модератор
Сообщений: 2412
|
и последний вариант — задуматься, где ошибка в проекте компонента. и перепроектировать так, чтобы гарантировать инициацию. например — включить компонент B в компонент А, как его поле, инициируемое в конструкторе, убиваемое в деструкторе. а уж свойства компонента B при этом вывести наружу труда не составит.
|
|
vvoid |
Отправлено: 12.11.2004, 16:40 |
|
Машинист паровоза
Группа: Участник
Сообщений: 171
|
-> to Konstantine:
Дело в том, что на форме можно задать порядок создания невидимых компонентов, а у меня один видимый (DBGrid), а другой (тот который мой) — невидимый.
Привожу кусок кода Set-функции свойства (2) (цель — инициализация свойства при отсутствии ошибок, одна из которых тот самій NULL в указателе)
CODE |
if (FSourceDBGrid == NULL) // <- условие постоянно срабатывает
{
// сообщение про ошибку
}
else if (<другие варианты ошибок>)
{
..........
}
else if (<другие варианты ошибок>)
{
..........
}
else // Ошибок нет, можно заносить значение в свойство
{
FExportMode = Value;
}
|
->To AVC:
Обход этой ситуации таким методом и при помощи флагов я реализовывал. Но это какой-то некрасивый и, на мой взгляд кривой метод. :-(. Поэтому и ищу что-нить по-элегантнее! ;-). Но всё равно спасибо!!!
|
|
vvoid |
Отправлено: 12.11.2004, 16:46 |
|
Машинист паровоза
Группа: Участник
Сообщений: 171
|
QUOTE (olegenty @ 12/11/2004, 17:30) | и последний вариант — задуматься, где ошибка в проекте компонента. |
Такая мысль посещает меня всё чаще (хороший компонент надо писать несколько раз ;-) (мудрость, пусть и не восточная, хотя кто знает...))
|
|
olegenty |
Отправлено: 12.11.2004, 16:47 |
|
Ветеран
Группа: Модератор
Сообщений: 2412
|
поэлегантнее — породить наследника от DBGrid, куда и поместить всю дополнительную невизуальную инфу.
|
|
Konstantine |
Отправлено: 12.11.2004, 16:53 |
|
Мастер участка
Группа: Модератор
Сообщений: 545
|
или свой компонент создавай динамически в ходе выполнения кода проги... (где-то в OnCreate формы), где св-ва виз.компоненты уже есть
|
|
vvoid |
Отправлено: 12.11.2004, 17:06 |
|
Машинист паровоза
Группа: Участник
Сообщений: 171
|
Наследник от DBGrid — ерунда, этот компонент предназначен для использования на уже готовых (почти готовых) проэктах.
А вот динамическое создание — это интересно. Но кто кроме меня будет об этом значть. (Писать хелп — :-\ да и кому его читать охота будет!)
*У меня там созрел (точнее я его вспомнил ;-)) новый вопрос, скоро выставлю! %)
|
|
Rius |
Отправлено: 12.11.2004, 17:36 |
|
Мастер участка
Группа: Участник
Сообщений: 321
|
1. Программер может указывать последовательность загрузки и выгрузки свойство в поток формы (в текстовом виде — это содержимое файла *.dfm, а также то, в каком виде форма хранится в *.exe). Для этого есть функция DefineProperties.
2. У компонентов есть метод Loaded, который вызывается при загрузке компонента из потока.
3. Все компоненты формы оповещаются о событии удаления другого компонента, это тебе тоже надо учесть и применить. А то ссылка на компонент будет, а попытается обратиться — вылетит.
|
|
vvoid |
Отправлено: 12.11.2004, 17:50 |
|
Машинист паровоза
Группа: Участник
Сообщений: 171
|
Клёво, Rius. :-D СПАСИБО!!! Второй вопрос в отдельную тему вытаскивать, благодаря тебе, уже не надо, только напиши подробнее, как компоненты оповпщаются об удалении собратьев!
|
|
Rius |
Отправлено: 12.11.2004, 17:53 |
|
Мастер участка
Группа: Участник
Сообщений: 321
|
Так как не помню, откуда сохранил страницу, выкладываю её как файл.
Надеюсь автор Иван Пономарев не сочтет это плагиатом.
|
Скачать файл |
Сериализация_объектов_стандартными_средствами_Delphi.rar |
|
|
Rius |
Отправлено: 12.11.2004, 17:59 |
|
Мастер участка
Группа: Участник
Сообщений: 321
|
В классе компонента в *.h файле:
CODE |
protected:
void __fastcall Notification(TComponent *AComponent, TOperation Operation);
|
В cpp файле компонента:
CODE |
//---------------------------------------------------------------------------
void __fastcall TOPCLabel::Notification(TComponent *AComponent, TOperation Operation)
{
if(Operation != opRemove) return;
if(AComponent == FOPCTag) FOPCTag = NULL;//здесь FOPCTag -указатель на другой компонент.
}
|
|
|
AVC |
Отправлено: 12.11.2004, 18:06 |
|
Ветеран
Группа: Модератор
Сообщений: 1583
|
Rius уже написал.
Отредактировано AVC — 12/11/2004, 18:10 |
|