Subcomponente em um CollectionItem

Delphi

29/05/2012

Bom dia senhores

Estou com um problema ao criar um componente com TCollection, na coleção de itens eu quero ter uma propriedade do Tipo TDataSet, que quero instanciar como TClientDataSet.

Este trecho do código pode ser observado na linha 47

unit MX.DataSetsAbstract;

interface

uses
  Data.DB, System.Classes, System.SysUtils, Datasnap.DBClient;

type
  TDSItem = class;
  TDSCollection = class;

  TDSItem = class(TCollectionItem)
  private
    FDataSet: TClientDataSet;
    procedure SetDataSet(const Value: TClientDataSet);
    function GetDataSet: TClientDataSet;
  protected
    function GetDisplayName: String; override;
  public
    constructor Create(Collection: TCollection); override;
    destructor Destroy; override;
  published
    property DataSet: TClientDataSet read FDataSet write SetDataSet;
  end;

  TDSCollection = class(TCollection)
  private
    FOwner: TPersistent;
    function GetItems(Index: Integer): TDSItem;
  protected
    function GetOwner: TPersistent; override;
  public
    constructor Create(Owner: TComponent);
    function Add: TDSItem;
    function Insert(Index: Integer): TDSItem;
    property Items[Index: Integer]: TDSItem read GetItems;
  end;

implementation

{$Region ( TCustomItem ) }

constructor TDSItem.Create(Collection: TCollection);
begin
  inherited Create(Collection);
  FDataSet := TClientDataSet.Create(SELF);  // SELF NÃO FUNCIONA POIS NÃO É TCOMPONENT, E SIM TPERSISTENT
  FDataSet.Name := ClientDataSet;
end;

destructor TDSItem.Destroy;
begin
  FDataSet.Destroy;
  inherited;
end;

function TDSItem.GetDataSet: TClientDataSet;
begin
  Result := FDataSet
end;

function TDSItem.GetDisplayName;
begin
  inherited;
  Result := Format(Item %d, [Index]);
end;

procedure TDSItem.SetDataSet(const Value: TClientDataSet);
begin
  FDataSet := Value;
end;

{$EndRegion}

{$Region( TCustomCollection )}

function TDSCollection.Add: TDSItem;
begin
  Result := TDSItem(inherited Add);
  Result.FDataSet := TClientDataSet.Create(NIL);
  Result.FDataSet.Name := DataSet + IntToStr(Result.Index);
end;

constructor TDSCollection.Create(Owner: TComponent);
begin
  inherited Create(TDSItem);
  FOwner := Owner;
end;

function TDSCollection.GetItems(Index: Integer): TDSItem;
begin
  Result := TDSItem(inherited Items[Index]);
end;

function TDSCollection.GetOwner: TPersistent;
begin
  Result := FOwner;
end;

function TDSCollection.Insert(Index: Integer): TDSItem;
begin
  Result := TDSItem(inherited Insert(Index));
end;

{$EndRegion}

end.


Sendo assim, fica minha dúvida, [b]como criar um TClienteDataSet[/b] fazendo com que ele seja um atributo de um TCollectionItem, [b]sendo que o Owner de TClientDataSet precisar ser TComponent e o TCollectionItem[/b] é um TPersistent?
Aloizio Castro

Aloizio Castro

Curtidas 0

Respostas

Marco Salles

Marco Salles

29/05/2012

constructor TDSItem.Create(Collection: TCollection);
begin
inherited Create(Collection);
FDataSet := TClientDataSet.Create(SELF); // SELF NÃO FUNCIONA POIS NÃO É TCOMPONENT, E SIM TPERSISTENT
FDataSet.Name := ClientDataSet;
end;


Vc esta querendo que a classe TDSItem seje proprietária do FDataSet ???

pq que vc não passa nil como Owner ???


constructor TDSItem.Create(Collection: TCollection);
begin
inherited Create(Collection);
FDataSet := TClientDataSet.Create(Nil); 
FDataSet.Name := ClientDataSet;
GOSTEI 0
Aloizio Castro

Aloizio Castro

29/05/2012

Já fiz isso, e não funciona!
GOSTEI 0
Marco Salles

Marco Salles

29/05/2012

Mas não funciona como ??? Não funciona aonde ???

Detalhe ... quando se utiliza o Nil como Owner do clientdataset tem que utilizar o SetProvider e não simplesmente

cds.datasetprovider:=NomeDoProvider

o correto é

cds.setProvider(DataSetProvider)

se for este o motivo do Não Funciona ?????
GOSTEI 0
Aloizio Castro

Aloizio Castro

29/05/2012

Compila, mas ao tentar utilizar, ao criar um dataset ele não traz as propriedades para mim, veja:

http://img9.imageshack.us/img9/807/datanoproperty.png
GOSTEI 0
Marco Salles

Marco Salles

29/05/2012

Mas vc pode ter acesso as propriedades em rumtime

Para ter acesso a essas propriedades em DesignedTime não é so especificar o Proprietário

Depende de outros fatores como Editores de componente , Editores de Propriedades

Neste caso sugiro a leitura de artigos que exeplicam detalhadamente como fazer

http://www.comofazertudo.com.br/computadores-e-internet/escrever-componente-parte-2


http://www.comofazertudo.com.br/computadores-e-internet/programa%C3%A7%C3%A3o/delphi/componente-escrita-parte-3

Apenas um entre muitos

ps) Não estou aqui somente para lhe sugerir , apenas na minha opinição que esta situação reportada por voce é
correta . E para mudar este quadro tem que alterar o modo como vc esta criando este componente . Este processo
não é tão trivial , por isto a indicação do Artigo .. Ok ??
GOSTEI 0
Aloizio Castro

Aloizio Castro

29/05/2012

Vou ler estes artigos que me recomendou, mas hoje cedo, eu já havia mudado de idéia e comecei a reconstruir o componente, até postei um tópico, https://www.devmedia.com.br/forum/componente-com-lista-de-subcomponentes/417685, mas realmente o negócio não é simples (pelo menos para mim)..

Obrigado pela atenção que tem me dado.
GOSTEI 0
POSTAR