Форум: "Компоненты";
Текущий архив: 2006.04.16;
Скачать: [xml.tar.bz2];
ВнизНе показываются в 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;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.041 c