Dúvida na Criação de componentes TOwnedCollection e TCollectionItem

Delphi

23/08/2013

Tenho um componente de manutenção de dados com uma tela padrão.
Quando coloco o componente no form pelo object inspector, o componente cria no form um pagecontrol e internamente adiciona uma aba para consulta e outra para cadastro.
Pode-se incluir novas abas, caso precise.
As abas ficam invisíveis e automaticamente são criados em um panel à esquerda botões referente às abas do pagecontrol que ativa a página quando pressiona o botão. São do tipo tspeedbutton, agrupados.
Essas abas são padrões e fixas, o componente não deixa excluí-las (as duas primeiras).
Para a primeira aba que é de consulta não é criado o speedbutton lateral pois é acionada por um botão de consulta tipo um dbnavigator.
Para as outras abas de manutenção, cada uma tem seu speedbutton.
Dúvida: Quando coloco o componente no form pelo object inspector, no constructor do tpagina (TPaginas.add), eu vejo o pagecount. Se for 0, adiciono as duas: consulta e manutenção respectivamente. Se eu coloco o componente pela primeira vez, faz certo. Ele cria as duas abas no pagecontrol, 1 botão lateral no panel para manutenção.
Mas se eu salvo o projeto com o componente inserido no form, fecho o projeto e abro-o novamente, ele passa pelo constructor do tpagina quatro vezes, como se estivesse duplicado.
no constructor do tpaginas é feito:
with paginas.add do //retorna um tpagina
begin
Rotulo := ''Consulta'';
end;
with paginas.add do //retorna um tpagina
begin
Rotulo := ''Manutenção'';
end;
esse constructor é chamado duas vezes. Como se as páginas já tivessem sido criadas ao colocar anteriormente o componente no form.

segue a unit completa abaixo:
--------------------------------------------------------------------------------------------------------
unit uMaintenance;

interface

uses
Forms, DB,
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls,
Dialogs, ExtCtrls, StdCtrls, Buttons, pngimage, Menus,
ComCtrls, Mask,
Grids, SqlExpr, DBGrids, DBCtrls, Provider,
CheckLst,DateUtils, SimpleDS, uCRUD_Cadastro, uCRUD_Consulta, DBClient,
uBancoDados;

type
rCRUD = record
Cadastro: TCRUD_Cadastro;
Consulta: TCRUD_Consulta;
DSourceCadastro: TDataSource;
DSourceConsulta: TDataSource;
CDSCadastro: TClientDataSet;
CDSConsulta: TClientDataSet;
DSPCadastro: TDataSetProvider;
DSPConsulta: TDataSetProvider;
QRYCadastro: TSQLQuery;
QRYConsulta: TSQLDataSet;
end;

rContainers = record
Panel: TPanel;
ScrollBox: TScrollBox;
CRUD: rCRUD;
end;

rPanels = record
Containers: Array Of rContainers;
Panel: TPanel;
end;

TMaintenance = class;
TControle = class;
TControles = class;
TContainer = class;
TContainers = class;
TPaginas = class;
TPagina = class;

TTipo = (tpNone, tpLabel, tpGrid, tpText, tpEdit, tpComboBox, tpListBox, tpMemo, tpImage, tpCheckBox, tpRadioGroup, tpLookUpListBox, tpLookUpComboBox);

TControle = class(TCollectionItem)
private
fStatus: Integer;
fNivel: Integer;
fNome: String;
fCampo: String;
fTipo: TTipo;
fImage: TDBImage;
fRadioGroup: TDBRadioGroup;
fGrid: TDBGrid;
fListBox: TDBListBox;
fComboBox: TDBComboBox;
fText: TDBText;
fEdit: TDBEdit;
fCheckBox: TDBCheckBox;
fLookUpListBox: TDBLookUpListBox;
fLookUpComboBox: TDBLookUpComboBox;
fMemo: TDBMemo;
fContainer: TScrollBox;
fRotulo: TLabel;
procedure SetTipo(const Value: TTipo);
public
fControles: TControles;
fControle: TControl;
constructor Create(Collection2: TCollection); override;
destructor Destroy; override;
property Rotulo: TLabel read fRotulo write fRotulo;
property Grid: TDBGrid read fGrid write fGrid;
property Text: TDBText read fText write fText;
property Edit: TDBEdit read fEdit write fEdit;
property ComboBox: TDBComboBox read fComboBox write fComboBox;
property ListBox: TDBListBox read fListBox write fListBox;
property Memo: TDBMemo read fMemo write fMemo;
property Image: TDBImage read fImage write fImage;
property CheckBox: TDBCheckBox read fCheckBox write fCheckBox;
property RadioGroup: TDBRadioGroup read fRadioGroup write fRadioGroup;
property LookUpListBox: TDBLookUpListBox read fLookUpListBox write fLookUpListBox;
property LookUpComboBox: TDBLookUpComboBox read fLookUpComboBox write fLookUpComboBox;
published
property Tipo: TTipo read fTipo write SetTipo;
property Campo: String read fCampo write fCampo;
property Status: Integer read fStatus write fStatus; //0-Inativo;1-Ativo
property Nivel: Integer read fNivel write fNivel; //0-System;1-Aplicativo
end;

