Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > создание свойства Options у компонента


Автор: SerK 9.12.2009, 02:11
Вопрос в следующем.

Как вставить свойство типа Option в свой компонент? Поясняю: помните в Object Inspector у некоторый компонентов есть узлы, где рисуется "+". При раскрытии таких узлов в них видны
различные типы: String, bool, int и т.д. Я попытался сделать тоже, но у меня выскакивает непонятная для меня ошибка:

Код

class TMyOptions
 {
 private:
    String FGradTop,FGradRigth;
 
 public:
         __property String GradTop= {read=FGradTop, write=FGradTop};
         __property String GradRigth= {read=FGradRigth, write=FGradRigth};
         
 };

class PACKAGE TCustContrGrad : public TCustomControl
{
 private:
    TMyOptions FMyOptions;
_published:
    __property TMyOptions MyOptions={read=FMyOptions,write=FMyOptions}; //ошибка
};


В предпоследней строке  находится ошибка:
not an allowed type - (не позволенный тип)

Что я делаю не так?

Автор: 586 9.12.2009, 03:55
Попробуй написать так:
Код
class TMyOptions: public TObject
 {
 private:
    String FGradTop,FGradRigth;
 
 public:
         __property String GradTop= {read=FGradTop, write=FGradTop};
         __property String GradRigth= {read=FGradRigth, write=FGradRigth};
         
 };

class PACKAGE TCustContrGrad : public TCustomControl
{
 private:
    TMyOptions *FMyOptions;
__published:
    __property TMyOptions* MyOptions={read=FMyOptions,write=FMyOptions};
};

Автор: SerK 9.12.2009, 09:08
586,
к сожалению, результат тот же.
Кстати, если 
 __property TMyOptions* MyOptions={read=FMyOptions,write=FMyOptions};
ставлю в секцию public:, то в компонент компилируется, но MyOptions не видно в Object Inspector, а это не то, что надо.

Автор: smoke_man 9.12.2009, 09:23
Сделай наследование у TMyOptions не от TObject, а от TCustomControl.

Автор: artsb 9.12.2009, 11:15
SerK, загляни http://forum.sources.ru/index.php?showtopic=64897&st=0. Может поможет...

Автор: SerK 9.12.2009, 14:27
586,
прошу прощения, недосмотрел ваш код, он работает, но....
В Object Inspector появляется мое свойство MyOptions с "+", но оно пусто, т.е. оно не раскрывается, хотя "+" меняется на "-". Вот новый код:

Код

class DELPHICLASS TMyOptions; //без этого объявления не компилир.
class PACKAGE TCustContrGrad : public TCustomControl
{
 private:
    TMyOptions *FMyOptions;
__published:
    __property TMyOptions* MyOptions={read=FMyOptions,write=FMyOptions};
};

class TMyOptions: public TObject
 {
 private:
    String FGradTop,FGradRigth;
 
 __published: //я поменял private: секцию 
         __property String GradTop= {read=FGradTop, write=FGradTop};
         __property String GradRigth= {read=FGradRigth, write=FGradRigth};
         
 };


... "видет" Object Inspector моих свойств __property String GradTop и __property String GradRigth.

smoke_man,
поменял на TCustomControl, - узел MyOptions меняется на enum (выпадющий список, но и он пуст).


artsb,
спасибо, толковый пример.

Автор: SerK 17.12.2009, 04:32
Прописал в конструкторе компонента

 MyOptions=new TMyOptions;
 
и все заработало.

Автор: XPyCT 18.2.2019, 11:58
Привет всем!
Я прошу прощение за поднятие данной некто/темы, так как не хотел создавать отдельную.

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

я понимаю что это связано с созданием каждый раз нового экземпляра класса 
В общем ребята помогите плз мосГ сломан окончательно =)
привожу проблемный код:
Код

//header's
class TPrintSettings: public TObject
{
   private:
    int m_n1;
    int m_n2;

    void __fastcall SetM1(int n);
    int __fastcall GetM1();
    void __fastcall SetM2(int n);
    int __fastcall GetM2();
 public:
       TPrintSettings();
__published:
    __property int  cgLeft= {read=GetM1, write=SetM1,nodefault};
    __property int  cgTop= {read=GetM2, write=SetM2,nodefault};
};

class PACKAGE TCoolTable : public TStringGrid
{
private:
  TPrintSettings *pPrintSettings;
__published:
   __property  TPrintSettings *PrintSettings = {read=pPrintSettings, write=pPrintSettings, nodefault};
};


Код

//cpp's
TPrintSettings::TPrintSettings(){
}
void __fastcall TPrintSettings::SetM1(int n)
{
    m_n1 = n;
}
int __fastcall TPrintSettings::GetM1()
{
    return m_n1;
}
void __fastcall TPrintSettings::SetM2(int n)
{
    m_n2 = n;
}
int __fastcall TPrintSettings::GetM2()
{
    return m_n2;
}

__fastcall TCoolTable::TCoolTable(TComponent* Owner): TStringGrid(Owner)
{
     pPrintSettings =  new TPrintSettings();
}

Автор: XPyCT 19.2.2019, 10:47
Парни Хелп! Неужели никто не знает?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)