Selbstdefinierte Variant-Typen kopieren und löschen
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.
Delphi:
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 MethodeCopy
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:
Delphi:
procedure TComplexVariantType.Clear(var V: TVarData);
begin
V.VType := varEmpty;
FreeAndNil(TComplexVarData(V).VComplex);
end;
Delphi: 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;