DevMedia - asp.net, Java, Delphi, SQL e web Design, tudo em um só lugar!
Bem vindo a DevMedia!
LOGIN:     SENHA:
 
 

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.


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?

    0 COMENTÁRIO

[Fechar]

Este post é fechado - você precisa ter acesso ao post para incluir um comentário.


Nenhum comentário foi postado - seja o primeiro a comentar!
Cursos relacionados
Publicidade
[Fechar]

Você precisa estar logado para dar um feedback.

Clique aqui para efetuar o login
[Fechar]


Este post está fechado. Saiba mais sobre a assinatura MVP!
web-03
DevMedia  |  Anuncie  |  Fale conosco
Hospedagem web por Porta 80 Web Hosting
2013 - Todos os Direitos Reservados a web-03