Hallo alzaimar,
du bist zu schnell, ich war mit meinem Code doch noch gar nicht fertig
Drei Korrekturen:
- das Array sollte noch mit SetLength() verkürzt werden
- wg. SetLength muß
anArray als VAR-Parameter übergeben werden
- bei der Berechnung von
TotalBytesToMove muß die 1
subtrahiert werden
Hier mein Code (hoffentlich fehlerfrei):
Delphi-Quellcode:
type
TMyRec = record
x, y : Integer;
s : string;
end;
TDynMyRecArray = array of TMyRec;
// Entfernt aCount Elemente ab Index aStart aus dem dynamischen Feld aArray
procedure RemoveItem (var aArray: TDynMyRecArray; aStart: Integer; aCount: Integer = 1);
begin
// Startindex auf Gültigkeit prüfen
if (aStart >= 0) and (aStart <= High(aArray)) then
begin
// Anzahl prüfen und ggf. korrigieren
if (aStart + aCount > Length(aArray)) then
aCount := Length(aArray) - aStart;
// Elemente hinter zu löschendem Bereich nach vorne schieben
if (aStart + aCount < Length(aArray)) then
Move (aArray[aStart + aCount], aArray[aStart],
(Length(aArray) - (aStart + aCount)) * SizeOf(aArray[0]));
// Arraylänge anpassen
SetLength (aArray, Length(aArray) - aCount);
end;
end;
procedure Test;
var
A : TDynMyRecArray;
begin
SetLength (A, 5);
...
RemoveItem (A, 2); // entfernt das Element A[2]
RemoveItem (A, 0, 2); // entfernt die Elemente A[0] und A[1]
end;
Noch ein Hinweis: wenn der Record Referenzen auf Objekte enthält, müssen diese vor dem Aufruf von RemoveItem manuell freigegeben werden. Für Interfaces oder dynamische Strukturen erledigt dies die Prozedur SetLength.
Gruß Hawkeye