Einzelnen Beitrag anzeigen

Hawkeye219

Registriert seit: 18. Feb 2006
Ort: Stolberg
2.227 Beiträge
 
Delphi 2010 Professional
 
#7

Re: Aus Dynamischen Array Hersusschneiden.

  Alt 3. Sep 2006, 09:45
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
  Mit Zitat antworten Zitat