Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Создание VCL-компонента. Как сохранить значения вложенных свойств 
:(
    Опции темы
PRIZRAK001
Дата 7.3.2006, 19:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 67
Регистрация: 13.7.2005

Репутация: нет
Всего: 1



Здравствуйте.

Создаю VCL компонент, имеющий вложенные свойства. Вот примерный код.

Класс, описывающий сложное свойство.
Код
// NestedProp.h

class TNestedProp : public TPersistent
   {
   private:

      int FProp;

   public:

      __fastcall TNestedProp();

   __published:

      __property int Prop = {read = FProp, write = FProp}; // свойство внутри свойства
};
Код
// NestedProp.cpp

__fastcall TNestedProp :: TNestedProp() : TPersistent()
   {
   FProp = 3;  // задаём значение по умолчанию
   }

Сам компонент.
Код
 // MyComp.h

#include "NestedProp.h"

class PACKAGE TMyComp : public TPanel
   {
      TNestedProp* FNestedProp;

   public:

      __fastcall TMyComp(TComponent* Owner);
      __fastcall ~TMyComp();      

   __published:

      __property TNestedProp* NestedProp = {read = FNestedProp};
};
Код
// MyComp.cpp

__fastcall TMyComp::TMyComp(TComponent* Owner)
        : TPanel(Owner)
   {
   FNestedProp = new TNestedProp();
   }

__fastcall TMyComp::~TMyComp()
   {
   delete FNestedProp;
   }

Кладём компонент на форму и пишем следующий код.
Код
void __fastcall TForm1::FormShow(TObject *Sender)
   {
   ShowMessage(MyComp1->NestedProp->Prop); // выводит на экран значение Prop
   }

Проблема заключается в том, что невозможно изменить значение Prop при помощи инспектора объектов. Точнее, его можно изменить, но какое бы значение мы не задавали, функция ShowMessage всегда будет выводить «3». Т.е. изменения внесённые в режиме проектирования, не переносятся на работающую программу. Полагаю, это связано с тем, что значение свойства Prop не сохраняется в файле *.dfm.

Как заставить работать всё нормально?
PM   Вверх
Vyacheslav
Дата 7.3.2006, 19:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

Репутация: 47
Всего: 59



Скорее всего , все дело в том, что Вы перекрываете загруженное значени в теле конструктора.
Для начала уберите присвоение в конструкторе и посмотрите, что получится.


--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
PRIZRAK001
Дата 8.3.2006, 01:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 67
Регистрация: 13.7.2005

Репутация: нет
Всего: 1



Цитата(Vyacheslav @ 7.3.2006, 19:36 Найти цитируемый пост)
Для начала уберите присвоение в конструкторе и посмотрите, что получится.

Попробовал (закоментировал "FProp = 0") - в результате стал выдавать всё время "0", а не то что хочеться.

Дело в том, что VCL-компонент инициализируется, и когда кладешь его на форму, и когда запускаешь приложение. И каждый раз вызывается конструктор. Поэтому, чтобы значения свойств не потерялись, они сохраняются в файле *.dfm, соотвествующей формы. А затем восстанавливаются. Но такая штука, срабатывает только для простых типов (int, double) и для стандартных билдеровских (TFont). А вот как сохранить свои типы???.........

PM   Вверх
PRIZRAK001
Дата 8.3.2006, 15:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 67
Регистрация: 13.7.2005

Репутация: нет
Всего: 1



Решение найдено!!! Нужно писать метод write. Если его нет, то данные не сохраняются в файле *.dfm.

Вот как можно сделать

Код
// NestedProp.h

class TNestedProp : public TPersistent
   {
   private:

      int FProp;

   public:

      __fastcall TNestedProp();

      virtual void __fastcall Assign(TPersistent* Value);

   __published:

      __property int Prop = {read = FProp, write = FProp};
   };

Код
// NestedProp.cpp

void __fastcall TNestedProp :: Assign(TPersistent* Value)
   {
   TNestedProp* NestedProp = dynamic_cast<TNestedProp*>(Value);

   if (NestedProp)
      FProp = NestedProp->FProp;
   else
      throw Exception("Can't assign " + Value->ClassName() + " to " + ClassName());
   }

Код
// MyComp.h

#include "NestedProp.h"

class PACKAGE TMyComp : public TPanel
   {
      TNestedProp* FNestedProp;

      void __fastcall SetNestedProp(TNestedProp* Value);

   public:

      __fastcall TMyComp(TComponent* Owner);
      virtual __fastcall ~TMyComp();

   __published:

      __property TNestedProp* NestedProp = {read = FNestedProp, write = SetNestedProp};
   }; 

Код
// MyComp.cpp

void __fastcall TMyComp :: SetNestedProp(TNestedProp* Value)
   {
   FNestedProp->Assign(Value);
   } 


PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.1110 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.