TControles = class(TOwnedCollection)
private
//fCampos: TCampos;
function GetItem(Index: Integer): TControle;
procedure SetItem(Index: Integer; const Value: TControle);
public
aControles: Array Of TControl;
fContainer: TContainer;
function Add: TControle;
function Insert(Index: Integer): TControle;
constructor Create(AOwner: TPersistent; ItemClass: TCollectionItemClass);
property Items[Index: Integer]: TControle read GetItem write SetItem;
end;

TContainer = class(TCollectionItem)
private
fControles: TControles;
fCRUD_Cadastro: TCRUD_Cadastro;
fCRUD_Consulta: TCRUD_Consulta;
fPanelContainer: TPanel;
public
fContainers: TContainers;
fScrollBox: TScrollBox;
fPanel: TPanel;
constructor Create(Collection2: TCollection); override;
destructor Destroy; override;
property Panel: TPanel read fPanel write fPanel;
property PanelContainer: TPanel read fPanelContainer write fPanelContainer;
published
property Controles: TControles read fControles write fControles;
property CRUD_Cadastro: TCRUD_Cadastro read fCRUD_Cadastro write fCRUD_Cadastro;
property CRUD_Consulta: TCRUD_Consulta read fCRUD_Consulta write fCRUD_Consulta;
end;

TContainers = class(TOwnedCollection)
private
function GetItem(Index: Integer): TContainer;
procedure SetItem(Index: Integer; const Value: TContainer);
public
fPagina: TPagina;
function Add: TContainer;
function Insert(Index: Integer): TContainer;
constructor Create(AOwner: TPersistent; ItemClass: TCollectionItemClass);
property Items[Index: Integer]: TContainer read GetItem write SetItem;
end;

TPagina = class(TCollectionItem)
private
fControles: TControles;
fContainers: TContainers;
fRotulo: String;
procedure SetRotulo(const Value: String);
public
fPaginas: TPaginas;
constructor Create(Collection2: TCollection); override;
destructor Destroy; override;
published
property Containers: TContainers read fContainers write fContainers;
property Rotulo: String read fRotulo write SetRotulo;
end;

TPaginas = class(TOwnedCollection)
private
fPageControl: TPageControl;
fPanelBotoes: TPanel;
aPanelBotoes: Array Of TSpeedButton;
function GetItem(Index: Integer): TPagina;
procedure SetItem(Index: Integer; const Value: TPagina);
public
fMaintenance: TMaintenance;
function Add: TPagina;
function Insert(Index: Integer): TPagina;
constructor Create(AOwner: TPersistent; ItemClass: TCollectionItemClass);
property Items[Index: Integer]: TPagina read GetItem write SetItem;
end;

TMaintenance = class(TComponent)
private
fTitulo: String;
fBancoDados: TBancoDados;
fPaginas: TPaginas;
procedure SetTitulo(const Value: String);
public
fForm: TForm;
fPanelStatus: TPanel;
procedure Maintenance;
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
published
property Titulo: String read fTitulo write SetTitulo;
property Paginas: TPaginas read fPaginas write fPaginas;
property BancoDados: TBancoDados read fBancoDados write fBancoDados;
end;
procedure Register;

implementation

uses uMainMaintenance, uMaintenancePaletaComponentes;

procedure Register;
begin
RegisterClass(TControles);
RegisterClass(TControle);
RegisterComponents(''JR_COMPS'', [TMaintenance]);
end;

{ TMaintenance }

constructor TMaintenance.Create(AOwner: TComponent);
begin
inherited;
fForm := TForm(AOwner);
fPanelStatus := TPanel.Create(Self);
fPanelStatus.Parent := fForm;
fPanelStatus.Align := alBottom;
fPanelStatus.ParentBackground := False;
fPanelStatus.ParentBiDiMode := False;
fPanelStatus.ParentColor := False;
fPanelStatus.ParentCtl3D := False;
fPanelStatus.Color := clBlack;
fPanelStatus.Height := 18;
fPanelStatus.Font.Color := clWhite;
fPanelStatus.Font.Style := [fsBold];
Paginas := TPaginas.Create(Self,TPagina);
if (Paginas.Count = 0) then
begin
with Paginas.Add do
begin
Rotulo := ''Consulta'';
end;
with Paginas.Add do
begin
Rotulo := ''Manutenção'';
end;
end;
end;

destructor TMaintenance.Destroy;
begin
//FreeAndNil(fPaginas);
inherited;
end;

procedure TMaintenance.Maintenance;
begin
Frm_uMaintenancePaletaComponentes.Top := 50;
Frm_uMaintenancePaletaComponentes.Left := Frm_uMainMaintenance.Width-Frm_uMaintenancePaletaComponentes.Width-10;
Frm_uMaintenancePaletaComponentes.Show;
Frm_uMainMaintenance.Show;
end;

