Extendendo TDataset para usar for in
Veja neste artigo dicas de como aproveitar os recursos do Delphi com muita criatividade.
A Embarcadero nos últimos lançamentos do Delphi vem acrescentando em cada versão recursos que a borland/codegear deixaram a muito a desejar, destes recursos o que mais me chamou a atenção foi a implementação do "for in" que deixa o nosso código mais elegantes.
Alem disso agora nos permite "extender" uma class sem a necessidade de fazer herança, como se fosse um "puxadinho",neste artigo vou demonstrar que com um pouco de criatividade podemos ter uma nova visão de trabalhar com o nosso TDataset.
Em nosso dia a dia costumamos fazer muitas interação em nossos TDataset:
E Que tal usamos assim:
Assim conseguimos eliminar pelo menos 2 linhas de código,mais para conseguimos usar o for in necessitaríamos de um enumerador que infelizmente o TDataset não tem, então vamos implementar o nosso.
Porem ainda temos um problema de como acessar o nosso enumerador em nosso TDataset, e além disso temos que acessar o enumerador nas class filhas de TDataset como por ex TQuery , TClientDataset, TZTable e a nossa lista e imensa, porem com o Delphi 2010 venho o recurso da class helper for que permite extender nossa class.
Agora podemos fazer um interação usando for in.
Mais ainda não tivemos muitas vantagens além de diminuir duas linha de nosso código inicial, porem o acesso aos nossos fields continua da maneira de sempre.
Bem agora deixo para segunda parte para que possamos melhorar o visual do nosso código eliminando os acesso as fields.
Alem disso agora nos permite "extender" uma class sem a necessidade de fazer herança, como se fosse um "puxadinho",neste artigo vou demonstrar que com um pouco de criatividade podemos ter uma nova visão de trabalhar com o nosso TDataset.
Em nosso dia a dia costumamos fazer muitas interação em nossos TDataset:
dataset.First; while not dataset.EOF do begin //Acesso aos Fields dataset.Next; end;
E Que tal usamos assim:
for data in dataset do begin //Acesso aos Fields end
Assim conseguimos eliminar pelo menos 2 linhas de código,mais para conseguimos usar o for in necessitaríamos de um enumerador que infelizmente o TDataset não tem, então vamos implementar o nosso.
type TDataSetEnumerator = class private FDataSet: TDataSet; FCounter: Integer; function GetCurrent: Integer; public constructor Create(ADataSet: TDataSet); destructor Destroy; override; function MoveNext: Boolean; property Current: Integer read GetCurrent; end; constructor TDataSetEnumerator.Create(ADataSet: TDataSet); begin inherited Create; FDataSet := ADataSet; FDataSet.Open; FCounter := -1; end; destructor TDataSetEnumerator.Destroy; begin FDataSet.Close; end; function TDataSetEnumerator.GetCurrent: Integer; begin Result := FCounter; end; function TDataSetEnumerator.MoveNext: Boolean; begin if FCounter < 0 then begin FDataSet.First; FCounter := 0; end else begin FDataSet.Next; Inc(FCounter); end; Result := not FDataSet.EoF; end;
Porem ainda temos um problema de como acessar o nosso enumerador em nosso TDataset, e além disso temos que acessar o enumerador nas class filhas de TDataset como por ex TQuery , TClientDataset, TZTable e a nossa lista e imensa, porem com o Delphi 2010 venho o recurso da class helper for que permite extender nossa class.
type TDataSetHelper = class helper for TDataSet public function GetEnumerator: TDataSetEnumerator; end; function TDataSetHelper.GetEnumerator: TDataSetEnumerator; begin Result := TDataSetEnumerator.Create(Self); end;
Agora podemos fazer um interação usando for in.
var recIndex: Integer; for recIndex in dataset do begin // AGora podemos acessar nossos registros
Mais ainda não tivemos muitas vantagens além de diminuir duas linha de nosso código inicial, porem o acesso aos nossos fields continua da maneira de sempre.
DataSet.FieldValues['Nome']
// Ou se preferir
DataSet.FieldByName('Nome').Value
Bem agora deixo para segunda parte para que possamos melhorar o visual do nosso código eliminando os acesso as fields.
Marcelo Fernandes
Sou analista,programador e arquiteto na Questor Sistema. Trabalha com Delphi, desde da versao 5, e Firebird,Mysql desenvolvendo aplicações cliente-servidor. Formado em Tecnologia de Processamento de dados pela Cesumar, na cidade de Maringá-Pr.
O que você achou deste post?
Cursos relacionados
Publicidade



