![]() |
ListView Duplikate löschen
Wie kann ich in einer ListView mehrfach vorhandene Items mit gleichem Inhalt löschen? Dabei soll immer das oberste Item sowie die Originalsortierung erhalten bleiben. Habe schon zwei Versuche unternommen das hinzubekommen aber irgendwie wills nicht. Das Problem ist es dabei mehrfach vorhande Duplikate zu berücksichtigen, also:
Item0: Heute ist Montag Item1: Heute ist Dienstag Item2: Heute ist Dienstag Item3: Heute ist Mittwoch Item4: Heute ist Donnerstag Item5: Heute ist Donnerstag Item6: Heute ist Donnerstag Item7: Heute ist Freitag Es sollen also Item 2, 5 und 6 gelöscht werden.
Delphi-Quellcode:
var
i, a: Integer; FirstString, SecondString: String; DoubleItems: TStringList; begin DoubleItems := TStringList.Create; DoubleItems.Sorted := True; DoubleItems.Duplicates := dupIgnore; For i := 0 to lstRSSData.Items.Count - 1 do begin FirstString := AnsiLowerCase(lstRSSData.Items.Item[i].SubItems.Strings[3]); For a := i to lstRSSData.Items.Count - 1 do If a <> i then begin SecondString := AnsiLowerCase(lstRSSData.Items.Item[a].SubItems.Strings[3]); If FirstString = SecondString then begin DoubleItems.Add(IntToStr(a)); DoubleItems.Add(IntToStr(i)); ShowMessage('Duplicate text found!' + #13#10#13#10 + 'i' + IntToStr(i) + ': ' + #13#10 + lstRSSData.Items.Item[i].SubItems.Strings[2] + #13#10#13#10 + 'a' + IntToStr(a) + ': ' + #13#10 + lstRSSData.Items.Item[a].SubItems.Strings[2]); end; end; // a end; // i If DoubleItems.Count > 0 then begin DoubleItems.Sorted := False; DoubleItems.CustomSort(CompareInt); // Integer Sort DoubleItems.Delete(0); // Delete First Entry For i := DoubleItems.Count - 1 downto 0 do begin // ShowMessage(DoubleItems.Strings[i]); // lstRSSData.Items.Delete(StrToInt(DoubleItems.Strings[i])); end; end; DoubleItems.Free; end;
Delphi-Quellcode:
var
stl: TStringList; i, temp: integer; begin stl := TStringList.Create; stl.sorted := true; // stl.duplicates := dupError; stl.duplicates := dupIgnore; for i := lstRSSData.Items.Count - 1 downto 0 do begin { try stl.add(AnsiLowerCase(lstRSSData.Items.Item[i].SubItems.Strings[3])); except on E: EStringListError do begin lstRSSData.Items.Delete(i); end; end; // try } temp := stl.Count; stl.add(AnsiLowerCase(lstRSSData.Items.Item[i].SubItems.Strings[3])); if stl.Count = temp then begin lstRSSData.Items.Delete(i); end; end; stl.Free; |
Re: ListView Duplikate löschen
hi, ich hoffe das hilft dir als Ansatzt :roll:
Delphi-Quellcode:
procedure DeleteDoubles(lv: TListView; SubItem: integer = -1);
var li1 : TListItem; li2 : TListItem; x : integer; y : integer; begin if lv.Items.Count < 1 then Exit; lv.Items.BeginUpdate; x := 0; while x <= lv.Items.Count - 1 do begin li1 := lv.Items[x]; y := x + 1; while y <= lv.Items.Count - 1 do begin li2 := lv.Items[y]; if SubItem > -1 then begin if AnsiSameText(li1.SubItems[SubItem], li2.SubItems[SubItem]) then li2.Delete; end else begin if AnsiSameText(li1.Caption, li2.Caption) then li2.Delete; end; inc(y); end; inc(x); end; lv.Items.EndUpdate; end; |
Re: ListView Duplikate löschen
Funzt perfekt, danke.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:57 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 by Thomas Breitkreuz