![]() |
dynamisches arry "rückwärts" löschen
Erstmal Hallo, Delphianer!
Mein Problem: Wie kann ich die Erste Variable in einem Dynamischen Array löschen, also z.B: dynArray[0] = 5 dynArray[1] = 7 dynArray[2] = 4 dynArray[3] = 9 -----------Erstes löschen dynArray[0] = 5 dynArray[1] = 7 dynArray[2] = 4 dynArray[3] = 9 -----------Ergebnis: dynArray[0] = 7 dynArray[1] = 4 dynArray[2] = 9 -----------Ich weiß es geht auch mit Code-Bröseln aber das ist mir dann doch zu umständlich, geht das auch einfacher? |
Re: dynamisches arry "rückwärts" löschen
Den ersten kannst du nicht so Löschen. Du mußt erst den Letzten auf den Vortletzten, ..., 2. auf den 1. Kopieren und dann den Letzen Löschen.
|
Re: dynamisches arry "rückwärts" löschen
![]() @mkinzler: mit Move kann man auch ganze Blöcke verschieben. Sprich das ganze Array ab [1] bis zum Ende um -1 verschieben. Chris |
Re: dynamisches arry "rückwärts" löschen
Zitat:
außerdem: Zitat:
@CalganX: Danke, wenigstens etwas :thumb: |
Re: dynamisches arry "rückwärts" löschen
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 ![]() Ein kleines Beispiel mit AnsiStrings:
Delphi-Quellcode:
Enthält das Array keine dynamischen Daten, ist der ganze Aufwand natürlich nicht notwendig.
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; Gruß Hawkeye |
Re: dynamisches arry "rückwärts" löschen
also für einen zu löschenden Eintrag:
dabei muß man aber wissen wie das Array aufgebau ist und wie es mit Zeigern und Co. darin aussieht.
Delphi-Quellcode:
// die zu überschreibenden Elemente finalisieren
Texte[0] := ''; // oder halt Finalize(Texte[0]); // Verschiebung durchführen Move(Texte[1], Texte[0], (Length(Texte) - 1) * SizeOf(Texte[0])); // freiwerdende Elemente mit 0 überschreiben Pointer(Texte[Length(Texte) - 1]) := nil; // Array verkürzen SetLength(Texte, Length(Texte) - 1);
Delphi-Quellcode:
für ein einfaches IntegerArray würde z.B. schon das reichen:
// Verschiebung durchführen Move(Texte[1], Texte[0], (Length(Texte) - 1) * SizeOf(Texte[0])); // Array verkürzen SetLength(Texte, Length(Texte) - 1); im Prinziep geht es eigentlich so:
Delphi-Quellcode:
// Verschiebung durchführen
for i := 1 to High(Texte) do Texte[i - 1] := Texte[i]; // Array verkürzen SetLength(Texte, Length(Texte) - 1); |
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:44 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