program Meu_Segundo_Tipo_Procedural;
      { Turbo Pascal 7 source        }
      { Delphi Source                }
      { Joao Paulo Schwarz Schuler   }
      { http://www.schulers.com/jpss }
      
      type TCalc = function(X,Y:extended):extended;
      { Uma variavel do tipo TCalc armazenara pontos
      de entrada (entry points) de funcoes do tipo:
         function(X,Y:extended):extended; }
      
      function Soma(X,Y:extended):extended;
      begin
      Soma:=X+Y;
      end;
      
      function Multiplica(X,Y:extended):extended;
      begin
      Multiplica:=X*Y;
      end;
      
      function Opera(Operacao:TCalc;X,Y:extended):extended;
      { devolve o resultado da Operacao sobre X,Y }
      begin
      Opera:=Operacao(X,Y);
      end;
      
      
      begin { of program }
      WriteLn(Opera(Soma,10,20));           { imprime 30  em potencia de 10 }
      WriteLn(Opera(Multiplica,10,20));     { imprime 200 em potencia de 10 }
      end. { of program }
      
      {   Vale observar que os Eventos do Delphi sao implementados
        por meio de tipos procedurais.
      
        Ex.:
      
        type TNotifyEvent = procedure (Sender:TObject) of object; }