Type
{ объявляем тип для динамического массива
array of TVarRecs }
TVarArray = Array [0..High(Word)
div Sizeof(TVarRec)-1] of TVarRec;
PVarArray = ^TVarArray;
{ Объявляем alias-тип для функции Format.
Передаваемые параметры будут иметь в стеке тот же самый порядок вызова, что и
при нормальном вызове Format }
FormatProxy = Function( Const aFormatStr:
String; Var aVarRec: TVarRec; highIndex: Integer ):
String;
{ AddVarRecs копирует параметры, передаваемые
в массиве A в pRecs^, начиная с pRecs^[atIndex]. highIndex - самый большой
доступный индекс pRecs, число распределенных элементов - 1. }
Procedure AddVarRecs( pRecs: PVarArray; atIndex, highIndex:
Integer; Const A: Array of Const );
Var
i: Integer;
Begin
If pRecs <> Nil Then
For i := 0 To High(A) Do
Begin
If atIndex <= highIndex Then Begin
pRecs^[atIndex] := A[i];
Inc(atIndex);
End { If }
Else
Break;
End; { For }
End; { AddVarRecs }
procedure TScratchMain.SpeedButton2Click(Sender:
TObject);
Var
p: PVarArray;
S: String;
Proxy: FormatProxy;
begin
{ распределяем массив для четырех параметров,
индексы - 0..3 }
GetMem(p, 4*Sizeof(TVarRec));
try
{ добавляем параметры последующими вызовами
AddVarRecs }
AddVarRecs( p, 0, 3, [12, 0.5,
'Шаблон']);
AddVarRecs( p, 3, 3, ['Тест'] );
{ получаем полномочия Format }
@Proxy := @SysUtils.Format;
{ Вызов с динамически сгенерированным массивом
параметров. Естественно, строка формата может также быть сформирована и во время
выполнения программы. }
S := Proxy('Целое: %d, Реальное: %4.2f, Строки:
%s, %s', p^[0], 3
);
{ выводим результат }
ShowMessage(S);
finally
FreeMem( p,4*Sizeof(TVarRec));
end;
end;