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;
Alle meine Entchen...