Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.17.184.90] |
|
Сообщ.
#1
,
|
|
|
Разрабатываю свой компонент, который состоит из панелей. Возник вопрос как сделать так, чтобы одна из панелей стала контейнером при размещении на нее других компонентов.
В прикрепленном рисунке постарался отобразить суть. Прикреплённый файл3.JPG (25,98 Кбайт, скачиваний: 622) |
Сообщ.
#2
,
|
|
|
в конструкторе нужно указать что компонент может принимать другие компоненты
type TMyControl = class(TCustomControl) public constructor Create(AOwner: TComponent); override; end; constructor TMyControl.Create(AOwner: TComponent); begin inherited; ControlStyle := ControlStyle + [csAcceptsControls]; end; |
Сообщ.
#3
,
|
|
|
Цитата ViktorXP @ Указывать нужно у белой panel'и или же у главной панели на которой лежат три оставшиеся (заголовок, белая, нижняя часть)? |
Сообщ.
#4
,
|
|
|
указывать нужно у той которая должна принимать контролы
|
Сообщ.
#5
,
|
|
|
Цитата ViktorXP @ Ок. А нужно ли регистрировать мой класс, наследник от TPanel type TMyPanel = class(TPanel) private pnlTitle: TPanel; pnlWhite: TPanel; pnlBottom: TPanel end; |
Сообщ.
#6
,
|
|
|
регистрировать где? регистрировать как компонент? естественно иначе его не будет на панели компонентов.
|
Сообщ.
#7
,
|
|
|
Цитата ViktorXP @ регистрировать где? регистрировать как компонент? не в смысле вот так нужно ли делать: unit MyPanel; type TyPanel = class(TPanel) ... initializate RegisterClass(TMyPanel); |
Сообщ.
#8
,
|
|
|
нет
Добавлено имеется ввиду не нужно. RegisterComponents вполне достаточно |
Сообщ.
#9
,
|
|
|
Цитата ViktorXP @ В конструкторе TMyPanel написал так: pnlWhite.ControlStyle := pnlWhite.ControlStyle + [csAcceptsControls]; но это не помогло. Добавлено Цитата alexeybarkalov @ Цитата ViktorXP @ В конструкторе TMyPanel написал так: pnlWhite.ControlStyle := pnlWhite.ControlStyle + [csAcceptsControls]; но это не помогло. Как быть? |
Сообщ.
#10
,
|
|
|
а какая у тебя версия?
Добавлено я как не извращался у меня работает. Добавлено хотя тестил на XE2 (это единственное что стоит ща в системе) Добавлено хотя у TPanel уже стоит стиль csAcceptsControls попробуй все наследовать от TCustomControl (а среднюю панель можно оставить TPanel) |
Сообщ.
#11
,
|
|
|
Цитата ViktorXP @ а какая у тебя версия? BDS 2006 Цитата ViktorXP @ впринципи у TPanel уже стоит стиль csAcceptsControls Да, я тоже посмотрел уже стоит. Цитата ViktorXP @ попробуй все наследовать от TCustomControl (а среднюю панель можно оставить TPanel) У меня по-коду используется св-во Color этих панелей, которое не видно в у TCustomPanel Что делать? |
Сообщ.
#12
,
|
|
|
Цитата alexeybarkalov @ да ты сначала разберись что именно работает не так, и что нужно еще компоненту. а поменять наследника не проблема. У меня по-коду используется св-во Color этих панелей, которое не видно в у TCustomPanel Что делать? Добавлено возможно в коде что то не то делаешь вот что написано у меня unit CustomControl1; interface uses System.SysUtils,Vcl.ExtCtrls, System.Classes, Vcl.Controls; type TCustomControl1 = class(TPanel) private Panel1: TPanel; Panel2: TPanel; Panel3: TPanel; protected { Protected declarations } public constructor Create(AOwner: TComponent); override; published { Published declarations } end; procedure Register; implementation procedure Register; begin RegisterComponents('Samples', [TCustomControl1]); end; { TCustomControl1 } constructor TCustomControl1.Create(AOwner: TComponent); begin inherited; Panel1 := TCustomControl.Create(self); Panel1.Align := alTop; Panel1.Height := 20; Panel1.Parent := self; Panel2 := TCustomControl.Create(self); Panel2.Align := alClient; Panel2.Parent := self; Panel2.ControlStyle := Panel2.ControlStyle + [csAcceptsControls]; Panel3 := TCustomControl.Create(self); Panel3.Align := alBottom; Panel3.Height := 20; Panel3.Parent := self; end; end. Добавлено Код примитивен но он позволяет нормально бросать контролы |
Сообщ.
#13
,
|
|
|
Цитата ViktorXP @ Код примитивен но он позволяет нормально бросать контролы У меня аналогичный код только не фига не работает, мож я исходник скину посмотришь? |
Сообщ.
#14
,
|
|
|
не думаю что поможет, у нас разные версии VCL. когда то у меня было что то подобное но я не помню как я это решал.
|
Сообщ.
#15
,
|
|
|
Я нашел твой топик, решение простое нужно csAcceptsControls включать только у Self, а других контролах
размещенные на Self'e наоборот нужно выключить Добавлено нет ошибся проблема осталось, единственно что решилось что в структуре классов отображаемых Delphi, действительно у размещенного компонента родитель TMyPanel, но проблема в том что когда у размещенного компонента (например, TMemo) делаем Align=alClient он размещается на всей области вместо того, чтобы разместитьтся только на белой (см. прикрепленный рисунок в самом начале топика) |