我在Delphi XE2中制作了一个简单的应用程序,它特别使用了“Carbon”风格。有一个庞大的字符串网格,有几千行。我有一个循环遍历此网格记录的过程,做一些工作,并在网格中进行一些更改。当流程循环时,当前正在处理的行会突出显示(通过设置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;
当我不使用任何样式时,一切正常。
答案 0 :(得分:2)
如果invalidate和repaint不为您做任何事情,请尝试调整字符串网格的大小:
Grid.Width:= Grid.Width - 1; Grid.Width:= Grid.Width + 1;
尝试使用隐藏和显示滚动条的字符串网格选项。在更新之前隐藏它们并在之后显示它们。也许这将迫使他们重新粉刷。
尝试移动滚动位置并将其移回原始位置。
答案 1 :(得分:2)
这对我有用 - 它强制窗口重新绘制StringGrid的边框区域:
SetWindowPos(Grid.Handle, 0, 0, 0, Grid.Width, Grid.Height, SWP_DRAWFRAME);