Autor Beitrag
DelphiBoon
Hält's aus hier
Beiträge: 8



BeitragVerfasst: Mo 07.03.05 12:37 
Hallo,
ich habe eine TList erstellt und füge in diese Datenobjekte ein vom Typ CBook.

ausblenden Delphi-Quelltext
1:
2:
buecher := TList.Create();
buecher.Add(buch);


Nun will ich ein Buch über seine ID löschen.

ausblenden Delphi-Quelltext
1:
buecher.Delete(id-1);					


Klappt aber nicht. Kommt immer die Meldung das n Zugriffsfehler kommt.
Die ID ist ein Index aus einem StringGrid. Habe ich gerad n Brett vorm Kopf oder gibt es da wirklich nen Fehler meinerseits?

Moderiert von user profile iconUGrohne: Delphi-Tags hinzugefügt.
Lossy eX
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1048
Erhaltene Danke: 4



BeitragVerfasst: Mo 07.03.05 12:55 
n = ein? Denke ich doch mal. ;-)

Also normal sollte das so gehen. Was kommt denn bitte genau für ein Fehler? Eine Zugriffsverletzung deutet normal darauf hin, dass du auf etwas zugreifst was nicht mehr existiert. Zum Beispiel das evtl. nicht mehr existierende Objekt in der Liste. Das Löschen alleine ist ungefährlich, da nicht auf das Objekt zugegriffen wird sondern nur seine Adresse gelöscht wird. Wenn aber auf das objekt zugegriffen werden würde, dann knallt es. Evtl kann es ja auch sein, dass du deine Liste vorher schon freigegen hast und somit auf eine ungültige Liste zugreifst. Zur Not würde uns auch ein wenig mehr Code helfen.

_________________
Nur die Menschheit ist arrogant genug, um zu glauben sie sei die einzige intelligente Lebensform im All. Wo nicht mal das nachhaltig bewiesen wurde.
DelphiBoon Threadstarter
Hält's aus hier
Beiträge: 8



BeitragVerfasst: Mo 07.03.05 13:03 
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
constructor CBuchliste.Create(ptitel : String; pautor : String;
                                      pverlag : String; pinhalt : String;
                                      ppreis : Real;pstatus :  Boolean; 
                                      pisbn : String; pregkey : String; pid : Integer);
var buch : Cbuch;
begin
     buecher := TList.Create();
     buch := CBuch.Create(ptitel,pautor,pverlag,pinhalt,ppreis,pstatus,pisbn,pregkey,pid);
     buecher.Add(buch);
end;

function CBuchliste.getBookList() : TList;
begin
     result := buecher;
end;

procedure CBuchliste.addBook(buch : CBuch);
begin
     buecher.Add(buch);
end;

procedure CBuchliste.deleteBook(id : Integer);

begin
     buecher.Delete(id-1);
end;


Das ist meine Unit für die Bücherliste.
Eskommt immer "Der Index der Liste überschreitet das Maximum(1)." Wenn ich jetzt das erste Element aus der Liste löschen will und nur ein Element drinsteht.

Moderiert von user profile iconTino: Delphi-Tags hinzugefügt.
wdbee
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 628
Erhaltene Danke: 1



BeitragVerfasst: Mo 07.03.05 13:32 
Die Fehlermeldung besagt, dass du einen Index angibst, den es in der Liste nicht (oder nicht mehr gibt).

Prüf doch mal nach, ob deine Zählung stimmt. Also erster Eintrag in der Liste ist Index 0.
Der TList.Add-Aufruf gibt übrigens den Index zurück, und nur der ist richtig.
Analog wird es bei dem Stringrid sein. Erster Eintrag hat Index 0. Löscht du dann evt. den Eintrag -1 oder so etwas in der Art?

Und dann noch: Durch ein Delete ändern sich die Index-Werte aller verbleibenden Einträge nach dem gelöschten! Deshalb fällst du mit Delete wahrscheinlich auf den Bauch, weil dein Stringrid nicht mehr zur Liste passt. Schau dir deshalb statt Delete(Index: Integer) mal Remove(Item: Pointer) an.