Зачем нужны указатели на функции и процедуры?
Ну для очень разных вещей, от вызова функций из DLL, разработки общего интерфейса вызова функций скажем вами, а самих функций  другими, до банального применения в визуальных обьектах. Скажем вы когда переопределяете функцию Клик у кнопки, на самом деле вы создаете процедуру, адрес которой присваиваете указателю, который хранит ее и выполняет в нужный момент (когда система скажет Вау был клик на кнопке)  
 
 Как применять, ну вот я тут набросал пару примитивных примеров, вплоть до вызова в функции другой процедуры, которая передается через указатель.
- Код: Выделить всё
- unit Unit1; 
 
 {$mode objfpc}{$H+}
 
 interface
 
 uses
 Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls;
 
 type
 
 { TForm1 }
 
 TForm1 = class(TForm)
 Button1: TButton;
 ComboBox1: TComboBox;
 procedure Button1Click(Sender: TObject);
 
 private
 procedure NewClick(Sender: TObject);
 { private declarations }
 public
 
 { public declarations }
 end;
 
 TProc1 = procedure();
 TProc2 = procedure(a:Integer);
 TFunc3 = function():String;
 TFunc4 = function(a:word):String;
 TFunc5 = function(P:TProc2):String;
 
 
 var
 Form1: TForm1;
 
 implementation
 
 {$R *.lfm}
 
 { TForm1 }
 //procedure NewClick(Sender: TObject);
 //begin
 //    Form1.Caption:='NewClick';
 //end;
 
 procedure Proc1();
 begin
 Form1.Caption:='';
 end;
 
 procedure Proc2(a:Integer);
 begin
 Form1.Caption:=IntToStr(a);
 end;
 
 function Func3():String;
 begin
 Result:='Func3';
 Form1.Caption:='Func3';
 end;
 
 function Func4(a:word):String;
 begin
 Result:=IntToStr(a);
 Form1.Caption:=Result;
 end;
 
 
 function Func5(P:TProc2):String;
 begin
 Result:='';
 
 if P <> NIL then
 P(5);
 
 end;
 
 procedure TForm1.NewClick(Sender: TObject);
 begin
 Caption:='NewClick';
 end;
 
 procedure TForm1.Button1Click(Sender: TObject);
 var P1:TProc1;
 P2:TProc2;
 F3:TFunc3;
 F4:TFunc4;
 F5:TFunc5;
 begin
 P1:=@Proc1;
 P2:=@Proc2;
 F3:=@Func3;
 F4:=@Func4;
 F5:=@Func5;
 
 
 
 case  ComboBox1.ItemIndex of
 0:begin
 if P1<>Nil then
 P1;
 end;
 1:begin
 if P2<>Nil then
 P2(125);
 end;
 2:begin
 if F3<>Nil then
 F3;
 end;
 3:begin
 if F4<>Nil then
 F4(4);
 end;
 4:begin
 if F5<>Nil then
 F5(P2);
 end;
 5:begin
 Button1.OnClick:=@NewClick;
 Button1.Click;
 end;
 end;
 end;
 
 end.
 
Так же как вы заметили, я переопределил процедуру клик у кнопки...
Ну тут наверное самое сложное, это понять что указатель на процедуру\функцию и указатель на метод это разные вещи, в указателе на метод еще 
НЕ явно передается указатель на Self
Подробнее об этом можно прочитать скажем тут:
Обработчики событий в Delphi ну или в другом источнике.