Subcomponente em um CollectionItem
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
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?
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
Curtidas 0
Respostas
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
29/05/2012
Já fiz isso, e não funciona!
GOSTEI 0
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 ?????
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
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
http://img9.imageshack.us/img9/807/datanoproperty.png
GOSTEI 0
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 ??
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
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.
Obrigado pela atenção que tem me dado.
GOSTEI 0