2

特に「カーボン」スタイルを使用するDelphi XE2で簡単なアプリケーションを作成しています。何千行もある大きな String Grid があります。このグリッドのレコードをループし、いくつかの作業を行い、グリッドにいくつかの変更を加えるプロセスがあります。プロセスがループすると、現在処理中の行が強調表示されます (設定によりTStringGrid.Row)。

問題は、このグリッドにスタイルを適用すると、行が変更されてもスクロール バーの位置が変わらないことです。ループは処理中に各行を適切に強調表示しますが、リストの最後に近づくまでに、右側のスクロール バーはまだ一番上にあります。

グリッドのスクロール バーを一緒に移動させるにはどうすればよいですか?

これが私がループしている方法のサンプルです:

procedure TForm1.Button1Click(Sender: TObject);
var
  X: Integer;
begin
  FStop:= False;
  for X:= 1 to Grid.RowCount - 1 do begin
    if FStop then Break; //Ability to stop loop
    Grid.Row:= X; //Highlight current row
    DoSomeLenghyWork;
    ChangeSomethingOnGrid;
    Application.ProcessMessages; //Keep program responding
  end;
end;

スタイルを使用していないときは、すべて正常に機能します。

4

2 に答える 2

2
  1. 無効化して再描画しても何も起こらない場合は、文字列グリッドのサイズを変更してみてください。

    Grid.Width := Grid.Width - 1; Grid.Width := Grid.Width + 1;

  2. スクロールバーの表示と非表示を切り替える文字列グリッド オプションを試してみてください。更新する前に非表示にし、更新後に表示します。おそらくそれは彼らに再塗装を強いるでしょう。

  3. スクロール位置をずらして元の位置に戻してみてください。

于 2012-02-11T19:17:14.060 に答える
2

これは私にとってはうまくいきました-ウィンドウにStringGridの境界領域を強制的に再描画させます:

SetWindowPos(Grid.Handle, 0, 0, 0, Grid.Width, Grid.Height, SWP_DRAWFRAME);
于 2013-02-28T20:50:25.500 に答える