Bedeutet das ich kann doch den RecordCopy "überladen"?
Naja, als Überladen würd ich das nicht bezeichnen. Da werden System Funktionen gehooked.
D.h. bei allen vom Compiler generierten CopyRecord aufrufen in deiner gesamten Anwendung läuft der extra Dictionary Lookup.
Ich bin ja schon recht großzügig, Code nicht als Hack sondern als "geschickte Ausnutzung der Mechanik" zu bezeichnen, aber das ist definitiv ein Hack - und zwar ein gewaltiger - da muss man schon wissen, was man damit anstellt
Bietet "Deine" Routine da einen Lösung?
Vermutlich denkst du an sowas?
Delphi-Quellcode:
class procedure TFoo.Copy(var dest, source: TFoo);
begin
dest.a := System.Copy(source.a);
end;
Jo, müsste gehen.
Gibt allerdings noch eine andere Möglichkeit, die genauso funktioniert, wie bei Strings:
Delphi-Quellcode:
type
TFoo = record
private
a: array of string;
function GetItem(i: Integer): string; inline;
procedure SetItem(i: Integer; const Value: string); inline;
public
property Items[i: Integer]: string read GetItem write SetItem; default;
end;
function GetArrayRef(A: Pointer): Integer; inline;
type // geliehen aus der System.pas
PDynArrayRec = ^TDynArrayRec;
TDynArrayRec = packed record
{$IFDEF CPUX64}
_Padding: LongInt;
{$ENDIF}
RefCnt: LongInt;
Length: NativeInt;
end;
begin
Result := NativeInt(A);
if Result <> 0 then
Result := PDynArrayRec(PByte(A) - SizeOf(TDynArrayRec))^.RefCnt;
end;
function TFoo.GetItem(i: Integer): string;
begin
Result := a[i];
end;
procedure TFoo.SetItem(i: Integer; const Value: string);
begin
if GetArrayRef(a) > 1 then
a := System.Copy(a);
a[i] := Value;
end;