Главная страница
    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.041 c
2-1143553760
0bsid
2006-03-28 17:49
2006.04.16
integer в string (не IntToStr)


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


15-1143012008
vecna
2006-03-22 10:20
2006.04.16
Подскажите, где достать электронную документацию по FireBird?


15-1143208588
Ketmar
2006-03-24 16:56
2006.04.16
промеждупрочим о "падокавскам" языке


15-1142562483
Mozart
2006-03-17 05:28
2006.04.16
Можно ли не отрабатывать две недели посде подачи заяв об уходе?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский