AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi Doppelte Einträge aus ListBox entfernen
Thema durchsuchen
Ansicht
Themen-Optionen

Doppelte Einträge aus ListBox entfernen

Ein Thema von ManuMF · begonnen am 29. Sep 2005 · letzter Beitrag vom 30. Sep 2006
Antwort Antwort
Benutzerbild von ManuMF
ManuMF

Registriert seit: 11. Jul 2005
1.016 Beiträge
 
Delphi 6 Personal
 
#1

Doppelte Einträge aus ListBox entfernen

  Alt 29. Sep 2005, 17:22
Hallo,

ich möchte aus einer ListBox doppelte Einträge entfernen. Ich benutze dazu folgenden Code, den ich hier gefunden habe:
Delphi-Quellcode:
for D1 := (PCListe.Items.Count - 1) downto 0 do
begin
  for D2 := (PCListe.Items.Count - 1) downto 0 do
  begin
    if (PCListe.Items.Strings[D1] = PCListe.Items.Strings[D2]) and (D1 <> D2) then
      PCListe.Items.Delete(D2);
  end;
end;
aber beim Ausführen kommt immer der Fehler "Listenindex überschreitet Maximum".
Weiß jemand, wo der Fehler liegt (downto sollte das ja eigentlich verhindern)?

Danke,
ManuMF
Gruß,
ManuMF

Endlich hab ich was Positives an Vista entdeckt: Das mitgelieferte Mahjongg
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#2

Re: Doppelte Einträge aus ListBox entfernen

  Alt 29. Sep 2005, 17:32
Versuch's mal mit folgender Strategie:
Stringliste sortieren (mit Quicksort) und dabei Duplikate löschen.
Delphi-Quellcode:
procedure SortTStrings(Strings:TStrings; Duplicates:TDuplicates);
var
   tmp: TStringList;
begin
   if Strings is TStringList then
   begin
      TStringList(Strings).Duplicates := Duplicates;
      TStringList(Strings).Sort;
   end
   else
   begin
      tmp := TStringList.Create;
      try
         tmp.Duplicates := Duplicates;
         tmp.Sorted := True;

         // make a sorted copy
         tmp.Assign(Strings);
         // copy back
         Strings.Assign(tmp);
      finally
         tmp.Free;
      end;
   end;
end;

SortTstrings(PCListe, dupIgnore);
Andreas
  Mit Zitat antworten Zitat
Benutzerbild von Hador
Hador

Registriert seit: 11. Dez 2004
Ort: Recke
682 Beiträge
 
Turbo Delphi für Win32
 
#3

Re: Doppelte Einträge aus ListBox entfernen

  Alt 29. Sep 2005, 17:33
nicht in jedem fall.
Wenn z.B. 2 einträge entfernt werden, bringt auch downto nix.

Ich bastel dir sofort mal 'n code zusammen.

EDIT:

So sollte es gehen
Delphi-Quellcode:
while D1 < PCListe.Items.Count do
begin
  for D2 := (PCListe.Items.Count - 1) downto 0 do
  begin
    if (PCListe.Items.Strings[D1] = PCListe.Items.Strings[D2]) and (D1 <> D2) then
      PCListe.Items.Delete(D2);
  end;
  inc(D1);
end;
Lars Kiesow
http://www.larskiesow.de

Computer gehorchen deinen Befehlen, nicht deinen Absichten.
  Mit Zitat antworten Zitat
Benutzerbild von ManuMF
ManuMF

Registriert seit: 11. Jul 2005
1.016 Beiträge
 
Delphi 6 Personal
 
#4

Re: Doppelte Einträge aus ListBox entfernen

  Alt 29. Sep 2005, 17:36
SortTstrings(PCListe.Items, dupIgnore);

funktioniert, Danke!
Gruß,
ManuMF

Endlich hab ich was Positives an Vista entdeckt: Das mitgelieferte Mahjongg
  Mit Zitat antworten Zitat
Benutzerbild von ManuMF
ManuMF

Registriert seit: 11. Jul 2005
1.016 Beiträge
 
Delphi 6 Personal
 
#5

Re: Doppelte Einträge aus ListBox entfernen

  Alt 29. Sep 2005, 17:40
Die andere Lösung funktionoiert auch. Ich werde mir mal beide merken.
Aber welche ist besser / schneller?

Gruß,
ManuMF
Gruß,
ManuMF

Endlich hab ich was Positives an Vista entdeckt: Das mitgelieferte Mahjongg
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#6

Re: Doppelte Einträge aus ListBox entfernen

  Alt 29. Sep 2005, 17:51
Zitat von ManuMF:
Die andere Lösung funktionoiert auch. Ich werde mir mal beide merken.
Aber welche ist besser / schneller?
Du bist jünger als ich. Also bist du dran mit "Jugend forscht"
Bei sehr grossen Listen ist sortieren mit Quicksort und eliminieren der Duplikate wahrscheinlich schneller.
Wenn die Liste schon sortiert ist, dann gibt's noch folgende Funktion:
Delphi-Quellcode:
function RemoveDups(s:TStrings):Integer;
var
   i : Integer;
   s_old : string;
begin
   s_old := '999678568';
   Result := 0;

   Assert(assigned(s));

   TrimTStrings(s);

   for i := s.Count-1 downto 0 do
   begin
      if s[i] = s_old then
      begin
         s.Delete(i);
         Inc(Result);
      end
      else
         s_old := s[i];
   end;
end;
Andreas
  Mit Zitat antworten Zitat
newuser01

Registriert seit: 31. Aug 2006
248 Beiträge
 
Delphi 7 Professional
 
#7

Re: Doppelte Einträge aus ListBox entfernen

  Alt 28. Sep 2006, 17:12
Zitat:
ich möchte aus einer ListBox doppelte Einträge entfernen
Vielleicht hilft dir dieser Beitrag auch noch, damit du doppelte Einträge von vorne rein in der ListBox ausschließen kannst
Gruß: Holger

[Hobby-Programmierer]
  Mit Zitat antworten Zitat
Benutzerbild von ManuMF
ManuMF

Registriert seit: 11. Jul 2005
1.016 Beiträge
 
Delphi 6 Personal
 
#8

Re: Doppelte Einträge aus ListBox entfernen

  Alt 30. Sep 2006, 16:33
Danke, aber
1. ist das Prüfen beim Laden kein Problem
2. ging es mir gestern vor einem Jahr definitiv um die Prüfung, wenn die Liste schon da ist.
Gruß,
ManuMF

Endlich hab ich was Positives an Vista entdeckt: Das mitgelieferte Mahjongg
  Mit Zitat antworten Zitat
newuser01

Registriert seit: 31. Aug 2006
248 Beiträge
 
Delphi 7 Professional
 
#9

Re: Doppelte Einträge aus ListBox entfernen

  Alt 30. Sep 2006, 21:08
Wer lesen kann ist klar im Vorteil künftig wird erst das Datum der Beiträge geprüft
Gruß: Holger

[Hobby-Programmierer]
  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 06:40 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