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;
OK Aber dann muss man "überall" den Zugriff ändern.
Ich suche eher eine Lösung für den Umstiegt von Short auf Long und Array[L..H] nach Array of...
Beispiel:
Delphi-Quellcode:
type
TFooOld = Record
Bla : Integer;
Blub : Array[0..10] of Shortstring;
end;
TFooNeu = Record
Bla : Integer;
Blub : Array of String; // Oder auch TStringDynArray
end;
Der "Rest" der Software hat keine Ahnung von der Umstellung... Abgesehen von den entsprechenden SetLength.
So ALLE
Delphi-Quellcode:
var
A,B : TFooNeu;
begin
...
A := B;
end;
müssen sich genau verhalten wie vorher... Ohne
A := B.Clone
aufrufen zu müssen....
Mavarik