Como executar um método (procedure/function) pelo nome

Aqui está uma dica simples de como executar um método de um objeto Delphi pelo nome:


type
   TForm1 = class(TForm)
     Button1: TButton;
     procedure Button1Click(Sender: TObject);
     procedure CallMeByName(Sender: TObject);
   private
     procedure ExecMethod(OnObject: TObject; MethodName: string);
   end;
 
var
   Form1: TForm1;
 
type
   TExec = procedure of object;
 
procedure TForm1.ExecMethod(OnObject: TObject; MethodName: string);
var
  Routine: TMethod;
  Exec: TExec;
begin
  Routine.Data := Pointer(OnObject);
  Routine.Code := OnObject.MethodAddress(MethodName);
  if NOT Assigned(Routine.Code) then 
    Exit;
  Exec := TExec(Routine);
  Exec;
end;
 
procedure TForm1.CallMeByName(Sender: TObject) ;
begin
   ShowMessage('Hello Delphi!');
end;
 
procedure TForm1.Button1Click(Sender: TObject) ;
begin
   ExecMethod(Form1, 'CallMeByName');
end;