Selbstdefinierte Variant-Typen kopieren und löschen

Aus Appmethod Topics
Wechseln zu: Navigation, Suche

Nach oben zu Benutzerdefinierte Varianten definieren - Index


Zusätzlich zur Typumwandlung und der Implementierung von Operatoren müssen Sie festlegen, wie Variants Ihres selbstdefinierten Typs kopiert und gelöscht werden können.

Durch Überschreiben der Methode System.Variants.TCustomVariantType.Copy legen Sie fest, wie der Variant-Wert kopiert wird. Dies ist in der Regel einfach, wobei allerdings zu beachten ist, dass für alle Klassen oder Strukturen, die zur Speicherung des Variant-Werts benutzt werden, Speicher reserviert werden muss.

Object Pascal:

 procedure TComplexVariantType.Copy(var Dest: TVarData; const Source: TVarData; const Indirect: Boolean);
 begin
   if Indirect and VarDataIsByRef(Source) then
     VarDataCopyNoInd(Dest, Source)
   else
     with TComplexVarData(Dest) do
     begin
       VType := VarType;
       VComplex := TComplexData.Create(TComplexVarData(Source).VComplex);
     end;
 end;

Hinweis: Der Parameter Indirect der Methode Copy lässt die Kopie den Fall berücksichtigen, dass der Variant nur eine indirekte Referenz auf seine Daten enthält.

Tipp: Sofern Ihr selbstdefinierter Variant-Typ keinen Speicher für seine Daten reserviert, weil die Daten in den TVarData-Record passen, kann Ihre Implementierung der Copy-Methode einfach die Methode SimplisticCopy aufrufen.

Durch Überschreiben der Methode Clear legen Sie fest, wie der Variant-Wert gelöscht wird. Dabei ist darauf zu achten, dass alle zur Speicherung des Variant-Werts reservierten Ressourcen wieder freigegeben werden:

Object Pascal:

 procedure TComplexVariantType.Clear(var V: TVarData);
 begin
   V.VType := varEmpty;
   FreeAndNil(TComplexVarData(V).VComplex);
 end;

Object Pascal: Sie müssen zusätzlich die Methode IsClear implementieren. Auf diese Weise finden Sie alle ungültigen Werte oder Werte für "leere" Daten:

 function TComplexVariantType.IsClear(const V: TVarData): Boolean;
 begin
   Result := (TComplexVarData(V).VComplex = nil) or
   TComplexVarData(V).VComplex.IsZero;
 end;

Siehe auch