BETA

TStringGrid Row変更時のバグ?

投稿日:2019-06-18
最終更新:2019-06-18

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

使用バージョン: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当てるのが正解なのだろうが、時間も知識もないのでとりあえずこれで凌ぐ。

技術ブログをはじめよう Qrunch(クランチ)は、プログラマの技術アプトプットに特化したブログサービスです
駆け出しエンジニアからエキスパートまで全ての方々のアウトプットを歓迎しております!
or 外部アカウントで 登録 / ログイン する
クランチについてもっと詳しく

この記事が掲載されているブログ

@maccyoの技術ブログ(予定) C#/VB.NET/Kotlin/Delphi

よく一緒に読まれる記事

0件のコメント

ブログ開設 or ログイン してコメントを送ってみよう
目次をみる
技術ブログをはじめよう Qrunch(クランチ)は、プログラマの技術アプトプットに特化したブログサービスです
or 外部アカウントではじめる
10秒で技術ブログが作れます!