Пример массива констант (Array of Const)
"Array of const" это массив переменных, декларированных как константы. Непосредственно они представлены структурой TVarRec. Скобки просто ограничивают массив. Массив констант дает вам возможность передавать процедуре переменное количество параметров type-safe (безопасным) способом. Вот пример:
type
TVarRec =
record
Data:
record case Integer
of
0: (L: LongInt);
1: (B: Boolean);
2: (C: Char);
3: (E: ^Extended);
4: (S: ^
string);
5: (P: Pointer);
6: (X: PChar);
7: (O: TObject);
end;
Tag: Byte;
Stuff:
array[0..2]
of Byte;
end;
function PtrToStr(P: Pointer):
string;
const
HexChar:
array[0..15]
of Char = '0123456789ABCDEF';
function HexByte(B: Byte):
string;
begin
Result := HexChar[B
shr 4] + HexChar[B
and 15];
end;
function HexWord(W: Word):
string;
begin
Result := HexByte(Hi(W)) + HexByte(Lo(W));
end;
begin
Result := HexWord(HiWord(LongInt(P))) + ':' + HexWord(LoWord(LongInt(P)));
end;
procedure Display(X:
array of const);
var
I: Integer;
begin
for I := 0
to High(X)
do
with TVarRec(X[I]), Data
do
begin
case Tag
of
0: ShowMessage('Integer: ' + IntToStr(L));
1:
if B
then
ShowMessage('Boolean: True')
else
ShowMessage('Boolean: False');
2: ShowMessage('Char: ' + C);
3: ShowMessage('Float: ' + FloatToStr(E^));
4: ShowMessage('String: ' + S^);
5: ShowMessage('Pointer: ' + PtrToStr(P));
6: ShowMessage('PChar: ' + StrPas(X));
7: ShowMessage('Object: ' + O.ClassName);
end;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
P:
array[0..5]
of Char;
begin
P := 'Привет'#0;
Display([-12345678, True, 'A', 1.2345, 'ABC', Ptr($1234, $5678), P,
Form1]);
end;
Взято с
Массив констант (array of const) фактически является открытым массивом TVarRec (описание предекларированных типов Delphi вы можете найти в электронной справке). Приведенный ниже "псевдокод" на языке Object Pascal может послужить скелетом для дальнейшего развития:
procedure AddStuff(
const A:
array of const);
var i: Integer;
begin
for i := Low(A)
to High(A)
do
with A[i]
do
case VType
of
vtExtended:
begin
{ добавляем натуральное число, все real-форматы
автоматически приводятся к extended }
end;
vtInteger:
begin
{ добавляем целое число, все integer-форматы
автоматически приводятся к LongInt }
end;
vtObject:
begin
if VObject
is DArray
then
with DArray(VObject)
do
begin
{ добавляем массив double-типа }
end
else if VObject
is IArray
then
with IArray(VObject)
do
begin
{ добавляем массив integer-типа }
end;
end;
end; { Case }
end; { AddStuff }
Для получения дополнительной информации загляните в главу "open arrays" электронной справки.
Взято из
Советов по Delphi от