Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.04.16;
Скачать: CL | DM;

Вниз

Не показываются в Instectore свойства внутреннего компонента.   Найти похожие ветки 

 
gde11   (2005-10-15 15:51) [0]

Понадобилось создать компонент, у которого в качестве свойства выступает другой мой компонент (внутренний).
Проблема в том, что при помещении внешнего компонента на форму его свойство типа внутреннего компонента отображается в Object Instector"е без своих свойств!
Вот код:
type
 //внутренний компонент
 TMySize = class(TPersistent)
 private
   Tx: Integer;
 public
   constructor Create (Owner: TComponent);
 published
   property X: Integer read Tx write Tx;
 end;

 // Главный компонент
 TMyLabel = class(TLabel)
 private
   FSize: TMySize;
 public
   constructor Create;
 published
   property Size: TMySize read FSize write FSize;
 end;
...
implementation

constructor TProperyLabel.Create;
begin
 FSize := TMySize.Create(Self);
end;

constructor TMySize.Create(Owner: TComponent);
begin
end;

Проблема в том, что в Object Instector"е свойство Size типа TMySize показывается, а его свойство X - нет.
Заранее спасибо!


 
Юрий Зотов ©   (2005-10-15 18:53) [1]

1. TMySize - это не компонент. Не всякий объект является компонентом.

2. Выбросьте конструктор TMySize.Create.

3. Конструктор  TMyLabel.Create объявлен неверно (это и есть причина проблемы, о которой Вы говорите. Надо так:
constructor Create(AOwner: TComponent); override;

4. Нет деструктора TMyLabel.Destroy (а он нужен для уничтожения внутреннего объекта TMySize)

5. Эта строка
property Size: TMySize read FSize write FSize;
запросто может привести к глюкам и утечке памяти. Нужно так:
property Size: TMySize read FSize write SetSize;
И добавить метод
procedure TMyLabel.SetSize(const Value: TSize);
begin
 FSize.Assign(Value)
end;

И в TSize надо будет перекрыть метод AssignTo.
procedure TSize.AssignTo(Dest: TPersistent);
begin
 if Dest is TSize then
   Dest.Tx := Tx
 else
   inherited
end;


6. Почему бы не следовать общепринятым соглашениям о наименованиях и не начинать имена полей с буквы F, а не T?


 
Юрий Зотов ©   (2005-10-15 18:54) [2]

Небольшая поправка:

procedure TSize.AssignTo(Dest: TPersistent);
begin
if Dest is TSize then
  TSize(Dest).Tx := Tx
else
  inherited
end;


 
gde11   (2005-10-15 21:51) [3]

Большое спасибо! Понемногу просняется.
Только после указанных изменений при попытке разместить на форме компонент TMyLabel вываливается такая мессага:
---------------------------
Error
---------------------------
Access violation at address 00000000. Read of address 00000000.
---------------------------
OK  
---------------------------
Что-то осталось не так, а что - понять не могу :(.


 
Юрий Зотов ©   (2005-10-15 22:45) [4]

Нужен код конструктора.


 
jack128 ©   (2005-10-16 09:55) [5]

gde11   (15.10.05 15:51)
//внутренний компонент
TMySize = class(TPersistent


так что это?? если компонент, то в
constructor TProperyLabel.Create;
begin
FSize := TMySize.Create(Self);
FSize.SetSubConponent(True)
end;


 
jack128 ©   (2005-10-16 09:56) [6]

Оп-c, сорри, стромозил :-)



Страницы: 1 вся ветка

Текущий архив: 2006.04.16;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.028 c
1-1141495041
lookin
2006-03-04 20:57
2006.04.16
Как исключить свойство из компонента


2-1144048023
DVM
2006-04-03 11:07
2006.04.16
Потоки и Сокеты пара вопросов


2-1142760047
align
2006-03-19 12:20
2006.04.16
AdvStringGrid


2-1143980731
Khim
2006-04-02 16:25
2006.04.16
Нажатие кнопок меню на TAppBuilder


15-1143051067
Sergey Masloff
2006-03-22 21:11
2006.04.16
Вчера посмотрел телевизор. Это клиника.