Einzelnen Beitrag anzeigen

DieHardMan

Registriert seit: 16. Jul 2002
Ort: Stuttgart
68 Beiträge
 
#1

ListView Duplikate löschen

  Alt 15. Feb 2006, 23:07
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...
  Mit Zitat antworten Zitat