Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi ListView Duplikate löschen (https://www.delphipraxis.net/63250-listview-duplikate-loeschen.html)

DieHardMan 15. Feb 2006 23:07


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;

TKC 16. Feb 2006 03:55

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;

DieHardMan 16. Feb 2006 07:24

Re: ListView Duplikate löschen
 
Funzt perfekt, danke.


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:27 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