sexta-feira, 14 de setembro de 2007

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


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.

ORIGEM:
http://www.techtips.com.br/programacao/delphi/linguagem-delphi/guardando-mtodos-funces-e-procedimentos-em-variveis-com-tipos-procedurais/

  © Blogger template 'Perfection' by Ourblogtemplates.com 2008

Back to TOP