Delphi – Vamos varrer os componentes do formulário !! que tal usar Anonimous ?

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 TComponent

    public
    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

 

 

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *