![]() |
doppelte einträge löschen
irgend wie hab ich nen totales brett vorm kopf
ich kreig immer die fehlermeldung: "list index out of bounds (xx)" hir die procedure
Delphi-Quellcode:
das problem liegt irgendwo bei k, zumindest meldet sich da der compiler
procedure TForm1.double_delClick(Sender: TObject);
var i,k:integer; begin if listbox1.Count>0 then for i:=0 to listbox1.Count-2 do for k:=i+1 to listbox1.count-1 do if listbox1.Items.Strings[i]=listbox1.Items.Strings[k] then listbox1.Items.Delete(k); end; wenn ich aber mir die werte und strings in einer showmessage() anzeigen lasse, dann kommt keine fehlermeldung und alles klappt wie es soll (hatte da natürlich den vergleich herausgenommen) |
Re: doppelte einträge löschen
ListBox.Count wird nur einmal am Anfang der Schleife abgefragt.
Wenn Du also einen Eintrag löscht, wird i> als der aktuelle ListBox.Count werden. Abhilfe:
Delphi-Quellcode:
Ciao
while not i>ListBox.Count-1 do
begin end; Marco |
Re: doppelte einträge löschen
hi,
oder geh einfach die Listbox von hinten nach vorne durch. mfg lordcroc |
Re: doppelte einträge löschen
Ist ja auch richtig so. Wenn du was löschst, dann wird ja die Liste kürzer und irgendwann kommst du halt übers Ende hinaus.
Delphi-Quellcode:
In solchen Fällen kommst du besser, wenn du rückwärts Wählen lässt, oder eine Andere Art von Schleife verwendest.
Procedure TForm1.double_delClick(Sender: TObject);
Var i, k: Integer; Begin For i := ListBox1.Count - 1 downto 1 do For k := i - 1 down 0 do If ListBox1.Items.Strings[i] = ListBox1.Items.Strings[k] Then ListBox1.Items.Delete(k); End;
Delphi-Quellcode:
Procedure TForm1.double_delClick(Sender: TObject);
Var i, k: Integer; Begin i := 0; While i < ListBox1.Count do Begin k := 0; While k < ListBox1.Count do If ListBox1.Items.Strings[i] = ListBox1.Items.Strings[k] Then ListBox1.Items.Delete(k) Else Inc(k); Inc(i); End; End; |
Re: doppelte einträge löschen
habs jetzt so:
Delphi-Quellcode:
rückwärts kam auch immer ein fehler
procedure TForm1.double_delClick(Sender: TObject);
var i,k:integer; begin i := 0; While i < ListBox1.Count do Begin k := i+1; While k < ListBox1.Count do If ListBox1.Items.Strings[i] = ListBox1.Items.Strings[k] Then ListBox1.Items.Delete(k) Else Inc(k); Inc(i); End; End; danke für die hilfe!!!!! |
Re: doppelte einträge löschen
Gut, dann hier nochmal die funktionierenden Varianten im Überblick.
Damit diese zumindestens Anderen zur Verfügung stehen und sie sich nicht durch alle probieren müssen. ^^
Delphi-Quellcode:
Procedure TForm1.double_delClick(Sender: TObject);
Var i, k: Integer; Begin For i := ListBox1.Count - 2 downto 0 do For k := ListBox1.Count - 1 downto i + 1 do If ListBox1.Items.Strings[i] = ListBox1.Items.Strings[k] Then ListBox1.Items.Delete(k); End;
Delphi-Quellcode:
Procedure TForm1.double_delClick(Sender: TObject);
Var i, k: Integer; Begin i := 0; While i < ListBox1.Count - 2 do Begin k := i + 1; While k < ListBox1.Count do If ListBox1.Items.Strings[i] = ListBox1.Items.Strings[k] Then ListBox1.Items.Delete(k) Else Inc(k); Inc(i); End; End; |
Re: doppelte einträge löschen
Marco hat geschrieben
Zitat:
not 5 ist z.B. -6. Also lieber klammern
Delphi-Quellcode:
oder besser
not (i>ListBox.Count-1)
Delphi-Quellcode:
oder noch besser downto verwenden.
(i<=ListBox.Count-1)
Roderich |
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:44 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz