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.