Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi doppelte einträge löschen (https://www.delphipraxis.net/17323-doppelte-eintraege-loeschen.html)

Remote1 3. Mär 2004 11:18


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:
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;
das problem liegt irgendwo bei k, zumindest meldet sich da der compiler
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)

MarcoWarm 3. Mär 2004 11:24

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:
while not i>ListBox.Count-1 do
begin

end;
Ciao

Marco

lordcroc 3. Mär 2004 11:40

Re: doppelte einträge löschen
 
hi,

oder geh einfach die Listbox von hinten nach vorne durch.

mfg
lordcroc

himitsu 3. Mär 2004 11:45

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:
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;
In solchen Fällen kommst du besser, wenn du rückwärts Wählen lässt, oder eine Andere Art von Schleife verwendest.

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;

Remote1 9. Mär 2004 06:32

Re: doppelte einträge löschen
 
habs jetzt so:
Delphi-Quellcode:
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;
rückwärts kam auch immer ein fehler
danke für die hilfe!!!!!

himitsu 9. Mär 2004 09:41

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;

roderich 9. Mär 2004 09:55

Re: doppelte einträge löschen
 
Marco hat geschrieben

Zitat:

while not i>ListBox.Count-1 do
begin

end;
hi Marco, das ist gefährlich, weil der Compiler zuerst das binäre "not i" berechnet.
not 5 ist z.B. -6.

Also lieber klammern
Delphi-Quellcode:
not (i>ListBox.Count-1)
oder besser
Delphi-Quellcode:
(i<=ListBox.Count-1)
oder noch besser downto verwenden.

Roderich


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:47 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