Universal (dynamic) types

uses System.SysUtils, System.Variants;

var
  D: Variant;
begin
  //Variant is initialized by any type
  D := 'some string';
  WriteLn(VarToStr(D), ', type is ',
    VarTypeAsText(VarType(D)));
  //some string, type is UnicodeString

  D := 3.14;
  WriteLn(VarToStr(D), ', type is ',
    VarTypeAsText(VarType(D)));
  //3.14, type is Double

  D := True;
  WriteLn(VarToStr(D), ', type is ',
    VarTypeAsText(VarType(D)));
  //True, type is Boolean

  //an array of Variant values
  D := VarArrayOf([235]);
  WriteLn('items: ',
    VarArrayHighBound(D, 1) + 1,
    ', first is 'VarToStr(D[0]));
  //items: 3, first is 2
end.