Fórum Subcomponente em um CollectionItem #417611

29/05/2012

0

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

Responder

Posts

29/05/2012

Marco Salles

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;
Responder

Gostei + 0

30/05/2012

Aloizio Castro

Já fiz isso, e não funciona!
Responder

Gostei + 0

30/05/2012

Marco Salles

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 ?????
Responder

Gostei + 0

30/05/2012

Aloizio Castro

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
Responder

Gostei + 0

30/05/2012

Marco Salles

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 ??
Responder

Gostei + 0

30/05/2012

Aloizio Castro

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.
Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar