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

 
Полиморфизм !!!, Не получается изменить свойство родителя
Mr.Dan
  Отправлено: 15.02.2004, 13:55


Не зарегистрирован







Есть код:
CODE

for(int i=0; i < Main->ComponentCount; i++)
 if(Main->Components[i]->ClassNameIs("TEdit") ||
    Main->Components[i]->ClassNameIs("TComboBox") ||
    Main->Components[i]->ClassNameIs("TDateTimePicker"))
  {((TWinControl*)Main->Components[i])->BevelInner = bvRaised;
   ((TWinControl*)Main->Components[i])->BevelKind = bkSoft;
   ((TWinControl*)Main->Components[i])->BevelOuter = bvLowered;
  }

Дык вот компилятор ругается:
QUOTE

[C++ Error] MainCode.cpp(105): E2247 'TWinControl::BevelInner' is not accessible


Вопрос: Как все-таки можно изменить свойство производного класса, через базовый?
Pirs
Отправлено: 15.02.2004, 17:06


Дежурный стрелочник

Группа: Участник
Сообщений: 39



А ты открой Help найди класс TWinControl и посмотри в Hierarchy есть ли у него вообще такое свойство
** pasha
Отправлено: 15.02.2004, 17:55


Не зарегистрирован







TWinControl — абстрактный базовый класс всех оконных компонентов.
Свойство то эти у TWinControl есть, но оно только для чтения
и переопределяются в производных от него классах.
Asher
Отправлено: 16.02.2004, 10:41


Мастер участка

Группа: Модератор
Сообщений: 550



Привет.
Сделай "прокладочный" класс — наследника от TWinControl где опубликуешь необходимое тебе свойство.
Что-то вроде
CODE

class TMyPublicWinControl :public TWinControl
{
public:
__property TBevelCut BevelInner = {read=FBevelInner, write=SetBevelCut, index=0, default=2};
void __fastcall SetBevelCut(int index, const TBevelCut value){;};//
};

((TMyPublicTWinControl *)Main->Components[i])->BevelInner = bvRaised;


Отредактировано Asher — 16/02/2004, 12:44
xTrim
Отправлено: 16.02.2004, 12:02


Машинист паровоза

Группа: Участник
Сообщений: 208



А если неного пошаманить то можно
CODE

#include <typinfo.hpp>
for(int i=0; i < Main->ComponentCount; i++)
{
TComponent* comp = Main->Components[i];
if(comp->ClassNameIs("TEdit") ||
comp->ClassNameIs("TComboBox") ||
comp->ClassNameIs("TDateTimePicker"))
 {
  if (IsPublishedProp(comp, "BevelInner"))
   SetEnumProp(comp, "BevelInner", "bvRaised");
   if (IsPublishedProp(comp, "BevelKind"))
    SetEnumProp(comp, "BevelKind", "bkSoft");
   if (IsPublishedProp(comp, "BevelOuter"))
    SetEnumProp(comp, "BevelOuter", "bvLowered");
}
}

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