Pascal - Variantes

Pascal admite un tipo único de almacenamiento denominado variantes. Puede asignar cualquier tipo de valor simple en una variable variante. El tipo de valor almacenado en una variante solo se determina en tiempo de ejecución. Casi cualquier tipo simple puede asignarse a variantes: tipos ordinales, tipos de cadenas, tipos int64.

Los tipos estructurados como conjuntos, registros, matrices, archivos, objetos y clases no son compatibles con la asignación de una variante. También puede asignar un puntero a una variante.

Free Pascal admite variantes.

Declarar una variante

Puede declarar el tipo de variante como cualquier otro tipo utilizando el varpalabra clave. La sintaxis para declarar un tipo de variante es:

var
   v: variant;

Ahora, esta variable variante v se puede asignar a casi todos los tipos simples, incluidos los tipos enumerados y viceversa.

type  
   color = (red, black, white);  
var  
   v : variant;  
   i : integer;  
   b : byte;  
   w : word;  
   q : int64;  
   e : extended;  
   d : double;  
   en : color;  
   as : ansistring;  
   ws : widestring;  

begin  
   v := i;  
   v := b;  
   v := w;  
   v := q;  
   v := e;  
   v := en;  
   v := d:  
   v := as;  
   v := ws;  
end;

Ejemplo

El siguiente ejemplo ilustraría el concepto:

Program exVariant;

uses variants;
type
   color = (red, black, white);

var
   v : variant;
   i : integer;
   r: real;
   c : color;
   as : ansistring;


begin
   i := 100;
   v:= i;
   writeln('Variant as Integer: ', v);

   r:= 234.345;
   v:= r;
   writeln('Variant as real: ', v);

   c := red;
   v := c;
   writeln('Variant as Enumerated data: ', v);

   as:= ' I am an AnsiString';
   v:= as;
   writeln('Variant as AnsiString: ', v);
end.

Cuando se compila y ejecuta el código anterior, produce el siguiente resultado:

Variant as Integer: 100
Variant as real: 234.345
Variant as Enumerated data: 0
Variant as AnsiString: I am an AnsiString