procedure TMaintenance.SetTitulo(const Value: String);
begin
fTitulo := Value;
Self.fForm.Caption := Value;
end;

{ TControles }

function TControles.Add: TControle;
begin
Result := TControle(inherited Add);
end;

constructor TControles.Create(AOwner: TPersistent;
ItemClass: TCollectionItemClass);
begin
if not (AOwner is TContainer ) then
raise Exception.Create( ''AOwner deve ser do tipo TContainer'') ;
inherited;
fContainer := TContainer( AOwner ) ;
end;

function TControles.GetItem(Index: Integer): TControle;
begin
Result := TControle(inherited Items[Index]);
end;

function TControles.Insert(Index: Integer): TControle;
begin
Result := TControle(inherited Insert(Index));
end;

procedure TControles.SetItem(Index: Integer; const Value: TControle);
begin
Items[Index].Assign(Value);
end;

{ TControle }

constructor TControle.Create(Collection2: TCollection);
begin
inherited Create(Collection2);
fControles := TControles(Collection2);
//Instanciar aqui o TCampos
//Campos := TCampos.Create(Self);
end;

destructor TControle.Destroy;
begin
//Liberar aqui o TCampos
inherited Destroy;
end;

procedure TControle.SetTipo(const Value: TTipo);
begin
fTipo := Value;
if Assigned(fRotulo) then
FreeAndNil(fRotulo);
if Assigned(fImage) then
FreeAndNil(fImage);
if Assigned(fRadioGroup) then
FreeAndNil(fRadioGroup);
if Assigned(fGrid) then
FreeAndNil(fGrid);
if Assigned(fListBox) then
FreeAndNil(fListBox);
if Assigned(fComboBox) then
FreeAndNil(fComboBox);
if Assigned(fText) then
FreeAndNil(fText);
if Assigned(fEdit) then
FreeAndNil(fEdit);
if Assigned(fCheckBox) then
FreeAndNil(fCheckBox);
if Assigned(fLookUpListBox) then
FreeAndNil(fLookUpListBox);
if Assigned(fLookUpComboBox) then
FreeAndNil(fLookUpComboBox);
if Assigned(fMemo) then
FreeAndNil(fMemo);
if fTipo = tpNone then
Exit;
SetLength(fControles.aControles,Length(fControles.aControles)+1);
if fTipo = tpLabel then
begin
fRotulo := TLabel.Create(Frm_uMainMaintenance);
// fRotulo.Parent := TWinControl(Self.Container);
fRotulo.Top := Frm_uMainMaintenance.TopDrop;
fRotulo.Left := Frm_uMainMaintenance.LeftDrop;
fRotulo.Tag := Length(fControles.aControles);
fRotulo.Name := ''Componente''+IntToStr(Length(fControles.aControles));
fRotulo.Caption := ''Rotulo''+IntToStr(Length(fControles.aControles));
fRotulo.OnMouseDown := Frm_uMainMaintenance.ComponenteMouseDown;
fRotulo.OnMouseUp := Frm_uMainMaintenance.ComponenteMouseUp;
fRotulo.OnMouseMove := Frm_uMainMaintenance.ComponenteMouseMove;
fRotulo.OnClick := Frm_uMainMaintenance.FormClick;
fControle := fRotulo;
fControles.aControles[High(fControles.aControles)] := fRotulo as TControl;
Frm_uMainMaintenance.ComponenteAtivo := fRotulo;
Frm_uMainMaintenance.LigaSelecao;
Frm_uMainMaintenance.AtualizaPaletaComponentes;
Frm_uMaintenancePaletaComponentes.comboComponentes.Items.Add(''Componente''+IntToStr(Length(fControles.aControles))+'':TLabel'');
end;
if fTipo = tpImage then
begin
fImage := TDBImage.Create(Frm_uMainMaintenance);
// fImage.Parent := TWinControl(Self.Container);
fImage.Name := ''Componente''+IntToStr(Length(fControles.aControles));
fImage.Top := Frm_uMainMaintenance.TopDrop;
fImage.Left := Frm_uMainMaintenance.LeftDrop;
fImage.Tag := Length(fControles.aControles);
fImage.OnMouseDown := Frm_uMainMaintenance.ComponenteMouseDown;
fImage.OnMouseUp := Frm_uMainMaintenance.ComponenteMouseUp;
fImage.OnMouseMove := Frm_uMainMaintenance.ComponenteMouseMove;
fImage.OnClick := Frm_uMainMaintenance.FormClick;
// fImage.DataSource := Frm_uMainMaintenance.Maintenance.aContainers[Frm_uMainMaintenance.ContainerAtivo.Linha].Containers[Frm_uMainMaintenance.ContainerAtivo.Coluna].CRUD.DSourceCadastro;
fControle := fImage;
fControles.aControles[High(fControles.aControles)] := fImage as TControl;
Frm_uMainMaintenance.ComponenteAtivo := fImage;
Frm_uMainMaintenance.LigaSelecao;
Frm_uMainMaintenance.AtualizaPaletaComponentes;
Frm_uMaintenancePaletaComponentes.comboComponentes.Items.Add(''Componente''+IntToStr(Length(fControles.aControles))+'':TDBImage'');
end;
if fTipo = tpRadioGroup then
begin
fRadioGroup := TDBRadioGroup.Create(Frm_uMainMaintenance);
fRadioGroup.Name := ''Componente''+IntToStr(Length(fControles.aControles));
// fRadioGroup.Parent := TWinControl(Self.Container);
fRadioGroup.Top := Frm_uMainMaintenance.TopDrop;
fRadioGroup.Left := Frm_uMainMaintenance.LeftDrop;
fRadioGroup.Tag := Length(fControles.aControles);
//fRadioGroup.OnMouseDown := Frm_uMainMaintenance.ComponenteMouseDown;
//fRadioGroup.OnMouseUp := Frm_uMainMaintenance.ComponenteMouseUp;
//fRadioGroup.OnMouseMove := Frm_uMainMaintenance.ComponenteMouseMove;
fRadioGroup.OnClick := Frm_uMainMaintenance.FormClick;
// fRadioGroup.DataSource := Frm_uMainMaintenance.Maintenance.aContainers[Frm_uMainMaintenance.ContainerAtivo.Linha].Containers[Frm_uMainMaintenance.ContainerAtivo.Coluna].CRUD.DSourceCadastro;
fControle := fRadioGroup;
fControles.aControles[High(fControles.aControles)] := fRadioGroup as TControl;
Frm_uMainMaintenance.ComponenteAtivo := fRadioGroup;
Frm_uMainMaintenance.LigaSelecao;
Frm_uMainMaintenance.AtualizaPaletaComponentes;
Frm_uMaintenancePaletaComponentes.comboComponentes.Items.Add(''Componente''+IntToStr(Length(fControles.aControles))+'':TDBRadioGroup'');
end;
if fTipo = tpGrid then
begin
fGrid := TDBGrid.Create(Frm_uMainMaintenance);
// fGrid.Parent := TWinControl(Self.Container);
fGrid.Name := ''Componente''+IntToStr(Length(fControles.aControles));
fGrid.Top := Frm_uMainMaintenance.TopDrop;
fGrid.Left := Frm_uMainMaintenance.LeftDrop;
fGrid.Tag := Length(fControles.aControles);
fGrid.OnMouseDown := Frm_uMainMaintenance.ComponenteMouseDown;
fGrid.OnMouseUp := Frm_uMainMaintenance.ComponenteMouseUp;
fGrid.OnMouseMove := Frm_uMainMaintenance.ComponenteMouseMove;
// fGrid.DataSource := Frm_uMainMaintenance.Maintenance.aContainers[Frm_uMainMaintenance.ContainerAtivo.Linha].Containers[Frm_uMainMaintenance.ContainerAtivo.Coluna].CRUD.DSourceCadastro;
fControle := fGrid;
fControles.aControles[High(fControles.aControles)] := fGrid as TControl;
Frm_uMainMaintenance.ComponenteAtivo := fGrid;
Frm_uMainMaintenance.LigaSelecao;
Frm_uMainMaintenance.AtualizaPaletaComponentes;
Frm_uMaintenancePaletaComponentes.comboComponentes.Items.Add(''Componente''+IntToStr(Length(fControles.aControles))+'':TDBGrid'');
end;
if fTipo = tpListBox then
begin
fListBox := TDBListBox.Create(Frm_uMainMaintenance);
fListBox.Name := ''Componente''+IntToStr(Length(fControles.aControles));
// fListBox.Parent := TWinControl(Self.Container);
fListBox.Top := Frm_uMainMaintenance.TopDrop;
fListBox.Left := Frm_uMainMaintenance.LeftDrop;
fListBox.Tag := Length(fControles.aControles);
fListBox.OnMouseDown := Frm_uMainMaintenance.ComponenteMouseDown;
fListBox.OnMouseUp := Frm_uMainMaintenance.ComponenteMouseUp;
fListBox.OnMouseMove := Frm_uMainMaintenance.ComponenteMouseMove;
fListBox.OnClick := Frm_uMainMaintenance.FormClick;
// fListBox.DataSource := Frm_uMainMaintenance.Maintenance.aContainers[Frm_uMainMaintenance.ContainerAtivo.Linha].Containers[Frm_uMainMaintenance.ContainerAtivo.Coluna].CRUD.DSourceCadastro;
fControle := fListBox;
fControles.aControles[High(fControles.aControles)] := fListBox as TControl;
Frm_uMainMaintenance.ComponenteAtivo := fListBox;
Frm_uMainMaintenance.LigaSelecao;
Frm_uMainMaintenance.AtualizaPaletaComponentes;
Frm_uMaintenancePaletaComponentes.comboComponentes.Items.Add(''Componente''+IntToStr(Length(fControles.aControles))+'':TDBListBox'');
end;
if fTipo = tpComboBox then
begin
fComboBox := TDBComboBox.Create(Frm_uMainMaintenance);
fComboBox.Name := ''Componente''+IntToStr(Length(fControles.aControles));
// fComboBox.Parent := TWinControl(Self.Container);
fComboBox.Top := Frm_uMainMaintenance.TopDrop;
fComboBox.Left := Frm_uMainMaintenance.LeftDrop;
fComboBox.Tag := Length(fControles.aControles);
//fComboBox.OnMouseDown := Frm_uMainMaintenance.ComponenteMouseDown;
//fComboBox.OnMouseUp := Frm_uMainMaintenance.ComponenteMouseUp;
//fComboBox.OnMouseMove := Frm_uMainMaintenance.ComponenteMouseMove;
fComboBox.OnClick := Frm_uMainMaintenance.FormClick;
// fComboBox.DataSource := Frm_uMainMaintenance.Maintenance.aContainers[Frm_uMainMaintenance.ContainerAtivo.Linha].Containers[Frm_uMainMaintenance.ContainerAtivo.Coluna].CRUD.DSourceCadastro;
fControle := fComboBox;
fControles.aControles[High(fControles.aControles)] := fComboBox as TControl;
Frm_uMainMaintenance.ComponenteAtivo := fComboBox;
Frm_uMainMaintenance.LigaSelecao;
Frm_uMainMaintenance.AtualizaPaletaComponentes;
Frm_uMaintenancePaletaComponentes.comboComponentes.Items.Add(''Componente''+IntToStr(Length(fControles.aControles))+'':TDBComboBox'');
end;
if fTipo = tpText then
begin
fText := TDBText.Create(Frm_uMainMaintenance);
fText.Name := ''Componente''+IntToStr(Length(fControles.aControles));
// fText.Parent := TWinControl(Self.Container);
fText.Top := Frm_uMainMaintenance.TopDrop;
fText.Left := Frm_uMainMaintenance.LeftDrop;
fText.Tag := Length(fControles.aControles);
fText.OnMouseDown := Frm_uMainMaintenance.ComponenteMouseDown;
fText.OnMouseUp := Frm_uMainMaintenance.ComponenteMouseUp;
fText.OnMouseMove := Frm_uMainMaintenance.ComponenteMouseMove;
fText.OnClick := Frm_uMainMaintenance.FormClick;
// fText.DataSource := Frm_uMainMaintenance.Maintenance.aContainers[Frm_uMainMaintenance.ContainerAtivo.Linha].Containers[Frm_uMainMaintenance.ContainerAtivo.Coluna].CRUD.DSourceCadastro;
fControle := fText;
fControles.aControles[High(fControles.aControles)] := fText as TControl;
Frm_uMainMaintenance.ComponenteAtivo := fText;
Frm_uMainMaintenance.LigaSelecao;
Frm_uMainMaintenance.AtualizaPaletaComponentes;
Frm_uMaintenancePaletaComponentes.comboComponentes.Items.Add(''Componente''+IntToStr(Length(fControles.aControles))+'':TDBText'');
end;
if fTipo = tpEdit then
begin
fEdit := TDBEdit.Create(Frm_uMainMaintenance);
fEdit.Name := ''Componente''+IntToStr(Length(fControles.aControles));
// fEdit.Parent := TWinControl(Self.Container);
fEdit.Top := Frm_uMainMaintenance.TopDrop;
fEdit.Left := Frm_uMainMaintenance.LeftDrop;
fEdit.Tag := Length(fControles.aControles);
fEdit.OnMouseDown := Frm_uMainMaintenance.ComponenteMouseDown;
fEdit.OnMouseUp := Frm_uMainMaintenance.ComponenteMouseUp;
fEdit.OnMouseMove := Frm_uMainMaintenance.ComponenteMouseMove;
fEdit.OnClick := Frm_uMainMaintenance.FormClick;
// fEdit.DataSource := Frm_uMainMaintenance.Maintenance.aContainers[Frm_uMainMaintenance.ContainerAtivo.Linha].Containers[Frm_uMainMaintenance.ContainerAtivo.Coluna].CRUD.DSourceCadastro;
fControle := fEdit;
fControles.aControles[High(fControles.aControles)] := fEdit as TControl;
Frm_uMainMaintenance.ComponenteAtivo := fEdit;
Frm_uMainMaintenance.LigaSelecao;
Frm_uMainMaintenance.AtualizaPaletaComponentes;
Frm_uMaintenancePaletaComponentes.comboComponentes.Items.Add(''Componente''+IntToStr(Length(fControles.aControles))+'':TDBEdit'');
end;
if fTipo = tpCheckBox then
begin
fCheckBox := TDBCheckBox.Create(Frm_uMainMaintenance);
fCheckBox.Name := ''Componente''+IntToStr(Length(fControles.aControles));
// fCheckBox.Parent := TWinControl(Self.Container);
fCheckBox.Top := Frm_uMainMaintenance.TopDrop;
fCheckBox.Left := Frm_uMainMaintenance.LeftDrop;
fCheckBox.Tag := Length(fControles.aControles);
fCheckBox.OnMouseDown := Frm_uMainMaintenance.ComponenteMouseDown;
fCheckBox.OnMouseUp := Frm_uMainMaintenance.ComponenteMouseUp;
fCheckBox.OnMouseMove := Frm_uMainMaintenance.ComponenteMouseMove;
fCheckBox.OnClick := Frm_uMainMaintenance.FormClick;
// fCheckBox.DataSource := Frm_uMainMaintenance.Maintenance.aContainers[Frm_uMainMaintenance.ContainerAtivo.Linha].Containers[Frm_uMainMaintenance.ContainerAtivo.Coluna].CRUD.DSourceCadastro;
fControle := fCheckBox;
fControles.aControles[High(fControles.aControles)] := fCheckBox as TControl;
Frm_uMainMaintenance.ComponenteAtivo := fCheckBox;
Frm_uMainMaintenance.LigaSelecao;
Frm_uMainMaintenance.AtualizaPaletaComponentes;
Frm_uMaintenancePaletaComponentes.comboComponentes.Items.Add(''Componente''+IntToStr(Length(fControles.aControles))+'':TDBCheckBox'');
end;
if fTipo = tpLookUpListBox then
begin
fLookUpListBox := TDBLookupListBox.Create(Frm_uMainMaintenance);
// fLookUpListBox.Parent := TWinControl(Self.Container);
fLookUpListBox.Name := ''Componente''+IntToStr(Length(fControles.aControles));
fLookUpListBox.Top := Frm_uMainMaintenance.TopDrop;
fLookUpListBox.Left := Frm_uMainMaintenance.LeftDrop;
fLookUpListBox.Tag := Length(fControles.aControles);
fLookUpListBox.OnMouseDown := Frm_uMainMaintenance.ComponenteMouseDown;
fLookUpListBox.OnMouseUp := Frm_uMainMaintenance.ComponenteMouseUp;
fLookUpListBox.OnMouseMove := Frm_uMainMaintenance.ComponenteMouseMove;
fLookUpListBox.OnClick := Frm_uMainMaintenance.FormClick;
// fLookUpListBox.DataSource := Frm_uMainMaintenance.Maintenance.aContainers[Frm_uMainMaintenance.ContainerAtivo.Linha].Containers[Frm_uMainMaintenance.ContainerAtivo.Coluna].CRUD.DSourceCadastro;
fControle := fLookUpListBox;
fControles.aControles[High(fControles.aControles)] := fLookUpListBox as TControl;
Frm_uMainMaintenance.ComponenteAtivo := fLookUpListBox;
Frm_uMainMaintenance.LigaSelecao;
Frm_uMainMaintenance.AtualizaPaletaComponentes;
Frm_uMaintenancePaletaComponentes.comboComponentes.Items.Add(''Componente''+IntToStr(Length(fControles.aControles))+'':TDBLookUpListBox'');
end;
if fTipo = tpLookUpComboBox then
begin
fLookUpComboBox := TDBLookupComboBox.Create(Frm_uMainMaintenance);
// fLookUpComboBox.Parent := TWinControl(Self.Container);
fLookUpComboBox.Name := ''Componente''+IntToStr(Length(fControles.aControles));
fLookUpComboBox.Top := Frm_uMainMaintenance.TopDrop;
fLookUpComboBox.Left := Frm_uMainMaintenance.LeftDrop;
fLookUpComboBox.Tag := Length(fControles.aControles);
fLookUpComboBox.OnMouseDown := Frm_uMainMaintenance.ComponenteMouseDown;
fLookUpComboBox.OnMouseUp := Frm_uMainMaintenance.ComponenteMouseUp;
fLookUpComboBox.OnMouseMove := Frm_uMainMaintenance.ComponenteMouseMove;
fLookUpComboBox.OnClick := Frm_uMainMaintenance.FormClick;
// fLookUpComboBox.DataSource := Frm_uMainMaintenance.Maintenance.aContainers[Frm_uMainMaintenance.ContainerAtivo.Linha].Containers[Frm_uMainMaintenance.ContainerAtivo.Coluna].CRUD.DSourceCadastro;
fControle := fLookUpComboBox;
fControles.aControles[High(fControles.aControles)] := fLookUpComboBox as TControl;
Frm_uMainMaintenance.ComponenteAtivo := fLookUpComboBox;
Frm_uMainMaintenance.LigaSelecao;
Frm_uMainMaintenance.AtualizaPaletaComponentes;
Frm_uMaintenancePaletaComponentes.comboComponentes.Items.Add(''Componente''+IntToStr(Length(fControles.aControles))+'':TLookUpComboBox'');
end;
if fTipo = tpMemo then
begin
fMemo := TDBMemo.Create(Frm_uMainMaintenance);
// fMemo.Parent := TWinControl(Self.Container);
fMemo.Name := ''Componente''+IntToStr(Length(fControles.aControles));
fMemo.Top := Frm_uMainMaintenance.TopDrop;
fMemo.Left := Frm_uMainMaintenance.LeftDrop;
fMemo.Tag := Length(fControles.aControles);
fMemo.OnMouseDown := Frm_uMainMaintenance.ComponenteMouseDown;
fMemo.OnMouseUp := Frm_uMainMaintenance.ComponenteMouseUp;
fMemo.OnMouseMove := Frm_uMainMaintenance.ComponenteMouseMove;
fMemo.OnClick := Frm_uMainMaintenance.FormClick;
// fMemo.DataSource := Frm_uMainMaintenance.Maintenance.aContainers[Frm_uMainMaintenance.ContainerAtivo.Linha].Containers[Frm_uMainMaintenance.ContainerAtivo.Coluna].CRUD.DSourceCadastro;
fControle := fMemo;
fControles.aControles[High(fControles.aControles)] := fMemo as TControl;
Frm_uMainMaintenance.ComponenteAtivo := fMemo;
Frm_uMainMaintenance.LigaSelecao;
Frm_uMainMaintenance.AtualizaPaletaComponentes;
Frm_uMaintenancePaletaComponentes.comboComponentes.Items.Add(''Componente''+IntToStr(Length(fControles.aControles))+'':TDBMemo'');
end;
Frm_uMaintenancePaletaComponentes.comboComponentes.ItemIndex := Frm_uMaintenancePaletaComponentes.comboComponentes.Items.Count-1;
end;

