"Carbon"スタイルを使用する単純なアプリケーションをDelphi XE2で作成しています。何千もの行を持つ大きな文字列グリッドがあります。私は、このグリッドのレコードをループし、いくつかの作業を行い、グリッドにいくつかの変更を加えるプロセスを持っています。プロセスがループすると、現在処理中の行がハイライト表示されます(TStringGrid.Row
を設定します)。Delphi XE2でスタイルを使用している文字列グリッド - スクロールバーが更新されない
このグリッドにスタイルを適用すると、行が変更されてもスクロールバーの位置は変わりません。ループは処理されている間に各行を適切に強調表示しますが、リストの末尾に達するまでには、右のスクロールバーは一番上にあります。
グリッドのスクロールバーを移動するにはどうすればよいですか?
は、ここで私がループしてるかのサンプルです:私は、任意のスタイルを使用していないとき
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;
すべてがうまく動作します。
Grid.Width:無効化と再描画があなたのために何もしない場合
これは私にはバグのように聞こえます。 Invalidateはペイントサイクルを強制する方法です。私はバックグラウンドで処理を行い、UIを更新するためにバーチャルコントロール(例えばバーチャルモードのリストビュー)を使う傾向があると思う。タイマーでUIを更新します(例:一秒ごと。 –
とにかくスレッド内の各アイテムを処理するように変換して、さまざまなイベントのメッセージを入れています。私は 'MSG_BEGIN'、' MSG_END'、 'MSG_NEXT'、' MSG_ERROR'などを持っています。 –
作業を行い、メインスレッドでタイマーを実行してUIアップデートを取得するスレッドが必要です。仮想リストビューを使用して表示します。おそらくロック付きの同期化で十分です。 –