ListView i duplikaty

0

Witam

Mam sobie 4-kolumnowy ListView posiadający 245 pozycji (liczba ta jest zmienna). Napisałem sobie kod, który wyszukał by mi duplikaty i je usunął:

var
    i, j : Integer;
    Wiersz, Wiersz2 : String;
begin

for i := 0 to ListView1.Items.Count - 2 do
  begin
    Application.ProcessMessages;
    Wiersz := '';

    Wiersz := ListView1.Items[i].Caption + ListView1.Items[i].SubItems[0] + ListView1.Items[i].SubItems[1] + ListView1.Items[i].SubItems[2];
    Wiersz := Trim(Wiersz);

    for j := ListView1.Items.Count - 1 downto i + 1 do
      begin
        Wiersz2 := '';
        
        Wiersz2 := ListView1.Items[j].Caption + ListView1.Items[j].SubItems[0] + ListView1.Items[j].SubItems[1] + ListView1.Items[j].SubItems[2];
        Wiersz2 := Trim(Wiersz2);

        if AnsiUpperCase(Wiersz) = AnsiUpperCase(Wiersz2) then
          begin
            ListView1.Items.Delete(j);
           end;
      end;
 end;
end;

W sumie działa (duplikatów jest 25), ale gdy dochodzi do końca listy (220 pozycja) program wywala błąd i nie wiem czym to jest spowodowane.

Czy mógłby mi ktoś pomóc w rozwiązaniu tego problemu?

//Do postu poniżej
Pojawia się okienko z taką oto treścią:

Project Project1.exe raised exception class EAccessViolation with message 'Access violation at address 00484362 in module 'Project1.exe'. Read address 00000008'. Process stopped. Use Step or Run to continue.

A następnie (po kliknięciu OK) w kodzie wskazywana jest linia:

Wiersz := ListView1.Items[i].Caption + ListView1.Items[i].SubItems[0] + ListView1.Items[i].SubItems[1] + ListView1.Items[i].SubItems[2];
0

podaj tresc komunikatu.

0

nie daje głowy, ale jak usuwasz coś z listy to jej rozmiar sie zmienia, a pętla pod koniec probóje się odwołać do nie istniejących elementów?

0

przy takich działaniach ZAWSZE musisz główną pętlą lecieć od końca listy ponieważ warunki brzegowe wyliczane są tylko raz, przy wejściu do pętli (mowa o for). Ew zamiast for użyj while

1 użytkowników online, w tym zalogowanych: 0, gości: 1