{ TContainer }

constructor TContainer.Create(Collection2: TCollection);
var
x: Integer;
begin
fContainers := TContainers(Collection2);
if Self.fContainers.Count > 0 then
begin
for x := 0 to Self.fContainers.Count - 1 do
begin
Self.fContainers.Items[x].fPanel.Align := alTop;
if Self.fContainers.Items[x].fPanel.Height <> 200 then
Self.fContainers.Items[x].fPanel.Height := 200;
end;
end;

inherited Create(Collection2);
//Instanciar aqui o TCampos
Controles := TControles.Create(Self,TControle);

fPanel := TPanel.Create(Self.fContainers.fPagina.fPaginas.fMaintenance);
fPanel.Parent := Self.fContainers.fPagina.fPaginas.fPageControl.Pages[Self.fContainers.fPagina.Index];
fPanel.Align := alClient;
fPanel.ParentBackground := False;
fPanel.ParentBiDiMode := False;
fPanel.ParentColor := False;
fPanel.ParentCtl3D := False;

fPanelContainer := TPanel.Create(fPanel);
fPanelContainer.Parent := fPanel;
fPanelContainer.Align := alClient;
fPanelContainer.ParentBackground := False;
fPanelContainer.ParentBiDiMode := False;
fPanelContainer.ParentColor := False;
fPanelContainer.ParentCtl3D := False;
fPanelContainer.Color := clWhite;

