Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Array mit Objekte | Element überschreiben (https://www.delphipraxis.net/157745-array-mit-objekte-%7C-element-ueberschreiben.html)

bl4ckb1rd 23. Jan 2011 16:11

Array mit Objekte | Element überschreiben
 
Hallo Community,

ich habe mehrere Objekte erstellt und diese ín einen dafür geeigneten Array gelegt.

Code:
var
User: array of CKunde;
begin
SetLength(User, Length(User) + 1);
User[High(User)] := CKunde.Create;
User[High(User)].display := 'Kunde'+inttostr(High(User));
lb_auswahl.items.add(User[High(User)].display);  //lb_auswahl = ListBox
end;
Nun möchte ich ein Objekt, welches sich mitten im Array befindet löschen.
Damit der Array natürlich lückenlos bleibt, sollen alle sich danach befindlichen Objekte im Array um eins nach vorne rutschen und zum Schluß wird der Array um eins verringert. Hier stoße ich aber leider auf das Problem, dass ich scheinbar folgendermaßen das Objekt nicht kopieren und löschen kann/darf:

Code:
begin
User[lb_auswahl.ItemIndex] := User[length(User)-1];  //Zu löschendes Objekt einfach testweise mit dem letzen Objekt überschreiben (Fehler?)
User[length(User)-1].Destroy; //letztes Objekt löschen
SetLength(User, Length(User)); //Array jetzt um eins verringern.
end;

fui-tak 23. Jan 2011 16:35

AW: Array mit Objekte | Element überschreiben
 
Damit man den Code besser lesen kann, nimm bitte nächstes Mal den DELPHI-Tag (der Römerhelm).


Welcher Fehler kommt denn?

Sonst probier mal folgendes:
Delphi-Quellcode:
procedure loescheAktuellen;
begin
  if lb_auswahl.ItemIndex <= high(User) then
  begin
   User[lb_auswahl.ItemIndex].free;//nicht vergessen das aktuelle Objekt zu löschen (immer mit free)
   User[lb_auswahl.ItemIndex] := User[high(User)];
   //User[length(User)-1].free; //das letzte Objekt willst du gar nicht löschen, es soll ja an der Stelle des zu löschenden Objektes weiterleben
   SetLength(User, Length(User)-1);//hier fehlte die -1
  end
  else
    ShowMessage('Der ItemIndex ist zu groß');

end;

so sollte es funktionieren, aber keine Garantie

sx2008 23. Jan 2011 16:40

AW: Array mit Objekte | Element überschreiben
 
Immer wieder der gleiche Fehler!
Delphi-Programmierer greifen viel zu oft zum Array anstatt eine Liste zu verwenden.
Aus einer Liste kann man völlig problemlos ein Element entfernen.
Bei einem Array entsteht dagegen ein Loch, dass durch eine Verschiebeoperation gefüllt werden muss.
Bei einer Liste kann man auch völlig problemlos zwischendrin ein Element einfügen.

Eine Liste ist eine höherwertige Datenstruktur, während ein Array eine primitive Datenstruktur ist.
Intern kann man eine Liste auf einem Array aufbauen; für den Verwender der Liste ist dies aber ohne Belang.

Damit sollte klar sein, dass man höherwertige Datenstrukturen benützen sollte.
Im konkreten Fall ist dies die Klasse TObjectList.

Ausserdem kann man auch die Klasse TStrings (bzw. alle Ableitungen von TStrings) benützen um Objekte zu speichern:
Delphi-Quellcode:
var
  kunde : CKunde;
begin
  kunde := CKunde.Create;
  kunde.display := 'Kunde'+inttostr(lb_auswahl.items.Count+1);
  lb_auswahl.items.AddObject(kunde.display, kunde);
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:28 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz