在Delphi XE2中使用样式的字符串网格-滚动条不';t更新
我正在Delphi XE2中制作一个简单的应用程序,它特别使用“Carbon”风格。有一个大的字符串网格,它有数千行。我有一个流程,它循环这个网格的记录,做一些工作,并在网格中进行一些更改。当流程循环时,当前正在处理的行将高亮显示(通过设置在Delphi XE2中使用样式的字符串网格-滚动条不';t更新,delphi,styles,scrollbar,delphi-xe2,tstringgrid,Delphi,Styles,Scrollbar,Delphi Xe2,Tstringgrid,我正在Delphi XE2中制作一个简单的应用程序,它特别使用“Carbon”风格。有一个大的字符串网格,它有数千行。我有一个流程,它循环这个网格的记录,做一些工作,并在网格中进行一些更改。当流程循环时,当前正在处理的行将高亮显示(通过设置TStringGrid.row) 问题是,当我将样式应用于此网格时,滚动条不会随着行的更改而更改位置。循环确实会在处理每一行时正确地高亮显示它,但当它接近列表的末尾时,右侧的滚动条仍然位于顶部 如何使网格的滚动条随之移动 以下是我如何循环的示例: proced
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;
当我不使用任何样式时,一切都很好
这对我很有效-它强制windows重新绘制StringGrid的边界区域:
SetWindowPos(Grid.Handle, 0, 0, 0, Grid.Width, Grid.Height, SWP_DRAWFRAME);
这对我很有效-它强制windows重新绘制StringGrid的边界区域:
SetWindowPos(Grid.Handle, 0, 0, 0, Grid.Width, Grid.Height, SWP_DRAWFRAME);
谢谢,回到办公室就可以了#1将不起作用,因为网格已对齐alClient(如果不更改其父对象的宽度,则无法更改宽度)。另外,这似乎是最后的解决办法:P其他的都值得一试。我在循环过程中暂时隐藏了滚动条(#2)。我相信有一个诀窍可以让它正常工作。你可以关闭alClient(align=alNone,然后是alClient),但它肯定会闪烁。因此,请将“始终对齐”保留为“无”,并设置锚定。该解决方案对于VCL网格滚动错误特别有用。谢谢,回到办公室后就可以了#1将不起作用,因为网格已对齐alClient(如果不更改其父对象的宽度,则无法更改宽度)。另外,这似乎是最后的解决办法:P其他的都值得一试。我在循环过程中暂时隐藏了滚动条(#2)。我相信有一个诀窍可以让它正常工作。你可以关闭alClient(align=alNone,然后是alClient),但它肯定会闪烁。因此,请将“始终对齐”保留为“无”,并设置锚定。这个解决方法对于VCL网格滚动bug特别有用。这听起来像个bug<代码>无效是强制绘制循环的方法。我想我倾向于在后台进行处理,并使用虚拟控件(例如,虚拟模式下的列表视图)来更新UI。在计时器上更新UI,例如每秒更新一次。我正在将其转换为处理线程中的每个项目,并为各种事件放置消息。我可以有一个
MSG_BEGIN
,MSG_END
,MSG_NEXT
,MSG_ERROR
等。您应该有一个线程来完成这项工作,然后在主线程中运行计时器以获得UI更新。使用虚拟列表视图来显示。使用锁进行同步可能就足够了。VirtualTreeView(在本例中用作虚拟网格)比TStringGrid好得多。这听起来像个bug<代码>无效是强制绘制循环的方法。我想我倾向于在后台进行处理,并使用虚拟控件(例如,虚拟模式下的列表视图)来更新UI。在计时器上更新UI,例如每秒更新一次。我正在将其转换为处理线程中的每个项目,并为各种事件放置消息。我可以有一个MSG_BEGIN
,MSG_END
,MSG_NEXT
,MSG_ERROR
等。您应该有一个线程来完成这项工作,然后在主线程中运行计时器以获得UI更新。使用虚拟列表视图来显示。使用锁进行同步可能就足够了。VirtualTreeView(在本例中用作虚拟网格)比TStringGrid好得多。