fScrollBox := TScrollBox.Create(fPanel);
fScrollBox.Parent := fPanelContainer;
fScrollBox.Align := alClient;
fScrollBox.ParentBackground := False;
fScrollBox.ParentBiDiMode := False;
fScrollBox.ParentColor := False;
fScrollBox.ParentCtl3D := False;
fScrollBox.Color := clWhite;

fCRUD_Consulta := TCRUD_Consulta.Create(fPanel);
fCRUD_Consulta.Container := Self.fContainers.fPagina.fPaginas.fPageControl.Pages[0];

fCRUD_Cadastro := TCRUD_Cadastro.Create(fPanel);
fCRUD_Cadastro.Container := fPanelContainer;
fCRUD_Cadastro.CRUD_Consulta := fCRUD_Consulta;
fScrollBox.Enabled := True;

fCRUD_Cadastro.SetSubComponent(True);
fCRUD_Consulta.SetSubComponent(True);

end;

destructor TContainer.Destroy;
var
x: Integer;
begin
if Assigned(Self.fPanel) then
FreeAndNil(Self.fPanel);
inherited Destroy;
if Self.fContainers.Count > 0 then
begin
for x := 0 to Self.fContainers.Count - 2 do
begin
Self.fContainers.Items[x].fPanel.Align := alTop;
if Self.fContainers.Items[x].fPanel.Height <> 200 then
Self.fContainers.Items[x].fPanel.Height := 200;
end;
Self.fContainers.Items[Self.fContainers.Count-1].fPanel.Align := alClient;
end;
end;

