Daten eines selbstdefinierten Variant-Typs speichern

Aus RAD Studio
Wechseln zu: Navigation, Suche

Nach oben zu Benutzerdefinierte Varianten definieren - Index


Variants speichern ihre Daten in einem Record vom Typ TVarData . Dabei handelt es sich um einen Record mit 16 Bytes. Das erste Wort bezeichnet den Variant-Typ, die restlichen 14 Bytes stehen zur Speicherung von Daten zur Verfügung. Ihr neuer Variant-Typ kann zwar direkt mit einem TVarData-Record arbeiten, jedoch ist es normalerweise einfacher, einen Record-Typ zu definieren, dessen Elemente aussagekräftige Namen bezüglich Ihres neuen Typs besitzen, und diesen neuen Typ dann in einen TVarData-Record umzuwandeln.

Die Unit VarConv definiert z.B. einen selbstdefinierten Variant-Typ, der einen Messwert darstellt. Die Daten für diesen Typ umfassen sowohl die Maßeinheit (TConvType) als auch den Wert (Typ Double). Die Unit VarConv definiert ihren eigenen Typ zur Darstellung eines solchen Werts:

Delphi:

 TConvertVarData = packed record
   VType: TVarType;
   VConvType: TConvType;
   Reserved1, Reserved2: Word;
   VValue: Double;
 end;

Dieser Typ hat genau die Größe des TVarData-Records. Bei der Arbeit mit einem selbstdefinierten Variant des neuen Typs kann dieser (oder sein TVarData-Record) in TConvertVarData umgewandelt werden, und der selbstdefinierte Variant-Typ arbeitet mit dem TVarData -Record, als wäre er ein TConvertVarData-Typ.

Hinweis: Ein Record, der dem TVarData-Record in der beschriebenen Weise zugeordnet wird, muss als "Packed Record" definiert werden.

Sollte Ihr neuer selbstdefinierter Variant-Typ mehr als 14 Byte zur Speicherung seiner Daten benötigen, müssen Sie einen neuen Record-Typ definieren, der einen Zeiger oder eine Objektinstanz enthält. Die Unit VarCmplx benutzt z.B. eine Instanz der Klasse TComplexData zur Darstellung der Daten in einem komplexwertigen Variant. Sie definiert deshalb einen Record-Typ mit der Größe von TVarData, der eine Referenz zu einem TComplexData -Objekt enthält:

Delphi:

 TComplexVarData = packed record
   VType: TVarType;
   Reserved1, Reserved2, Reserved3: Word;
   VComplex: TComplexData;
   Reserved4: LongInt;
 end;

Objektreferenzen sind Zeiger (zwei Worte), sodass dieser Typ von der Größe des TVarData-Records ist. Wie zuvor kann ein komplexer selbstdefinierter Variant-Typ (oder sein TVarData-Record) in TComplexVarData umgewandelt werden, und der selbstdefinierte Variant-Typ arbeitet mit dem TVarData-Record, als wäre er ein TComplexVarData-Typ.

Siehe auch