ObjectPascal
Variant
Type
A variable type that can hold changing data types System unit
  type Variant;
Description
The Variant data type provides a flexible general purpose data type.
 
It can hold anything but structured data and pointers.
 
But use with care - there are penalties in performance, potentials for run time errors and poor code clarity when using Variants.
 
Use VarType in conjunction with VarTypeMask to determine the curent data types a Variant is set to.
 
Variants are useful in very specific circumstances, where data types and their content are determined at run time rather than at compile time.
Notes
Variant strings cannot be indexed.
Related commands
Null A variable that has no value
PVariant Pointer to a Variant value
 
Example code : Illustrating a few Variant assignments and the resulting data types
var
  myVar : Variant;

begin
  // Assign various values to a Variant
  // and then show the resulting Variant type
  WriteLn('Variant value = not yet set');
  ShowBasicVariantType(myVar);

  // Simple value
  myVar := 123;
  WriteLn('Variant value = 123');
  ShowBasicVariantType(myVar);

  // Calculated value using a Variant and a constant
  myVar := myVar + 456;
  WriteLn('Variant value = 123 + 456');
  ShowBasicVariantType(myVar);

  myVar := 'String '+IntToStr(myVar);
  WriteLn('Variant value = String 579');
  ShowBasicVariantType(myVar);
end;

// Show the type of a variant
procedure TForm1.ShowBasicVariantType(varVar: Variant);
var
  typeString : string;
  basicType  : Integer;

begin
  // Get the Variant basic type :
  // this means excluding array or indirection modifiers
  basicType := VarType(varVar) and VarTypeMask;

  // Set a string to match the type
  case basicType of
    varEmpty     : typeString := 'varEmpty';
    varNull      : typeString := 'varNull';
    varSmallInt  : typeString := 'varSmallInt';
    varInteger   : typeString := 'varInteger';
    varSingle    : typeString := 'varSingle';
    varDouble    : typeString := 'varDouble';
    varCurrency  : typeString := 'varCurrency';
    varDate      : typeString := 'varDate';
    varOleStr    : typeString := 'varOleStr';
    varDispatch  : typeString := 'varDispatch';
    varError     : typeString := 'varError';
    varBoolean   : typeString := 'varBoolean';
    varVariant   : typeString := 'varVariant';
    varUnknown   : typeString := 'varUnknown';
    varByte      : typeString := 'varByte';
    varWord      : typeString := 'varWord';
    varLongWord  : typeString := 'varLongWord';
    varInt64     : typeString := 'varInt64';
    varStrArg    : typeString := 'varStrArg';
    varString    : typeString := 'varString';
    varAny       : typeString := 'varAny';
    varTypeMask  : typeString := 'varTypeMask';
  end;

  // Show the Variant type
  WriteLn('Variant type  = '+typeString);
end;
Show full unit code
   Variant value = not yet set
   Variant type  = varEmpty
   Variant value = 123
   Variant type  = varByte
   Variant value = 123 + 456
   Variant type  = varInt64
   Variant value = String 579
   Variant type  = varString