在Delphi XE2中使用样式的字符串网格-滚动条不';t更新

在Delphi XE2中使用样式的字符串网格-滚动条不';t更新,delphi,styles,scrollbar,delphi-xe2,tstringgrid,Delphi,Styles,Scrollbar,Delphi Xe2,Tstringgrid,我正在Delphi XE2中制作一个简单的应用程序,它特别使用“Carbon”风格。有一个大的字符串网格,它有数千行。我有一个流程,它循环这个网格的记录,做一些工作,并在网格中进行一些更改。当流程循环时,当前正在处理的行将高亮显示(通过设置TStringGrid.row) 问题是,当我将样式应用于此网格时,滚动条不会随着行的更改而更改位置。循环确实会在处理每一行时正确地高亮显示它,但当它接近列表的末尾时,右侧的滚动条仍然位于顶部 如何使网格的滚动条随之移动 以下是我如何循环的示例: proced

我正在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;
当我不使用任何样式时,一切都很好

  • 如果无效和重新绘制对您没有任何帮助,请尝试调整字符串网格的大小:

    网格宽度:=网格宽度-1; 网格宽度:=网格宽度+1

  • 尝试使用隐藏和显示滚动条的字符串网格选项。更新前隐藏它们,更新后显示它们。也许这会迫使他们重新油漆

  • 尝试移动滚动位置并将其移回原始位置

  • 如果无效和重新绘制对您没有任何帮助,请尝试调整字符串网格的大小:

    网格宽度:=网格宽度-1; 网格宽度:=网格宽度+1

  • 尝试使用隐藏和显示滚动条的字符串网格选项。更新前隐藏它们,更新后显示它们。也许这会迫使他们重新油漆

  • 尝试移动滚动位置并将其移回原始位置


  • 这对我很有效-它强制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好得多。