【发布时间】:2012-02-11 16:02:28
【问题描述】:
我正在 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;
当我不使用任何样式时,一切正常。
【问题讨论】:
-
这对我来说听起来像是一个错误。
Invalidate是强制绘制周期的方法。我想我倾向于在后台进行处理并使用虚拟控件(例如虚拟模式下的列表视图)来更新 UI。在计时器上更新 UI,例如每一秒。 -
无论如何,我都将其转换为处理线程中的每个项目,并为各种事件发送消息。我可以拥有一个
MSG_BEGIN、MSG_END、MSG_NEXT、MSG_ERROR等。 -
您应该有一个线程来完成这项工作,然后在主线程中运行一个计时器以获取 UI 更新。使用虚拟列表视图来显示。带锁的同步可能就足够了。
-
VirtualTreeView 会比 TStringGrid 好得多(在这种情况下作为虚拟网格工作)。
标签: delphi styles scrollbar delphi-xe2 tstringgrid