class MyClass
{
...
private:
TColorDialog *FClrDlg;
public:
MyClass()
{
FClrDlg=new TColorDialog(this);
}
__published:
__property TColorDialog * ColorDialog={read=FClrDlg, write=FClrDlg};
свойства-объекты в VCL
Код:
Так вот, всё отлично когда изменяешь переменные и свойства этого ColorDialog в рантайме, но в design-time в инспекторе объектов, когда переменную изменяю, то в реальности, во время выполнения, переменной не присваивается значение, указанное в инспекторе объектов.
Короче говоря,
если изменить Tag свойства ColorDialog на 10 (В инспекторе объектов), то во время выполнения, Tag=0, а не 10. Почему у объектов-свойств не зименяются их собственные свойства?
И вообще интересно, когда Builder присваивает всем свойствам значение, указанное в инспекторе объектов? Сразу после выполнения конструктора?
Всем спасибо.
Цитата:
Короче говоря,
если изменить Tag свойства ColorDialog на 10 (В инспекторе объектов), то во время выполнения, Tag=0, а не 10. Почему у объектов-свойств не зименяются их собственные свойства?
Для свойства в качетсве write-accessor'а надо не поле указать, а метод, в котором Assign делать:
Код:
...
__property TColorDialog * ColorDialog={read=FClrDlg, write=SetClrDlg};
...
void __fastcall MyClass::SetClrDlg(TColorDialog *AValue)
{
if (AValue) FClrDlg->Assign(AValue);
}
__property TColorDialog * ColorDialog={read=FClrDlg, write=SetClrDlg};
...
void __fastcall MyClass::SetClrDlg(TColorDialog *AValue)
{
if (AValue) FClrDlg->Assign(AValue);
}
Цитата:
И вообще интересно, когда Builder присваивает всем свойствам значение, указанное в инспекторе объектов? Сразу после выполнения конструктора?
В конструкторе базового класса (TPersistent или TComponent, если не ошибаюсь) происходит загрузка свойств компонентов из DFM.
Указатели на объекты, которые создаются в классе, извне меняться не должны. Значит, и возможность такую создавать нельзя
Пожалуйста, прочитайте ещё раз мой вопрос. Я не спрашивал как правильно присваивать свойства-объекты в VCL компонентах, а почему Билдер не присваивает во время выполнения проги значения свойствам, которые находятся внутри этих объектов VCL компонента.
А в DFM-файл при редактировании свойств в дизайнере билдер сохраняет введенные значения?
Цитата:
Билдер не присваивает во время выполнения проги значения свойствам, которые находятся внутри этих объектов VCL компонента.
Ты сам-то понял, что написал? :)
Все билдер делает, если правильно его об этом попросить.
Для "потомков": Билдер не будет сохранять все вложенные свойства ОБЪЕКТА-СВОЙСТВА, если ему не вызвать в конструкторе VCL компонента Object->SetSubComponent(true).
Цитата: madjahed
Для "потомков": Билдер не будет сохранять все вложенные свойства ОБЪЕКТА-СВОЙСТВА, если ему не вызвать в конструкторе VCL компонента Object->SetSubComponent(true).
Умолчательная политика VCL следующая (если не вызывать дополнительных методов):
- Свойства типа TComponent считаются ссылками и подразумевается, что они сохраняются своим родителем (или сами собой, если являются корневым контейнером)
- Свойства, наследованные от TPersistent, но не являющиеся потомками TComponent, сохраняются без дополнительных телодвижений - достаточно описания такого свойства как published.