AGB  ·  Datenschutz  ·  Impressum  







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

Object aus einer TList löschen

Ein Thema von Luckie · begonnen am 21. Feb 2007 · letzter Beitrag vom 21. Feb 2007
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#1

Object aus einer TList löschen

  Alt 21. Feb 2007, 11:09
Îch habe Objekte in einer Liste vom Typ TList. Jetzt soll ein Objekt aus dieser Liste gelöscht werden. Dies mache ich erstmal so:
Delphi-Quellcode:
  inherited Delete(Index);
  Self.Items[Index].Free;
  Self.Items[Index] := nil;
Jetzt habe ich aber eine Lücke in meiner Liste, da die Reihenfolge erhalten bleiben muss, müsste ich ja jetzt alle nachfolgenden Objekte eins aufrücken lassen in der Liste. Oder sehe ich das falsch? Wenn meine Annahme richtig ist, wie mache ich das?

Mache ich es so:
Delphi-Quellcode:
  for i := Index to Self.Count - 1 do
  begin
    Self.Items[Index] := Self.Items[Index + 1];
  end;
laufe ich ja über die Anzahl der Objekte in der Liste hinaus und ich bekomme eine AV.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.105 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: Object aus einer TList löschen

  Alt 21. Feb 2007, 11:15
Moin Michael,

Zitat von Luckie:
Jetzt habe ich aber eine Lücke in meiner Liste, da die Reihenfolge erhalten bleiben muss, müsste ich ja jetzt alle nachfolgenden Objekte eins aufrücken lassen in der Liste. Oder sehe ich das falsch?
Ja.

Zitat von OH - TList - Delete:
Calling Delete moves up all items in the Items array that follow the deleted item, and reduces the Count.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#3

Re: Object aus einer TList löschen

  Alt 21. Feb 2007, 11:17
Hm, dann muss mein Fehler wo anders liegen. Danke für den Hinweis.

Ist das so in Ordnung:
Delphi-Quellcode:
procedure TPageCollection.Delete(Index: Integer);
begin
  Self.Items[Index].Free;
  Self.Items[Index] := nil;
  inherited Delete(Index);
  Self.Rename;
end;
Erst das Objekt freigeben und dann den Item aus der Liste löschen? Mache ich es anders rum, bekomme ich im weiteren Programmverlauf eine AccessViolation.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#4

Re: Object aus einer TList löschen

  Alt 21. Feb 2007, 11:18
Dein Delete ist falsch implementiert, denn: Das inherited Delete löscht das entsprechende Element und verkürzt die Liste. Somit gibst du mit .Free nach dem inherited Aufruf das nachgerückte Element frei. Wenn du das letzte Element löscht sogar ein nicht existierendes, etc. Damit baust du dir selber eine nicht existierende Instanz in deine Liste.

Wenn du ein Element aus einer TList haben willst ohne de Index freizugeben, dann nimm ihn einfach mit Items und weise Nil zu. Ansonsten bei TObjectList gibt es auch ein entsprechendes Extract().

Nochwas: Wenn du Nil Einträge in deiner TList (oder Nachfahre) hast, dann kannst du dir einfach mit der Methode Pack entfernen lassen.

/-------- roter Kasten --------

Das "Ja" (von Christian Seehase) ist falsch: Luckie fragt, ob er die Items nachrücken muss. Dem ist nicht so, TList macht dies. Daher trotzdem abgeschickt...

/EDIT2: Korrektur zu der Schleife: Wenn du sie brauchen tätest, was hier ja erklärterweise nicht der Fall ist, dann müsste die Schleife theoretisch nur bis Count-2 laufen, da du schliesslich mit Index+1 immer den Nachfolger holst. Diese darf somit auch nicht Count-1 überschreiten, daher nochmals -1, da dem +1 Rechnung getragen werden muss.

Delphi-Quellcode:
for i := Index to Self.Count - 2 do
  begin
    Self.Items[Index] := Self.Items[Index + 1];
  end;
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#5

Re: Object aus einer TList löschen

  Alt 21. Feb 2007, 11:26
Push. Habe noch was ergänzt.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Ferber

Registriert seit: 9. Mär 2005
Ort: Wien Umgebung
155 Beiträge
 
Delphi 2006 Architect
 
#6

Re: Object aus einer TList löschen

  Alt 21. Feb 2007, 11:27
Hi !
So sollte es gehen
Delphi-Quellcode:
var p:Pointer;
begin
  p:=Liste.Items[Index];
  FreeAndNil(p);
  Liste.Delete(Index);
end;
Otto
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#7

Re: Object aus einer TList löschen

  Alt 21. Feb 2007, 11:32
Ja gut, das wäre jetzt die elegante Kurzfassung von meinem Code.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#8

Re: Object aus einer TList löschen

  Alt 21. Feb 2007, 11:33
Hallo Michael,

wenn in deinem ersten Beitrag TCollection statt TList stehen würde, dann würde dein thread mehr Sinn für mich machen.

Freundliche Grüße
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#9

Re: Object aus einer TList löschen

  Alt 21. Feb 2007, 11:35
In der Liste befinden sich aber keine Nachfahren von TCollectionItem. Die Klasse TCollection kann ich also nicht benutzen, wenn ich das richtig sehe. Desweiteren haben wir ja eine Lösung gefunden.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#10

Re: Object aus einer TList löschen

  Alt 21. Feb 2007, 11:39
1. Ein free reicht völlig.
2. Ein Nil setzen muss nicht sein, der Eintrag fliegt eh raus. Du hast ja ein TList Nachkommen und keinen TObjectList Nachkommen, der selber versuchen würde das zu entfernende Element zu löschen (was beim zuweisen von Nil auf einen Item auch geschehen würde).

Daher:

Delphi-Quellcode:
var lObj: TObject;
begin
  lObj := Liste.Items[Index];
  Liste.Delete(Index);
  lObj.Free; // kann genauso gut vor dem Delete() stehen, das ist Schnuppe...
end;
Bzw. Luckies Version:

Delphi-Quellcode:
procedure TPageCollection.Delete(Index: Integer);
begin
  Self.Items[Index].Free;
  inherited Delete(Index);
  Self.Rename;
end;
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 17:57 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