Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Listenindex überschreitet das Maximum (9). (https://www.delphipraxis.net/27851-listenindex-ueberschreitet-das-maximum-9-a.html)

Mr Whoopee 16. Aug 2004 15:51


Listenindex überschreitet das Maximum (9).
 
Hallo, ich mal wieder :wall:,
ich möchte, dass ein Eintrag aus einer ListBox gelöscht wird.
Hier der Code:
Code:
procedure TForm1.Button1Click(Sender: TObject);
var i: integer;
begin
For i:=0 to ListBox1.Items.Count-1 do
    If ListBox1.Items[i]=schueler.Text then
    ListBox1.Items.Delete(i);
end;
Komischerweise sagt Delphi mir, wenn ich was löschen will:
Listenindex überschreitet das Maximum (9). Wenn ich jedoch das hier änder...
Code:
ListBox1.Items.Count-2
... auf -2, kann ich das letzte nicht löschen :bounce1:

Weiß jemand Rat?


Danke für alle Antworten, Whoopee.

Bowler 16. Aug 2004 15:54

Re: Listenindex überschreitet das Maximum (9).
 
Hm. Wäre die Frage, ob die Delete-Funktion die Count-Property aktualisiert, wenn sie ausgeführt wird. Denn ansonsten würde z.B. die Delete-Funktion aufgerufen, ab da ist dann ein Element weniger in der Liste. Wenn in diesem Fall Count nicht aktualisiert wird, sondenrn noch immer den Ausgangwert liefert, dann schiesst der am Schluss genau 1 Element über das Ende hinaus.

Habe leider gerade kein Delphi da, um das Probem zu testen.

Versuche dochmal, mit dem Debugger zu schauen, wie sich der Wert in Count verhält.

Gruß
Christian

dizzy 16. Aug 2004 15:55

Re: Listenindex überschreitet das Maximum (9).
 
Indem du ein Item löschst, veränderst du ja den Wert von Count. Nimm hierzu besser eine while-Schleife:
Delphi-Quellcode:
while ListBox1.Count > 0 do ListBox1.Items.Delete(0);

mytar 16. Aug 2004 15:55

Re: Listenindex überschreitet das Maximum (9).
 
machs besser so:

wenn schuler.text in ListBox einmal vorkommt:
Delphi-Quellcode:
with ListBox1.Items do
  Delete(IndexOf(schuler.text));
allgemein Lösung:
Delphi-Quellcode:
with ListBox1.Items do
 while IndexOf(schuler.text) > -1 then
  Delete(IndexOf(schuler.text));
greetz
mytar :)

Stevie 16. Aug 2004 15:56

Re: Listenindex überschreitet das Maximum (9).
 
Wenn du Delete(0) machst, dann wird der erste Eintrag gelöscht, und der vorher zweite Eintrag wird zum ersten (Index 0)!!!
Also:
Delphi-Quellcode:
i := 0;
while i < ListBox1.Items.Count do
  if ListBox1.Items[i] = schueler.Text then
    ListBox1.Items.Delete(i)
  else
    Inc(i);

dizzy 16. Aug 2004 15:57

Re: Listenindex überschreitet das Maximum (9).
 
Zitat:

Zitat von Bowler
Wenn in diesem Fall Count nicht aktualisiert wird, sondenrn noch immer den Ausgangwert liefert, dann schiesst der am Schluss genau 1 Element über das Ende hinaus.

Genau das wird passieren. Delphi guckt nicht jedes Mal nach, ob die Abbruchbedingung gleich geblieben ist, sondern sie bleibt während der Schleife wie am Anfang! Ansonsten wäre es ja schon fast eine while-Schleife ;)

dizzy 16. Aug 2004 15:58

Re: Listenindex überschreitet das Maximum (9).
 
Zitat:

Zitat von Stevie
Delphi-Quellcode:
i := 0;
while i < ListBox1.Items.Count do
  if ListBox1.Items[i] = schueler.Text then
    ListBox1.Items.Delete(i)
  else
    Inc(i);

Und genau DAS ist auch Murks :mrgreen:

Mr Whoopee 16. Aug 2004 15:59

Re: Listenindex überschreitet das Maximum (9).
 
Zitat:

Zitat von Bowler
Hm. Wäre die Frage, ob die Delete-Funktion die Count-Property aktualisiert, wenn sie ausgeführt wird. Denn ansonsten würde z.B. die Delete-Funktion aufgerufen, ab da ist dann ein Element weniger in der Liste. Wenn in diesem Fall Count nicht aktualisiert wird, sondenrn noch immer den Ausgangwert liefert, dann schiesst der am Schluss genau 1 Element über das Ende hinaus.

Habe leider gerade kein Delphi da, um das Probem zu testen.

Versuche dochmal, mit dem Debugger zu schauen, wie sich der Wert in Count verhält.

Gruß
Christian

Das ist eine gute überlegung - danke! :) Ich müsste nur dach der schleife das item löschen :)


Zitat:

Zitat von dizzy
Indem du ein Item löschst, veränderst du ja den Wert von Count. Nimm hierzu besser eine while-Schleife:
Delphi-Quellcode:
while ListBox1.Count > 0 do ListBox1.Items.Delete(0);

Auch nicht schlecht :)

Zitat:

Zitat von mytar
machs besser so:

Delphi-Quellcode:
with ListBox1.Items do
 Delete(IndexOf(schuler.text));
greetz
mytar :)

So habe ich es dann gemacht :) funzt sauber :) danke danke danke :)


DANKE @ all :)

dizzy 16. Aug 2004 15:59

Re: Listenindex überschreitet das Maximum (9).
 
:gruebel: oder vielleicht gleich ListBox1.Items.Clear; :gruebel:

\\edit: Ach jo, du willst ja selektiv löschen :oops:

Stevie 16. Aug 2004 16:02

Re: Listenindex überschreitet das Maximum (9).
 
Zitat:

Zitat von dizzy
Zitat:

Zitat von Stevie
Delphi-Quellcode:
i := 0;
while i < ListBox1.Items.Count do
  if ListBox1.Items[i] = schueler.Text then
    ListBox1.Items.Delete(i)
  else
    Inc(i);

Und genau DAS ist auch Murks :mrgreen:

Und warum bitte????


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:35 Uhr.
Seite 1 von 2  1 2      

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