Главная страница
    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.46 MB
Время: 0.04 c
2-1143618643
Erik1
2006-03-29 11:50
2006.04.16
Освобождение строк.


2-1144061350
serg111111
2006-04-03 14:49
2006.04.16
Приложение в треере


2-1143297744
KING
2006-03-25 17:42
2006.04.16
Нормализация БД


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


2-1143885475
EXILE
2006-04-01 13:57
2006.04.16
Как открыть в Delphi .exe файл





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