Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Компоненты";
Текущий архив: 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.039 c
8-1131908988
Toxa_ua
2005-11-13 22:09
2006.04.16
Как в Memo и ListBox вставить фоновый рисунок?


8-1131445555
Tristania
2005-11-08 13:25
2006.04.16
Увеличение/уменьшение изображения


15-1143267479
kilonet
2006-03-25 09:17
2006.04.16
Как обмениваться большими файлами


2-1143629509
alk
2006-03-29 14:51
2006.04.16
Посылка параметров из клиента DCOM к серверу


2-1143717391
sanich
2006-03-30 15:16
2006.04.16
Cross-отеты в Fast Report





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский