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:

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.

Ebook exclusivo
Dê um upgrade no início da sua jornada. Crie sua conta grátis e baixe o e-book

Artigos relacionados