Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Компоненты Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 24.08.2011, 22:57   #1
alexey.barkalov
 
Регистрация: 24.08.2011
Сообщений: 6
Вопрос Как свой компонент, состоящий из других компонентов, сделать контейнером

Разрабатываю свой компонент, который состоит из панелей.
В прикрепленном рисунке постарался отобразить суть.

Как сделать так, чтобы при размещении компонента на мой компонент он размещался только на Panel2 (так которая белая по цвету) и верно отображался в окне Structure в BDS, в dfm-файле удалось переопределив GetChildren. Привожу код, отражающий суть моего рабочего кода.
Код:
TCustomControl1 = class(TPanel)
  private
    Panel1: TPanel;
    Panel2: TPanel;
    Panel3: TPanel;
  protected
    function GetChildren(Proc: TGetChildProc; Root: TComponent);
    
  public
    constructor Create(AOwner: TComponent); override;
  published
    { Published declarations }
  end;
 
procedure Register;
 
implementation
 
procedure Register;
begin
  RegisterComponents('Samples', [TCustomControl1]);
end;
 
procedure
  TCustomControl1.GetChildren(Proc: TGetChildProc; Root: TComponent);
var
  i: integer;
begin

  inherited GetChildren(Proc, Root);
  for I := 0 to Panel2.ControlCount - 1 do
    Proc(Panel2.Controls[i]);
    
end;
 
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;
Изображения
Тип файла: jpg 3.JPG (26.0 Кб, 104 просмотров)

Последний раз редактировалось alexey.barkalov; 24.08.2011 в 23:00.
alexey.barkalov вне форума Ответить с цитированием
Старый 25.08.2011, 12:13   #2
DenNik2006
Пользователь
 
Аватар для DenNik2006
 
Регистрация: 27.07.2011
Сообщений: 71
По умолчанию

а так не пробовал?
Panel1.ControlStyle := Panel1.ControlStyle - [csAcceptsControls];
Panel3.ControlStyle := Panel3.ControlStyle - [csAcceptsControls];
Техника несовершенна: компьютеру, чтобы прийти в себя, нужно три пальца, человеку - всего два!
DenNik2006 вне форума Ответить с цитированием
Старый 25.08.2011, 12:48   #3
DenNik2006
Пользователь
 
Аватар для DenNik2006
 
Регистрация: 27.07.2011
Сообщений: 71
Смущение

вот, наваял. при попытке установить компонент на верхнюю или нижнюю панель он присваивается форме. работает и без GetChildren. кстати, что делает эта процедура?
Код:
unit MyPanel;

interface

uses
  SysUtils, Classes, Controls, ExtCtrls;

type
  TMyPanel = class(TPanel)
  private
    FPanelTop: TPanel;
    FPanelMain: TPanel;
    FPanelBottom: TPanel;
  protected
    //procedure GetChildren(Proc: TGetChildProc; Root: TComponent); override;
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
  published
    { Published declarations }
  end;

procedure Register;

implementation

procedure Register;
begin
  RegisterComponents('Samples', [TMyPanel]);
end;

{ TMyPanel }

constructor TMyPanel.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  FPanelTop:= TPanel.Create(Self);
  FPanelTop.Parent:= Self;
  FPanelTop.Align:= alTop;
  FPanelTop.Height:= 20;
  FPanelTop.ControlStyle:= FPanelTop.ControlStyle - [csAcceptsControls];

  FPanelBottom:= TPanel.Create(Self);
  FPanelBottom.Parent:= Self;
  FPanelBottom.Align:= alBottom;
  FPanelBottom.Height:= 20;
  FPanelBottom.ControlStyle:= FPanelBottom.ControlStyle - [csAcceptsControls];

  FPanelMain:= TPanel.Create(Self);
  FPanelMain.Parent:= Self;
  FPanelMain.Align:= alClient;

  ControlStyle:= ControlStyle - [csAcceptsControls];
end;

destructor TMyPanel.Destroy;
begin
  FPanelTop.Free;
  FPanelMain.Free;
  FPanelBottom.Free;
  inherited Destroy;
end;
{
procedure TMyPanel.GetChildren(Proc: TGetChildProc; Root: TComponent);
var
  i: integer;
begin
  inherited GetChildren(Proc,Root);
  for I := 0 to FPanelMain.ControlCount - 1 do
    Proc(FPanelMain.Controls[i]);
end;
}
end.
кстати, TMyPanel можно наследовать и не от TPanel, а например от TWinControl
Техника несовершенна: компьютеру, чтобы прийти в себя, нужно три пальца, человеку - всего два!

Последний раз редактировалось DenNik2006; 25.08.2011 в 12:53.
DenNik2006 вне форума Ответить с цитированием
Старый 25.08.2011, 23:00   #4
DelphiLexx
 
Регистрация: 28.06.2011
Сообщений: 3
По умолчанию

[QUOTE=DenNik2006;866245]вот, наваял. при попытке установить компонент на верхнюю или нижнюю панель он присваивается форме. работает и без GetChildren. кстати, что делает эта процедура?
у меня в окне Structure Delphi, внешний компонент размещается не в моем компоненте, а в корне
DelphiLexx вне форума Ответить с цитированием
Старый 29.08.2011, 10:02   #5
DenNik2006
Пользователь
 
Аватар для DenNik2006
 
Регистрация: 27.07.2011
Сообщений: 71
По умолчанию

мой код работает?
Техника несовершенна: компьютеру, чтобы прийти в себя, нужно три пальца, человеку - всего два!
DenNik2006 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как правильно сделать свой итератор? nowaalex Общие вопросы C/C++ 0 06.11.2010 21:06
Программа запрашивает имя файла и формирует массив, состоящий из сумм каждых трех вещественных компонент brother-bear Помощь студентам 0 26.04.2010 19:09
Как добавить свой компонент в палитру Делфи? Utkin Софт 20 04.02.2010 14:25
Как сделать БД на основе двух других PARTOS Microsoft Office Excel 8 11.12.2009 07:54
Как создать свой компонент? Д'якон Компоненты Delphi 1 21.05.2008 16:37