When you are creating components at run time, and want to assign a procedure to an event handler of a component, like in the following code:

procedure ButtonClick(Sender:TObject) ;
begin
//whatever
end;
 
procedure SomeProcedure...
var aButton:TButton;
begin
   aButton := TButton.Create(nil) ;
   aButton.OnClick = ButtonClick
...
end;

You will get the next error: Incompatible type: 'method pointer and regular procedure'.

The problem is that a method pointer (OnClick) needs to be a procedure of an object (like TForm), not a regular procedure. One way around is to create an object to define the procedure. You can start by creating a dummy class...

interface
type
   TEventHandlers = class // create a dummy class
       procedure ButtonClick(Sender: TObject) ;
   end;
 
...
 
var EvHandler:TEventHandlers;
 
implementation
 
procedure TEventHandlers.ButtonClick(Sender: TObject) ;
begin
   // your code here
end;
 
...
procedure SomeProcedure...
var aButton:TButton;
begin
   aButton := TButton.Create(nil) ;
   aButton.OnClick = ButtonClick;
...
end;