Компьютерный форум
Правила
Вернуться   Компьютерный форум > Форум программистов > Программирование под Windows > C++ Builder
Перезагрузить страницу Создание VCL-компонента проблема со значками свойств по умолчанию
Ответ
 
Опции темы Опции просмотра
  (#1 (permalink)) Старый
PRIZRAK PRIZRAK вне форума
Member
 
Сообщений: 46
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 05.08.2005
По умолчанию Создание VCL-компонента проблема со значками свойств по умолчанию - 01.02.2006, 00:32

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

Создаю в Билдере VCL-компонент. Наследую от TCustomLabel. Вот код
Код:
class PACKAGE TMyLabel : public TCustomLabel
{
   private:
        double FMyProp;
   protected:
   public:
        __fastcall TMyLabel(TComponent* Owner);
   __published:
        __property double MyProp  = { read=FMyProp, write=FMyProp, default=4.56 };
};
Билдер выдаёт вот такую ошибку
Код:
 [C++ Error] MyLabel.h(18): E2313 Constant expression required
и указывает на строку
Код:
 __property double MyProp = { read=FMyProp, write=FMyProp, default=4.56 };
Я убрал default. Получил следующий код
Код:
class PACKAGE TMyLabel : public TCustomLabel
{
   private:
        double FMyProp;
   protected:
   public:
        __fastcall TMyLabel(TComponent* Owner);
   __published:
        __property double MyProp = { read=FMyProp, write=FMyProp };
};
Он компилируется. Но это только огорчает, т.к. нету значений по умолчанию.

Сменил double на int. Получил следующее
Код:
class PACKAGE TMyLabel : public TCustomLabel
{
   private:
        int FMyProp;
   protected:
   public:
        __fastcall TMyLabel(TComponent* Owner);
   __published:
        __property int MyProp = { read=FMyProp, write=FMyProp, default=4 };
};
Тоже компилируется. Но когда в другом проекте кладёшь компонент на форму, у него значение
свойства MyProp = 0, а должно быть 4.

Тоже самое происходит и с bool'ом. Всё время значение false, даже если ставишь default=true.

Со строкой типа AnsiString - как в случае с double (орёт на выражение default="abc").

Может я что-то не так делаю? Помогите разобраться, пожалуйста.
Ответить с цитированием
  (#2 (permalink)) Старый
Nicky_cr Nicky_cr вне форума
Member
 
Сообщений: 102
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 03.01.2006
По умолчанию 01.02.2006, 00:48

Привет
write = < член данных или метод записи >;
read = < член данных или метод чтения >;
default = < булева константа, управляющая сохранением значения>;
stored = < булева константа или функция, сохраняющая значение >.

соответсвенно не зря он у тебя констант Експрешен просил...

С уважением Ники
Ответить с цитированием
  (#3 (permalink)) Старый
Shadow_Replicant Shadow_Replicant вне форума
Member
 
Сообщений: 322
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 10.08.2005
По умолчанию 01.02.2006, 01:49

Вот что Билдер говорит :
Цитата:
When you declare a property, you can specify a default value for it. C++Builder uses the default value to determine whether to store the property in a form file. If you do not specify a default value for a property, C++Builder always stores the property.
To declare a default value for a property, append an equal sign after the property name and a set of braces that holds the default keyword and the default value. For example,

__property bool IsTrue = {default=true};

Note: Declaring a default value does not set the property to that value. The component’s constructor method should initialize property values when appropriate. However, since objects always initialize their data members to 0, it is not strictly necessary for the constructor to set integer properties to 0, string properties to null, or Boolean properties to false.
Так что, если надо, чтобы значение по умолчание показывалось в инспекторе, то надо проинциализировать его в конструкторе компоненты.
Ответить с цитированием
  (#4 (permalink)) Старый
PRIZRAK PRIZRAK вне форума
Member
 
Сообщений: 46
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 05.08.2005
По умолчанию 01.02.2006, 14:09

Цитата:
Originally posted by Nicky_cr+-->
Цитата:
Привет
write = < член данных или метод записи >;
read = < член данных или метод чтения >;
default = < булева константа, управляющая сохранением значения>;
stored = < булева константа или функция, сохраняющая значение >.

соответсвенно не зря он у тебя констант Експрешен просил...

С уважением Ники
<!--QuoteBegin-Shadow_Replicant

[b]Declaring a default value does not set the property to that value. The component’s constructor method should initialize property values when appropriate.
Если я правильно понял, то для того чтобы были значения по умолчанию надо писать в конструкторе
Код:
__fastcall TMyLabel::TMyLabel(TComponent* Owner) : TCustomLabel(Owner)
{
    FMyProp = 4.56;
}
Зачем же тогда нужны default и nodefault? Что-то я не понимаю! Ведь теперь они уже не влияют на значение. Объясните подробнее, пожалуйста.
Ответить с цитированием
  (#5 (permalink)) Старый
Shadow_Replicant Shadow_Replicant вне форума
Member
 
Сообщений: 322
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 10.08.2005
По умолчанию 01.02.2006, 20:14

От туда же :
Цитата:
To override an inherited default value without specifying a new one, use the nodefault directive. The default and nodefault directives are supported only for ordinal types and for set types, provided the upper and lower bounds of the set’s base type have ordinal values between 0 and 31; if such a property is declared without default or nodefault, it is treated as if nodefault were specified. For reals, pointers, and strings, there is an implicit default value of 0, nil, and '' (the empty string), respectively.

When saving a component’s state, the storage specifiers of the component’s published properties are checked. If a property’s current value is different from its default value (or if there is no default value) and the stored specifier is True, then the property’s value is saved. Otherwise, the property’s value is not saved.
1. default
Если значение свойства и значение укзанное в default"е различны, то это значение сохраниться в файле формы(*.dfm), иначе значение не сохраняеться
2.nodefault
Для того чтобы переписать(переопределить) унаследованное свойства, не изменяя его значения по умолчанию( то есть останеться то значение по умолчанию,которое было у родительского класса )
Ответить с цитированием
Ads.
  (#6 (permalink)) Старый
PRIZRAK PRIZRAK вне форума
Member
 
Сообщений: 46
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 05.08.2005
По умолчанию 02.02.2006, 13:10

Nicky_cr, Shadow_Replicant, спасибо!
Ответить с цитированием
Ads
Ответ

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема со значками Help ! StuDenT59 Windows 7 6 01.09.2011 12:07
Динамическое создание визуального компонента Light241 Delphi 3 05.11.2009 08:53
Создание редактора свойств vcl компонента A-leXeY C++ Builder 0 26.04.2008 01:41
Events и Message создание компонента X-Cite_Forever Delphi 0 14.12.2006 20:10
Создание созданием компонента в С++ Андрейка C. C++ Builder 2 10.03.2006 03:48
Создание нового компонента в С++ FOBOSX C++ Builder 12 11.03.2005 16:21
Создание VCL компонента в RunTime juda Delphi 1 31.10.2004 00:26
Создание VCL компонента в RunTime juda C++ Builder 1 07.10.2004 18:34
Создание стрелочного индикатора компонента Spider_Den C++ Builder 10 21.09.2004 18:36
Создание компонента TSearchEdit slip Delphi 0 12.04.2004 13:30
Создание компонента DBLookupComboBox Lightix C++ Builder 2 10.02.2004 19:48
BCB6 создание нового компонента Anonymous C++ Builder 3 03.12.2003 11:17



Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Нardforum.ru - компьютерный форум и программирование, форум программистов