C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Порядок инициализации свойств компонента, Надо чётко определить порядок инициализ.
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



Так как не помню, откуда сохранил страницу, выкладываю её как файл.
Надеюсь автор Иван Пономарев не сочтет это плагиатом.

User Attached Image Скачать файл
Сериализация_объектов_стандартными_средствами_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

Вернуться в Вопросы программирования в C++Builder