{ TPagina }
constructor TPagina.Create(Collection2: TCollection);
var
TabSheet: TTabSheet;
x: Integer;
begin
inherited Create(Collection2);
fPaginas := TPaginas(Collection2);
Containers := TContainers.Create(Self,TContainer);
TabSheet := TTabSheet.Create(Self.fPaginas.fPageControl);
with TabSheet do
begin
Caption := '''';
//TabVisible := False;
PageControl := Self.fPaginas.fPageControl;
end;
Self.fPaginas.fPageControl.ActivePage := TabSheet;


showmessage(inttostr(Self.fPaginas.fPageControl.PageCount)); //apenas para testar


if (Self.fPaginas.fPageControl.PageCount > 1) then
begin
SetLength(Self.fPaginas.aPanelBotoes,Length(Self.fPaginas.aPanelBotoes)+1);
Self.fPaginas.aPanelBotoes[High(Self.fPaginas.aPanelBotoes)] := TSpeedButton.Create(Self.fPaginas.fPageControl);
Self.fPaginas.aPanelBotoes[High(Self.fPaginas.aPanelBotoes)].GroupIndex := 1;
Self.fPaginas.aPanelBotoes[High(Self.fPaginas.aPanelBotoes)].Flat := True;
Self.fPaginas.aPanelBotoes[High(Self.fPaginas.aPanelBotoes)].Down := True;
Self.fPaginas.aPanelBotoes[High(Self.fPaginas.aPanelBotoes)].Parent := Self.fPaginas.fPanelBotoes;
Self.fPaginas.aPanelBotoes[High(Self.fPaginas.aPanelBotoes)].Tag := Self.fPaginas.fPageControl.PageCount-1;
Self.fPaginas.aPanelBotoes[High(Self.fPaginas.aPanelBotoes)].Align := alTop;
Self.fPaginas.aPanelBotoes[High(Self.fPaginas.aPanelBotoes)].Height := 20;
for x := 0 to High(Self.fPaginas.aPanelBotoes) do
if x > 0 then
Self.fPaginas.aPanelBotoes[x].Top := Self.fPaginas.aPanelBotoes[x-1].Top + Self.fPaginas.aPanelBotoes[x-1].Height;
end;
end;

destructor TPagina.Destroy;
begin
if (Self.fPaginas.fPageControl.PageCount > 0) And (Self.Index <= Self.fPaginas.fPageControl.PageCount-1) then
Self.fPaginas.fPageControl.Pages[Self.Index].Free;
inherited Destroy;
end;

procedure TPagina.SetRotulo(const Value: String);
begin
fRotulo := Value;
Self.fPaginas.fPageControl.Pages[Self.Index].Caption := fRotulo;
if Self.Index > 0 then
Self.fPaginas.aPanelBotoes[Self.Index-1].Caption := fRotulo;
end;

{ TPaginas }
function TPaginas.Add: TPagina;
begin
Result := TPagina(inherited Add);
end;

constructor TPaginas.Create(AOwner: TPersistent;
ItemClass: TCollectionItemClass);
begin
if not (AOwner is TMaintenance ) then
raise Exception.Create( ''AOwner deve ser do tipo TMaintenance'') ;
inherited;
fMaintenance := TMaintenance( AOwner ) ;
fPageControl := TPageControl.Create(fMaintenance);
fPageControl.Parent := fMaintenance.fForm;
fPageControl.Align := alClient;
fPanelBotoes := TPanel.Create(fMaintenance);
fPanelBotoes.Parent := fMaintenance.fForm;
fPanelBotoes.Align := alLeft;
fPanelBotoes.ParentBackground := False;
fPanelBotoes.ParentBiDiMode := False;
fPanelBotoes.ParentColor := False;
fPanelBotoes.ParentCtl3D := False;
fPanelBotoes.Color := clSkyBlue;
fPanelBotoes.Width := 150;
fPanelBotoes.Font.Color := clWhite;
fPanelBotoes.Font.Style := [fsBold];
SetLength(Self.aPanelBotoes,0);
end;

function TPaginas.GetItem(Index: Integer): TPagina;
begin
Result := TPagina(inherited Items[Index]);
end;

function TPaginas.Insert(Index: Integer): TPagina;
begin
Result := TPagina(inherited Insert(Index));
end;

procedure TPaginas.SetItem(Index: Integer; const Value: TPagina);
begin
Items[Index].Assign(Value);
end;

{ TContainers }

function TContainers.Add: TContainer;
begin
Result := TContainer(inherited Add);
end;

constructor TContainers.Create(AOwner: TPersistent;
ItemClass: TCollectionItemClass);
begin
if not (AOwner is TPagina ) then
raise Exception.Create( ''AOwner deve ser do tipo TPagina'') ;
inherited;
fPagina := TPagina( AOwner ) ;
end;

function TContainers.GetItem(Index: Integer): TContainer;
begin
Result := TContainer(inherited Items[Index]);
end;

function TContainers.Insert(Index: Integer): TContainer;
begin
Result := TContainer(inherited Insert(Index));
end;

procedure TContainers.SetItem(Index: Integer; const Value: TContainer);
begin
Items[Index].Assign(Value);
end;

end.
--------------------------------------------------------------------------------------------------------------------------------------
grato pela atenção.

jrmalaquias@gmail.com

Tudo veio a partir de um sopro criador, donde tudo retornará à fonte.
A fonte nos criou e nos deixou ligados uns aos outros e à Ela por uma substância que é atraída pelo imã maior.
A escolha é nossa de manter essa substância ativa que está dentro de nós.
Essa substância é o AMOR, que quando é estimulada, mais se tem.
Amor, é perdão... é abnegação... é desprendimento... é doação...
Viemos do AMOR e voltaremos para o AMOR, amando...
Muita paz.

Edmilson Malaquia

Edmilson Malaquia

Curtidas 0
POSTAR