Не удаляет все нужные строки из TStringGrid Delphi11

Работает но удаляет не все что нужно. Необходимо удалить записи старше 2х лет. Дата указана в MaskEdit. Процедура удаления:

    var i,j:integer;
    begin
      with SG do
      begin
        if ARow=RowCount-1 then
        RowCount:=RowCount-1
        else begin
          for i := ARow+1 to RowCount-1 do
            for j := 0 to ColCOunt-1 do
              Cells[j,i-1]:=Cells[j,i];
            RowCount:=RowCount-1;
        end;
      end;
    end; 

Проверка условия:

procedure TForm2.N21Click(Sender: TObject);
//удалить записи старше 2-х лет
var x:string;
ARow,n,The_J:integer;
begin
The_J:=1;
n:=Stringgrid1.RowCount;
while The_J<n do
  begin
  n:=Stringgrid1.RowCount;
  x:=copy(Stringgrid1.Cells[4,The_J],7,2);
  if strtoint(x)<21 then
    begin
       DeleteRow(Stringgrid1,The_J);
    end;
  The_J:=The_J+1;
  end;
end;

До выполнения: До выполнения кода После: После выполнения кода Еще раз после: Конечное


Ответы (1 шт):

Автор решения: Владимир Клыков
//количество строк меняется во время выполнения цикла, нельзя снять значение до начала и использовать, нужно проверять текущее значение а не значение на момент старта
while The_J<Stringgrid1.RowCount do
....
  if strtoint(x)<21 then
    DeleteRow(Stringgrid1,The_J);
  else
    The_J:=The_J+1;  // смещать курсор нужно только если не было сдвига элементов удалением. 
→ Ссылка