![]() |
Aus Dynamischen Array Hersusschneiden.
:oops:
Wie kann ich ein Teil aus dem Dynamischen Array Heraus schneiden und den Rest nachrücken ??
Delphi-Quellcode:
So und jetzt möchte ich den wert aus der Position Nr. 2 Herausschneiden
Var
a : Array of irgen ein Record b : Byte; Begin SetLength( a, 5 ); For b:=0 To 4 Do a[b]:=b und das Ergebnis Soll So Aussehen 0,2,3,4 Danke gruss seba |
Re: Aus Dynamischen Array Hersusschneiden.
ich würde ein temporäres array zu hilfe nehmen, die werte darin zwischenspeichern und dann wieder ins original array packen.
|
Re: Aus Dynamischen Array Hersusschneiden.
Hi,
da dran habe ich auch überlegt, aber es könnte vieleich viel zu Zeitaufwendig sein bei grösseren sachen. Ich dachte vieleicht bibts es eine einfachere metode. gruss seba |
Re: Aus Dynamischen Array Hersusschneiden.
Kannst die Daten ja nachrücken ohne extriges Array.
Wenn du z.B. 1, 2, 3, 4, 5, hast und löscht 2 und 3, dann kopierst du 4 nach zwei, 5 nach drei und kürzt dann das Array um zwei. |
Re: Aus Dynamischen Array Hersusschneiden.
Ja das werde ich jetzt versuchen
danke |
Re: Aus Dynamischen Array Hersusschneiden.
Delphi-Quellcode:
Procedure DeleteFromArray (anArray : Array Of <MyType>; anIndex : Integer);
Var BytesPerElement, TotalBytesToMove : Integer; Begin BytesPerElement := Sizeof (anArray [0]); TotalBytesToMove := (Length (anArray) - anIndex + 1)* BytesPerElement; If TotalBytesToMove > 0 Then Move (anArray [anIndex + 1], anArray [anIndex], TotalBytsToMove); End; |
Re: Aus Dynamischen Array Hersusschneiden.
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:
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.
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; Gruß Hawkeye |
Re: Aus Dynamischen Array Hersusschneiden.
Danke für Eure Antworten,
das hat alles ganz schön funktioniert. Aber mal andere frage die eingentlich auch hier gehören könnte. Wenn ich jetzt ein Dyn.Array habe wie z.B.
Delphi-Quellcode:
und diesen beenden möchte mit :
Var
a : Array of MyRecord; ...
Delphi-Quellcode:
Bekomme ich eine Speicher verletztung !
Finalize( a , Length( a ));
SetLength( a, 0 ); Wenn ich es mit
Delphi-Quellcode:
Wird mein Reservierte Speicher nicht freigegeben.
a := nil;
Also wie soll ich es Beenden ? Gruss |
Re: Aus Dynamischen Array Hersusschneiden.
Hallo shifter,
bei einem Verkleinern dynamischer Arrays durch SetLength wird automatisch für die freigegebenen Elemente ein Finalize durchgeführt. Wenn du es trotzdem aufrufen möchtest, dann so:
Delphi-Quellcode:
Auch das Löschen dynamischer Arrays über eine Zuweisung von NIL führt zu einem Finalize-Aufruf. Dabei werden aber immer nur dynamische Strings oder Arrays sowie Interface-Zeiger behandelt. Objekte, zu denen du Referenzen im Record abgelegt hat, muß du selbst durch einen Aufruf ihrer Free-Methode freigeben.
Finalize (a[0], Length(a));
Gruß Hawkeye |
Re: Aus Dynamischen Array Hersusschneiden.
Ja ,
jetzt sieht es viell besser aus. Aber trotz dem wenn ich mir mit dem TaskManager den Speicher verbrauch mal angucke vor dem ich den Dyn.Array erstelle und nach dem ich Ihm auflöse bekomme ich nicht mehr den alten wert. Also wenn ich die Aktion ein paar mal wiederhole verbraucht mein Proggi immer mehr Speicher. Vieleich mal zu den Record, er besteht aus ein paar Integers, und TBitmaps. Die TBitmaps werden am Ende mit Free freigegeben 8und am Ende habe ich so gemach wie Du mir das geschrieben hast also mit
Delphi-Quellcode:
Warum bekomme ich nicht den alten zustand wieder her ?
Finalize ( a[0], Length(a));
gruss seba |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:32 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz