Fórum Subcomponente em um CollectionItem #417611
29/05/2012
0
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
Curtir tópico
+ 0Posts
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;
Gostei + 0
30/05/2012
Aloizio Castro
Gostei + 0
30/05/2012
Marco Salles
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
30/05/2012
Aloizio Castro
http://img9.imageshack.us/img9/807/datanoproperty.png
Gostei + 0
30/05/2012
Marco Salles
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
30/05/2012
Aloizio Castro
Obrigado pela atenção que tem me dado.
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)