Guardando Métodos, Funcões e Procedimentos em Variáveis com Tipos Procedurais

Escrito em 28 de julho de 2007 em Linguagem Delphi por Leonel Togniolli

Tipos Procedurais é um recurso interessante da linguagem Delphi que permite armazenar métodos, funções e procedimentos em variáveis e manipulá-los normalmente, passando como parâmetros, e chamando a função quando for necessário.

A sintaxe é simples:

type
  TProcedimento = procedure;
  TFuncao = function:string;
  TFuncaoComParametro = function(Param: Integer):string;
  TMetodo = procedure of object;

As duas primeiras declarações definem um tipo que armazena um procedimento e uma função sem parâmetros, respectivamente. A terceira mostra como especificar parâmetros. A ultima declaração mostra como armazenar um método de uma classe, como TForm1.MeuMetodo, por exemplo. A partir daí, basta utilizar o método normalmente:

program Procedurais;

{$APPTYPE CONSOLE}

type
  TFuncao = function(Nome: string):string;

procedure ChamaProcedimento(Proc: TFuncao);
begin
  if Assigned(Proc) then
    WriteLn(Proc('teste'));
end;

function Duplica(Nome: string): string;
begin
  Result := Nome + Nome;
end;

function Triplica(Nome: string): string;
begin
  Result := Nome + Nome + Nome;
end;

begin
  ChamaProcedimento(Duplica);
  ChamaProcedimento(Triplica);
  ReadLn;
end.

Veja no exemplo que ChamaProcedimento chama a função que ele recebe por parâmetro e escreve no console o valor retornado. O programa principal chama esse procedimento passando as duas funções ali implementadas.

Vale lembrar que esses tipos são type-safe, ou seja, o compilador verifica se o procedimento que você está passando corresponde exatamente ao esperado, ou seja, possui os mesmos parâmetros, o mesmo tipo de retorno, a mesma convenção de chamada, e assim por diante.

Se isso faz lembrar os eventos de componentes da VCL, é porque é exatamente este o mecanismo usado.


2 comentários em 'Guardando Métodos, Funcões e Procedimentos em Variáveis com Tipos Procedurais' »

Assine os comentários usando RSS ou faça um TrackBack para 'Guardando Métodos, Funcões e Procedimentos em Variáveis com Tipos Procedurais'.

[-]
[+]
bruno disse,

Em 06 de janeiro de 2008 às 03:42

a função Assigned apenas verifica se a variável tipo procedural está apontando pra algum endereço.
Dá uma olhada no help do delphi sobre Assigned funcition e Procedural types.
Bom exemplo, está mais claro do que no help.

 

Em 28 de agosto de 2008 às 16:20

[...] anonymous methods. É também chamado de “referências a métodos”, pois a declaração de um tipo procedural é feita com a sintaxe “reference to [...]