Пример массива констант (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 } |