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.