AGB  ·  Datenschutz  ·  Impressum  







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

doppelte einträge löschen

Ein Thema von Remote1 · begonnen am 3. Mär 2004 · letzter Beitrag vom 9. Mär 2004
Antwort Antwort
Benutzerbild von Remote1
Remote1

Registriert seit: 22. Okt 2003
Ort: Dippoldiswalde
252 Beiträge
 
Delphi 6 Personal
 
#1

doppelte einträge löschen

  Alt 3. Mär 2004, 11:18
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)
  Mit Zitat antworten Zitat
Benutzerbild von MarcoWarm
MarcoWarm

Registriert seit: 10. Sep 2003
Ort: Großhennersdorf
532 Beiträge
 
Delphi 10.1 Berlin Professional
 
#2

Re: doppelte einträge löschen

  Alt 3. Mär 2004, 11:24
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
Marco Warm
  Mit Zitat antworten Zitat
lordcroc

Registriert seit: 13. Aug 2002
Ort: Braunschweig
137 Beiträge
 
Delphi 7 Professional
 
#3

Re: doppelte einträge löschen

  Alt 3. Mär 2004, 11:40
hi,

oder geh einfach die Listbox von hinten nach vorne durch.

mfg
lordcroc
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.186 Beiträge
 
Delphi 12 Athens
 
#4

Re: doppelte einträge löschen

  Alt 3. Mär 2004, 11:45
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;
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von Remote1
Remote1

Registriert seit: 22. Okt 2003
Ort: Dippoldiswalde
252 Beiträge
 
Delphi 6 Personal
 
#5

Re: doppelte einträge löschen

  Alt 9. Mär 2004, 06:32
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!!!!!
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.186 Beiträge
 
Delphi 12 Athens
 
#6

Re: doppelte einträge löschen

  Alt 9. Mär 2004, 09:41
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;
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
roderich
(Gast)

n/a Beiträge
 
#7

Re: doppelte einträge löschen

  Alt 9. Mär 2004, 09:55
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
not (i>ListBox.Count-1) oder besser
(i<=ListBox.Count-1) oder noch besser downto verwenden.

Roderich
  Mit Zitat antworten Zitat
Antwort Antwort


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:56 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