Para aqueles momentos que quero varrer todos os componetes que estão no FORM para pegar quem são e aplicar um operador AS que tal usar um metódo anônimo para isto….
Forma tradicional
A forma tradicional de se varrer todos os componentes que estão sobre responsabilidade do FORM é fazer um loop com FOR e avaliar um-a-um até encontrar o que se deseja.
[code lang=”pascal”]
var i:integer;
begin
for i := 0 to FormX.ComponentCount-1 do
begin
if FormX.Components[i] is TQuery then // quero pegar so as TQuery
with FormX.Components[i] as TQuery do
begin
close; // fechar a TQuery
end;
end;
end;
[/code]
Loop de Componentes com Anonimous Methods
Utilizando “Anonimous Methods” é um modelo não tradicional de olhar a mesma questão. Entender a estrutura de um “Anonimous Method” pode simplificar muitas operações de codifição do dia-a-dia e como exemplo de fundo vamos varrer os componentes dos formulários…
-
Criando um HELPER para separar a lógica (o LOOP)
[code lang=”pascal”]
type
TComponentHelper = class Helper for TComponentpublic
procedure ComponentsLoop(AProc: TProc<TComponent>; AChild: boolean = false);
end;procedure TComponentHelper.ComponentsLoop(AProc: TProc<TComponent>; AChild: boolean = false);
var
i: integer;
begin
if assigned(AProc) then
for i := 0 to ComponentCount – 1 do
begin
AProc(Components[i]);
if AChild and (Components[i].ComponentCount > 0) then
Components[i].ComponentsLoop(AProc, AChild);
end;
end;
[/code] -
Executando o LOOP utilizando o método anônimo do HELPER
[code lang=”pascal”]
procedure TForm39.Button1Click(Sender: TObject);
begin
Memo1.Lines.Clear;
ComponentsLoop(
Procedure(AComp: TComponent)
begin
// fecha todos os TDataset (TQuery)
if AComp is TDataset then
with AComp as TDataset do
close;end, false);
end;
[/code]
Usando Anonimous LOOP para um TList (genérico)
Quando vezes precisou fazer um loop em um TList….
-
Implementando um LOOP “anonimous” para o TList na classe HELPER
[code lang=”pascal”]
procedure TComponentHelper.ListLoop(AList: TList; AProc: TProc<TObject>);
var
i: integer;
begin
for i := 0 to AList.Count – 1 do
AProc(AList[i]);
end;[/code]
-
Aplicando o LOOP “anonimous” em um TList
[code lang=”pascal”]
procedure TForm39.Button3Click(Sender: TObject);
var
FList: TList;
begin
memo1.Lines.Clear;
FList := TList.create;
try
PopularALista(FList);// fazer um LOOP usando Anonimous
ListLoop(FList,
procedure(AObj: TObject)
begin
memo1.Lines.Add( AObj.ClassName );
end);finally
FList.Free;
end;
end;[/code]
Parece Simples !!! Quantas vezes precisou escrever um LOOP em um TDataset (aka TQuery, TClientDataset)???
Código Exemplo Helper para TDataset