Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Добавление "детей" в DesignTime в свой компонент [D7]


khas ©   (2005-02-02 12:36:00) 

Доброго времени суток.
Подскажите, плс, как решить следующую проблему:
Создаю компонент на основе TPanel, сверху кладу TScrollBox.

Tpp = class(TPanel)
 published
   sb : TScrollBox;
 public
   constructor Create(AOwner: TComponent); override;
 end;

constructor Tpp.Create(AOwner: TComponent);
begin
 inherited Create(AOwner);
 sb := TScrollBox.Create(self);
 sb.Parent := self;
end;

Регистрирую компонент.
Теперь если в DesignTime добавить в ScrollBox панель, то она пропадает при запуске приложения.
Если я добавляю панель в RunTime, то все в порядке.


khas   (2005-02-04 10:27:00) [1]

Всем большое спасибо за советы, особенно Юрий Зотов

to OnThink - согласен, я не совсем в теме, но для этого я и обратился к знающим людям, чтобы меня направили в нужном направлении, от Вас, к сожалению, ни одного полезного совета я не получил


OnThink   (2005-02-04 09:06:00) [2]

khas, [5], [6] - срочно RTFM
по поводу создания компонентов в дизайне и рантайме,
а то уважаемый Юрий Зотов© перед вами распинается, а вы -
не в теме абсолютно


Petr V. Abramov   (2005-02-04 03:30:00) [3]

Чуть не в тему.
 А может, фрейм?


icWasya   (2005-02-03 20:28:00) [4]

можно попробовать так - у меня в Delphi5 работает

constructor Tpp.Create(AOwner: TComponent);
begin
 inherited Create(AOwner);
 if not (AOwner is TForm) then Exit;
 if csLoading in TForm(aOwner).ComponentState then Exit;
 if AOwner.Name='' then Exit;

 sb := TScrollBox.Create(AOwner);
 sb.Parent := self;

end;


Юрий Зотов   (2005-02-03 14:19:00) [5]

> khas   (03.02.05 12:49) [3]

sb := TScrollBox.Create( AOwner ) - и скроллбокс сразу же начинает сохраняться в DFM. Посмотрите форму, как текст - увидите.

Но если после этого снова посмотреть DFM, как форму, то увидим уже два скролбокса. Что и понятно - один создается кодом коструктора, второй - при чтении DFM. Вывод - сам скроллбокс либо не надо создавать в конструкторе, либо не надо сохранять в DFM.

Положите на форму обычную панель и  набросайте на нее контролов - в том числе, другие контейнеры (панели, группбоксы, скроллбоксы и пр.), на которые тоже набросайте чего-нибудь. Затем просмотрите форму, как текст - и все поймете. Owner'ом у всех компонентов будет форма (поэтому они и попадают в DFM), а Parent'ы определяются в самом DFM, по вложенности. Обеспечивается такой механизм методами GetChild, GetChildren, GetParentComponent, SetParentComponent и т. п. Посмотрите, как они реализованы в классах TComponent, в связках TMenu+TMenuItem и TDataSet+TField, в TControl и TWinControl, в контейнерах (TPanel, TGroupBox, TFrame...) и в контейнепах верхнего уровня (TForm, TDataModule).

Вам нужно либо добиться такой же структуры DFM (замещая эти методы в своих классах), либо написать свое сохранение/чтение скроллбокса с его дочерними контролами (DefineProperties и т.д.).


khas   (2005-02-03 12:49:00) [6]

To Юрий Зотов
Проблема еще в том, что и сам ScrollBox не сохраняется в dfm.
Что надо сделать, чтобы сохранить ScrollBox и все компоненты, лежащие на нем, в dfm?


Юрий Зотов   (2005-02-02 19:46:00) [7]

Панель, положенная на ScrollBox, не сохраняется в DFM (сделайте View As Text - увидите сами).

Посмотрите, как обеспечивают свое сохранение TMenuItem или TField (GetParentComponent, GetChildren и пр.).


OnThink   (2005-02-02 16:01:00) [8]

поздравляю
скроллбокс положен на панель в дизайнтайме
его переменная переопределена в рантайме
стало быть дизайновский скроллбокс ушёл в нирвану, и всё что на нём лежит - туда же.


Наверх

Титульная страница Поиск, карта сайта Написать письмо