AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Array mit Objekte | Element überschreiben

Ein Thema von bl4ckb1rd · begonnen am 23. Jan 2011 · letzter Beitrag vom 23. Jan 2011
Antwort Antwort
bl4ckb1rd

Registriert seit: 3. Okt 2008
53 Beiträge
 
#1

Array mit Objekte | Element überschreiben

  Alt 23. Jan 2011, 16:11
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;
  Mit Zitat antworten Zitat
fui-tak

Registriert seit: 24. Okt 2008
117 Beiträge
 
Turbo Delphi für Win32
 
#2

AW: Array mit Objekte | Element überschreiben

  Alt 23. Jan 2011, 16:35
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

Geändert von fui-tak (23. Jan 2011 um 16:54 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 15. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#3

AW: Array mit Objekte | Element überschreiben

  Alt 23. Jan 2011, 16:40
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;
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:41 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