Sources
Delphi Russian Knowledge Base
DRKB - это самая большая и удобная в использовании база знаний по Дельфи в рунете, составленная Виталием Невзоровым

Вызов процедуры, имя которой содержится в переменной

01.01.2007

Как я могу вызвать процедуру, чье имя хранится в таблице, списке, и т.п.? Другими словами, я хочу сохранить имя процедуры в переменной и для ее вызова обращаться к значению этой переменной. Какие предложения?

unit ProcDict;
 
interface
 
type MyProc = procedure(s: string);
 
procedure RegisterProc(procName: string; proc: MyProc);
procedure ExecuteProc(procName: string; arg: string);
 
implementation
 
uses Classes;
var ProcDict: TStringList;
 
procedure RegisterProc(procName: string; proc: MyProc);
begin
  ProcDict.AddObject(procName, TObject(@proc));
end;
 
procedure ExecuteProc(procName: string; arg: string);
var
  index: Integer;
begin
  index := ProcDict.IndexOf(ProcName);
  if index >= 0 then
    MyProc(ProcDict.objects[index])(arg);
// Можно вставить обработку исключительной ситуации - сообщение об ошибке
end;
 
initialization
  ProcDict := TStringList.Create;
  ProcDict.Sorted := true;
finalization
  ProcDict.Free;
end.

вы могли бы создать StringList как показано ниже:

StringList.Create; StringList.AddObject('Proc1',@Proc1);
StringList.AddObject('Proc2',@Proc2); 

и затем реализовать это в вашей программе:

var
  myFunc: procedure;
begin
  if Stringlist.indexof(S) = -1 then
    MessageDlg('Не понял процедуру ' + S, mtError, [mbOk], 0)
  else
    begin
      @myFunc := Stringlist.Objects[Stringlist.indexof(S)];
      myFunc;
    end;

RAM

Взято из Советов по Delphi от Валентина Озерова

Сборник Kuliba