![]() |
Array-Element löschen
Hallo, ich will in einen dynamsiches Array, in dem ich Records habe, eines raus nehmen und die anderen Nachrücken lasse. Doch irgendwie erhalte ich immer Zugriffsverletzungen oder erhalte nicht das richtige Ergebnis.
Delphi-Quellcode:
procedure TFeldliste.DeleteField(Index: Integer);
var i,l : integer; begin L := length(FListe); for i := index to L-1 do begin FListe[i].ID := FListe[i+1].id; FListe[i].Name := FListe[i+1].Name; FListe[i].typ := FListe[i+1].typ; end; setlength(Fliste, length(fliste)-1); end; |
Re: Array-Element löschen
Du musst L-2 statt L-1 schreiben, da Array[Length(Array)-1+1] genau um 1 zu groß ist
|
Re: Array-Element löschen
Wenn du aus deinem Record eine Klasse machst und statt dem Array einen TObjectList (oder eine eigene Ableitung) von TObjectList nimmst dürfte es weniger bis keine Probleme mehr geben. Auf jeden Fall weniger Code. ;)
|
Re: Array-Element löschen
Moin Taladan,
ich weiss ja nicht, wie gross die Liste werden kann, aber ich hatte es vor kurzen auch so gemacht (Kombination dynamisches Array und Record), und auch ganze Bereiche so gelöscht / eingefügt wie Du. Der Umbau auf TObjectList statt des dynamischen Arrays und einer simplen Klasse (ohne Methoden ;-)) statt des Records hat mir eine Geschwindigkeitssteigerung um den Faktor 30 gebracht (ca. 30 Sekunden statt vorher ca. 1000). |
Re: Array-Element löschen
Zitat:
Deshalb kann man ihn nicht, wie es TList macht, sprungweise wachsen lassen. Man könnte es, aber es wäre irgendwo ein hässlicher Krampf immer erst eine olle funktion aufzurufen, die das macht. :? TList selbst ist ja auch nur ein Array, nur halt in einer verwendbaren Kapselung... :) |
Re: Array-Element löschen
TObjectList <---- Die Antwort auf viele, sehr viele Wutentbrannte Stunden!!! :wall:
Warum hab ich die net schon vorher gekannt. :cry: Gabs die schon in delphi4std :gruebel: ? Ich glaub net... da kamen ja grad die dynamischen Arrays hinzu... Toll, alles wieder um schreiben. Aber wenigstens danach weniger getippe... Dumme Frage dazu. Zitat OH: Zitat:
|
Re: Array-Element löschen
Zitat:
![]() Du könntest einfach TToken durch deine FeldDings-Klasse ersetzen und schon sparst du dir viel rumgecaste. ;) edit: Da fehlte wohl ein "weni" im Zitat. ;) |
Re: Array-Element löschen
Und falls man doch nicht auf Arrays verzichten kann hilft meine DeleteArray-Funktion:
![]() |
Re: Array-Element löschen
Zitat:
mfg Christian |
Re: Array-Element löschen
Du kannst auch das ganze item hochrollen:
Delphi-Quellcode:
Das ist kürzer und schneller. Nicht schneller als diese ObjectList, aber dafür kannst du dir das umschreiben sparen. Naja und bei kleinen Listen (<1000 Elemente) wirst du dabei auch keinen Performancenachteil haben, wenn du diese procedure nicht ganz oft hintereiander ausführst.
procedure TFeldliste.DeleteField(Index: Integer);
var i,l : integer; begin L := length(FListe); for i := index to L-2 do begin FListe[i] := FListe[i+1]; end; setlength(Fliste, length(fliste)-1); end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:02 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