Hallo,
bei der Verwendung von
Move ist eine Warnung angebracht. Falls das Array dynamische Daten (Objektreferenzen, Interfaces,
Ansi-/WideStrings) enthält, sind zusätzliche Schritte notwendig, um den Delphi-MemoryManager nicht zu verwirren. Die zu überschreibenden Elemente müssen vor dem Verschieben durch einen Aufruf von
Finalize finalisiert werden, Objekte sind freizugeben. Die freiwerdenden Elemente müssen mit
NIL überschrieben werden, da sonst im Array
mehrere Verweise auf
einen Speicherbereich existieren.
Ein kleines Beispiel mit AnsiStrings:
Delphi-Quellcode:
var
i : Integer;
Texte : array of string;
begin
// Array initialisieren
SetLength (Texte, 10);
for i := 0 to High(Texte) do
Texte[i] := Format('Element #%d', [i]);
// die zu überschreibenden Elemente finalisieren
Finalize (Texte[0]); // alternativ: Zuweisung eines Leerstrings
Finalize (Texte[1]);
// Verschiebung durchführen
Move (Texte[2], Texte[0], (Length(Texte) - 2) * SizeOf(Texte[0]));
// freiwerdende Elemente mit NIL überschreiben
Pointer(Texte[Length(Texte) - 2]) := nil;
Pointer(Texte[Length(Texte) - 1]) := nil;
// Array verkürzen
SetLength (Texte, Length(Texte) - 2);
end;
Enthält das Array keine dynamischen Daten, ist der ganze Aufwand natürlich nicht notwendig.
Gruß Hawkeye