Skip to content

Como utilizar una función como parámetro de otra función – Puntero de Métodos

Delphi, posee una característica especial, y es que podemos utilizar un procedimiento o función como parámetro de otro procedimiento o función.

Los tipos como los punteros de métodos, permiten tratar los procedimientos y funciones como valores que pueden asignarse a variables o pasarse como parámetro a otros procedimientos y funciones.

Ejemplo de como pasar una función o procedimiento como parámetro de otro procedimiento o función

En el siguiente ejemplo, mostramos como llamar a una función o procedimiento, enviando como parámetro otra función o procedimiento, algo que parece ilógico pero que con Delphi lo podemos realizar correctamente:

En primerl lugar y en la sección Type, declararemos el puntero de método:

type
  TParametroFuncion = reference to function(const value: integer): string;

Paso a seguir, es la definición de las funciones que pasaremos como parámetros, debe ser del mismo tipo (tanto parámetros como resultado) de la declarada anteriormente. En este caso definimos la función Mitad que retorna la mitad del valor y Duplo que retorna el doble del valor:

function Mitad(const vValor: integer): string;
begin
  result := IntToStr(Round(vValor/2));
end;

function Duplo(const vValor: integer): string;
begin
  result := IntToStr(2 * vValor);
end;

Ahora queda definir la función que que acepta otra función como su parámetro:

function FuncionDinamica(vValor: integer; f: TParametroFuncion): string;
begin
  result := f(vValor);
end;

En FuncionDinamica, enviamos como primer parámetro un valor, y como segundo parámetro la función a utilizar, y su forma de uso, por ejemplo desde el evento OnClick de un TButton es la siguiente:

procedure TForm1.btnCalcularClick(Sender: TObject);
var
  s : string;
begin
  s := FuncionDinamica(1000, Mitad) ;
  ShowMessage(s) ; // mostrará el valor 500

  s := FuncionDinamica(1000, Duplo) ;
  ShowMessage(s) ; // mostrará el valor 2000
end;

Código actualizado para Delphi 11.1

Video tutorial