![]() |
Doppelte Einträge aus ListBox entfernen
Hallo,
ich möchte aus einer ListBox doppelte Einträge entfernen. Ich benutze dazu folgenden Code, den ich hier gefunden habe:
Delphi-Quellcode:
aber beim Ausführen kommt immer der Fehler "Listenindex überschreitet Maximum".
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; Weiß jemand, wo der Fehler liegt (downto sollte das ja eigentlich verhindern)? Danke, ManuMF |
Re: Doppelte Einträge aus ListBox entfernen
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); |
Re: Doppelte Einträge aus ListBox entfernen
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; |
Re: Doppelte Einträge aus ListBox entfernen
SortTstrings(PCListe.Items, dupIgnore);
funktioniert, Danke! :thumb: |
Re: Doppelte Einträge aus ListBox entfernen
Die andere Lösung funktionoiert auch. Ich werde mir mal beide merken.
Aber welche ist besser / schneller? Gruß, ManuMF |
Re: Doppelte Einträge aus ListBox entfernen
Zitat:
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; |
Re: Doppelte Einträge aus ListBox entfernen
Zitat:
![]() |
Re: Doppelte Einträge aus ListBox entfernen
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. |
Re: Doppelte Einträge aus ListBox entfernen
:mrgreen: Wer lesen kann ist klar im Vorteil künftig wird erst das Datum der Beiträge geprüft :wall:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:10 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