На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! ПРАВИЛА РАЗДЕЛА · FAQ раздела Delphi · Книги по Delphi
Обязательно выделяйте текст программы тегом [сode=pas] ... [/сode]. Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля.

Этот раздел предназначен для вопросов, посвященных разработке компонентов, а также для тестирования собственных бесплатных компонентов с открытым исходным кодом.

Здесь запрещается:
1. Размещать ссылки на какие-либо коммерческие компоненты, реализующие требуемую функциональность.
2. Обсуждать и тестировать коммерческие компоненты или компоненты с закрытым кодом.
3. Давать ссылки на сайты с исходным кодом компонентов. Все тестируемые исходные коды должы быть размещены на сайте ИСХОДНИКИ.RU.
Модераторы: Rouse_, DimaBr
  
> Как свой компонент сделать контейнером
    Разрабатываю свой компонент, который состоит из панелей. Возник вопрос как сделать так, чтобы одна из панелей стала контейнером при размещении на нее других компонентов.
    В прикрепленном рисунке постарался отобразить суть.
    Прикреплённый файлПрикреплённый файл3.JPG (25,98 Кбайт, скачиваний: 622)
      в конструкторе нужно указать что компонент может принимать другие компоненты
      ExpandedWrap disabled
        type
          TMyControl = class(TCustomControl)
          public
            constructor Create(AOwner: TComponent); override;
          end;
         
         
        constructor TMyControl.Create(AOwner: TComponent);
        begin
          inherited;
          ControlStyle := ControlStyle + [csAcceptsControls];
        end;
        Цитата ViktorXP @

        Указывать нужно у белой panel'и или же у главной панели на которой лежат три оставшиеся (заголовок, белая, нижняя часть)?
          указывать нужно у той которая должна принимать контролы
            Цитата ViktorXP @

            Ок. А нужно ли регистрировать мой класс, наследник от TPanel

            ExpandedWrap disabled
              type
                TMyPanel = class(TPanel)
                private
                  pnlTitle: TPanel;
                  pnlWhite: TPanel;
                  pnlBottom: TPanel
                end;
              регистрировать где? регистрировать как компонент? естественно иначе его не будет на панели компонентов.
                Цитата ViktorXP @
                регистрировать где? регистрировать как компонент?

                не в смысле вот так нужно ли делать:

                ExpandedWrap disabled
                  unit MyPanel;
                   
                  type TyPanel = class(TPanel)
                  ...
                   
                  initializate
                   RegisterClass(TMyPanel);
                  нет

                  Добавлено
                  имеется ввиду не нужно. RegisterComponents вполне достаточно
                    Цитата ViktorXP @


                    В конструкторе TMyPanel написал так:
                    ExpandedWrap disabled
                      pnlWhite.ControlStyle := pnlWhite.ControlStyle + [csAcceptsControls];

                    но это не помогло.

                    Добавлено
                    Цитата alexeybarkalov @
                    Цитата ViktorXP @


                    В конструкторе TMyPanel написал так:
                    ExpandedWrap disabled
                      pnlWhite.ControlStyle := pnlWhite.ControlStyle + [csAcceptsControls];

                    но это не помогло.

                    Как быть?
                      а какая у тебя версия?

                      Добавлено
                      я как не извращался у меня работает.

                      Добавлено
                      хотя тестил на XE2 (это единственное что стоит ща в системе)

                      Добавлено
                      хотя у TPanel уже стоит стиль csAcceptsControls
                      попробуй все наследовать от TCustomControl (а среднюю панель можно оставить TPanel)
                      Сообщение отредактировано: ViktorXP -
                        Цитата ViktorXP @
                        а какая у тебя версия?

                        BDS 2006

                        Цитата ViktorXP @
                        впринципи у TPanel уже стоит стиль csAcceptsControls

                        Да, я тоже посмотрел уже стоит.

                        Цитата ViktorXP @
                        попробуй все наследовать от TCustomControl (а среднюю панель можно оставить TPanel)

                        У меня по-коду используется св-во Color этих панелей, которое не видно в у TCustomPanel

                        Что делать?
                          Цитата alexeybarkalov @
                          У меня по-коду используется св-во Color этих панелей, которое не видно в у TCustomPanel

                          Что делать?
                          да ты сначала разберись что именно работает не так, и что нужно еще компоненту. а поменять наследника не проблема.

                          Добавлено
                          возможно в коде что то не то делаешь
                          вот что написано у меня
                          ExpandedWrap disabled
                            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.


                          Добавлено
                          Код примитивен но он позволяет нормально бросать контролы
                            Цитата ViktorXP @
                            Код примитивен но он позволяет нормально бросать контролы

                            У меня аналогичный код только не фига не работает, мож я исходник скину посмотришь?
                              не думаю что поможет, у нас разные версии VCL. когда то у меня было что то подобное но я не помню как я это решал.
                                Я нашел твой топик, решение простое нужно csAcceptsControls включать только у Self, а других контролах
                                размещенные на Self'e наоборот нужно выключить

                                Добавлено
                                нет ошибся проблема осталось, единственно что решилось что в структуре классов отображаемых Delphi, действительно у размещенного компонента родитель TMyPanel,
                                но проблема в том что когда у размещенного компонента (например, TMemo) делаем Align=alClient он размещается на всей области вместо того, чтобы разместитьтся
                                только на белой (см. прикрепленный рисунок в самом начале топика)
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0406 ]   [ 18 queries used ]   [ Generated: 26.04.24, 03:16 GMT ]