Форум: "Компоненты";
Текущий архив: 2005.10.30;
Скачать: [xml.tar.bz2];
ВнизДобавление "детей" в DesignTime в свой компонент Найти похожие ветки
← →
khas (2005-02-02 12:36) [0]Доброго времени суток.
Подскажите, плс, как решить следующую проблему:
Создаю компонент на основе 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, то все в порядке.
← →
OnThink © (2005-02-02 16:01) [1]поздравляю
скроллбокс положен на панель в дизайнтайме
его переменная переопределена в рантайме
стало быть дизайновский скроллбокс ушёл в нирвану, и всё что на нём лежит - туда же.
← →
Юрий Зотов © (2005-02-02 19:46) [2]Панель, положенная на ScrollBox, не сохраняется в DFM (сделайте View As Text - увидите сами).
Посмотрите, как обеспечивают свое сохранение TMenuItem или TField (GetParentComponent, GetChildren и пр.).
← →
khas (2005-02-03 12:49) [3]To Юрий Зотов
Проблема еще в том, что и сам ScrollBox не сохраняется в dfm.
Что надо сделать, чтобы сохранить ScrollBox и все компоненты, лежащие на нем, в dfm?
← →
Юрий Зотов © (2005-02-03 14:19) [4]> 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 и т.д.).
← →
icWasya © (2005-02-03 20:28) [5]можно попробовать так - у меня в 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;
← →
Petr V. Abramov © (2005-02-04 03:30) [6]Чуть не в тему.
А может, фрейм?
← →
OnThink © (2005-02-04 09:06) [7]khas, [5], [6] - срочно RTFM
по поводу создания компонентов в дизайне и рантайме,
а то уважаемый Юрий Зотов© перед вами распинается, а вы -
не в теме абсолютно
← →
khas (2005-02-04 10:27) [8]Всем большое спасибо за советы, особенно Юрий Зотов
to OnThink - согласен, я не совсем в теме, но для этого я и обратился к знающим людям, чтобы меня направили в нужном направлении, от Вас, к сожалению, ни одного полезного совета я не получил
Страницы: 1 вся ветка
Форум: "Компоненты";
Текущий архив: 2005.10.30;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.049 c