A mi no me parece mal lo que estas haciendo, pero si buscas formas "originales" de hacerlo:
Código Delphi
[-]
program Project1;
{$APPTYPE CONSOLE}
uses SysUtils, Classes;
type
THandler = procedure(Cmd: String);
procedure Ping(Cmd: String);
begin
Writeln('Pong');
end;
procedure Salir(Cmd: String);
begin
Halt;
end;
var
i: Integer;
Commands: TStringList;
Str: String;
begin
Commands:= TStringList.Create;
try
Commands.AddObject('PING',TObject(@Ping));
Commands.AddObject('SALIR',TObject(@Salir));
while TRUE do
begin
Readln(Str);
i:= Commands.IndexOf(Uppercase(Str));
if i <> -1 then
THandler(Commands.Objects[i])(Str);
end;
finally
Commands.Free;
end;
end.