![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Не показываются в Instectore свойства внутреннего компонента. [D7, WinXP]
gde11 © (2005-10-15 15:51:00)Понадобилось создать компонент, у которого в качестве свойства выступает другой мой компонент (внутренний).
Проблема в том, что при помещении внешнего компонента на форму его свойство типа внутреннего компонента отображается в 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 - нет.
Заранее спасибо!
jack128 (2005-10-16 09:56:00) [1]Оп-c, сорри, стромозил :-)
jack128 (2005-10-16 09:55:00) [2]gde11 (15.10.05 15:51)
//внутренний компонент
TMySize = class( TPersistent
так что это?? если компонент, то в
constructor TProperyLabel.Create;
begin
FSize := TMySize.Create(Self);
FSize.SetSubConponent(True)
end;
Юрий Зотов (2005-10-15 22:45:00) [3]Нужен код конструктора.
gde11 (2005-10-15 21:51:00) [4]Большое спасибо! Понемногу просняется.
Только после указанных изменений при попытке разместить на форме компонент TMyLabel вываливается такая мессага:
---------------------------
Error
---------------------------
Access violation at address 00000000. Read of address 00000000.
---------------------------
OK
---------------------------
Что-то осталось не так, а что - понять не могу :(.
Юрий Зотов (2005-10-15 18:54:00) [5]Небольшая поправка:
procedure TSize.AssignTo(Dest: TPersistent);
begin
if Dest is TSize then
TSize(Dest).Tx := Tx
else
inherited
end;
Юрий Зотов (2005-10-15 18:53:00) [6]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 Set Size;
И добавить метод
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?