Как использовать переменную для имени процедуры?

Материал из DRKB

Как использовать переменную для имени процедуры?[править | править код]

Каким образом можно использовать переменную типа String в качестве имени процедуры?

Если все процедуры, которые вы собираетесь вызывать, имеют список с одними и теми же параметрами (или все без параметров), то это не трудно. Для этого необходимы: процедурный тип, соответствующий вашей процедуре, например:

type
  TMacroProc = procedure(param: Integer); 
  // массив, сопоставляющий имена процедур их адресам во время выполнения приложения: 
  TMacroName = string[32];
  TMacroLink = record
    name: TMacroName;
    proc: TMacroProc;
  end;
  TMacroList = array [1..MaxMacroIndex] of TMacroLink; 

const
  Macros: TMacroList = (
    (name: 'Proc1'; proc: Proc1),
    (name: 'Proc2'; proc: Proc2),
    //...
  ); //интерпретатор функций, типа: 

procedure CallMacro(name: String; param: Integer);
var
  i: Integer;
begin
  for i := 1 to MaxMacroIndex do
  begin
    if CompareText(name, Macros[i].name) = 0 then 
    begin
      Macros[i].proc(param);
      break;
    end;
  end;
end; 

{ Макропроцедуры необходимо объявить в секции Interface модуля или с ключевым словом Far, например: }
procedure Proc1(n: Integer); far;
begin
  //...
end; 

procedure Proc2(n: Integer); far;
begin
  //...
end;


Source: http://forum.vingrad.ru
ID: 00071