Советы по Delphi

       

Пример массива констант (Array of Const) I


"Array of const" это массив переменных, декларированных как константы. Непосредственно они представлены структурой TVarRec. Скобки просто ограничивают массив. Массив констант дает вам возможность передавать процедуре переменное количество параметров type-safe (безопасным) способом. Вот пример:

typeTVarRec = recordData: record case Integer of0: (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;constHexChar: array[0..15] of Char = '0123456789ABCDEF';
function HexByte(B: Byte): String;beginResult := HexChar[B shr 4] + HexChar[B and 15];end;
function HexWord(W: Word): String;beginResult := HexByte(Hi(W)) + HexByte(Lo(W));end;
beginResult := HexWord(HiWord(LongInt(P))) + ':' + HexWord(LoWord(LongInt(P)));end;
procedure Display(X: array of const);varI: Integer;beginfor I := 0 to High(X) do with TVarRec(X[I]), Data dobegincase Tag of0: 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);varP: array[0..5] of Char;
beginP := 'Привет'#0;Display([-12345678, True, 'A', 1.2345, 'ABC', Ptr($1234, $5678), P,Form1]);end;

-Steve [000544]


Как использовать "array of const"?

Массив констант (array of const) фактически является открытым массивом TVarRec (описание предекларированных типов Delphi вы можете найти в электронной справке). Приведенный ниже "псевдокод" на языке Object Pascal может послужить скелетом для дальнейшего развития:

procedure AddStuff( Const A: Array of Const );Var i: Integer;BeginFor i:= Low(A) to High(A) DoWith A[i] DoCase VType ofvtExtended: Begin{ добавляем натуральное число, все real-форматыавтоматически приводятся к extended }End;vtInteger: Begin
{ добавляем целое число, все integer-форматыавтоматически приводятся к LongInt }End;vtObject: BeginIf VObject Is DArray ThenWith DArray( VObject ) Do Begin{ добавляем массив double-типа }EndElse If VObject Is IArray ThenWith IArray( VObject ) Do Begin{ добавляем массив integer-типа }End;End;End; { Case }End; { AddStuff }

Для получения дополнительной информации загляните в главу "open arrays" электронной справки.

[000937]



Содержание раздела