TStringGrid Row変更時のバグ?

こいつのせいで時間を吸われたので備忘録として。

使用バージョン:10.2 Update3

内容

AndroidでTStringGrid利用時、行数変更を伴う更新を行うと更新時にアプリが突然死する。

再現コード

procedure TForm1.Button1Click(Sender: TObject);  
begin  
  StringGrid1.BeginUpdate();  
  SetValue(1);  
  StringGrid1.EndUpdate();  
end;  

procedure TForm1.Button2Click(Sender: TObject);  
begin  
  StringGrid1.BeginUpdate();  
  SetValue(100);  
  StringGrid1.EndUpdate();  
end;  

procedure TForm1.SetValue(rowSize: Integer);  
var  
  rowIndex: Integer;  
begin  
  // リセット  
  StringGrid1.RowCount := 0;  

  StringGrid1.RowCount := rowSize;  
  for rowIndex := 0 to rowSize - 1 do  
  begin  
    StringGrid1.Cells[0, rowIndex] := rowIndex.ToString();  
  end;  
end;  

上記コードで、Button2をクリック(RowCount = 100)にし、下にスクロールした状態でButton1を押す(RowCount=1)とアプリが落ちる。

原因?

行数を更新した際、元のスクロール位置を保とうとするが、行数が減って本来の範囲外の位置に来るとエラー落ちする。

応急処置

BeginUpdateの前にスクロール位置を初期化する。

procedure TForm1.Button1Click(Sender: TObject);  
begin  
  StringGrid1.TopRow := 0;  
  StringGrid1.LeftColumn := 0;  
  StringGrid1.BeginUpdate();  
  SetValue(1);  
  StringGrid1.EndUpdate();  
end;  

procedure TForm1.Button2Click(Sender: TObject);  
begin  
  StringGrid1.TopRow := 0;  
  StringGrid1.LeftColumn := 0;  
  StringGrid1.BeginUpdate();  
  SetValue(100);  
  StringGrid1.EndUpdate();  
end;  

procedure TForm1.SetValue(rowSize: Integer);  
var  
  rowIndex: Integer;  
begin  
  // リセット  
  StringGrid1.RowCount := 0;  

  StringGrid1.RowCount := rowSize;  

  for rowIndex := 0 to rowSize - 1 do  
  begin  
    StringGrid1.Cells[0, rowIndex] := rowIndex.ToString();  
  end;  
end;  

まとめ

Windows版は発生しない上にBeginUpdateEndUpdateを入れているせいか、TryExceptを使っても捕まらなかったので発見がめちゃくちゃ遅れた。
最新版(10.3)は利用していないのでこのバグが治っているかは不明。(バグなのか仕様なのか... Windows版だとエラー落ちしないのでバグだとは思うが。)

本来であればソースコードにHelper当てるのが正解なのだろうが、時間も知識もないのでとりあえずこれで凌ぐ。