![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Добавление "детей" в 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]поздравляю
скроллбокс положен на панель в дизайнтайме
его переменная переопределена в рантайме
стало быть дизайновский скроллбокс ушёл в нирвану, и всё что на нём лежит - туда же.