Макро-процедуры
  
Автор: Peter Below
 
Каким образом мне можно использовать переменную типа String в качестве имени процедуры?
 
Если все процедуры, которые вы собираетесь вызывать имеют список с одними и теми же параметрами, (или все без параметров), то это не трудно. Для этого необходимо:
 
процедурный тип, соответствующий вашей процедуре, например:
 
 
Type
  TMacroProc = Procedure( param: Integer );
 
 |  
  
массив, "подключающий" имена процедур к их адресам во время выполнения приложения:
 
 
Type
  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
    If CompareText( name, Macros[i].name ) = 0 Then
    Begin
      Macros[i].proc( param );
      Break;
    End;
End;
 |  
  
Макро-процедуры необходимо объявить в секции Interface модуля или с ключевым 
словом Far, например: 
 
Procedure Proc1( n: Integer ); far;
Begin
  ....
End;
Procedure Proc2( n: Integer ); far;
Begin
  ....
End;
 
 |  
  
           |