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