【问题标题】:String Grid using Styles in Delphi XE2 - Scroll bar doesn't update在 Delphi XE2 中使用样式的字符串网格 - 滚动条不更新
【发布时间】: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_BEGINMSG_ENDMSG_NEXTMSG_ERROR 等。
  • 您应该有一个线程来完成这项工作,然后在主线程中运行一个计时器以获取 UI 更新。使用虚拟列表视图来显示。带锁的同步可能就足够了。
  • VirtualTreeView 会比 TStringGrid 好得多(在这种情况下作为虚拟网格工作)。

标签: delphi styles scrollbar delphi-xe2 tstringgrid


【解决方案1】:
  1. 如果无效和重绘对您没有任何帮助,请尝试调整字符串网格的大小:

    Grid.Width := Grid.Width - 1; Grid.Width := Grid.Width + 1;

  2. 尝试使用隐藏和显示滚动条的字符串网格选项。在更新之前隐藏它们并在之后显示它们。也许这将迫使他们重新粉刷。

  3. 尝试移动滚动位置并将其移回原始位置。

【讨论】:

  • 谢谢,回到办公室就可以了。 #1 不起作用,因为网格是对齐的 alClient (如果不更改其父级宽度就无法更改宽度)。另外,这似乎是最后的快速修复方法:P 其他的也值得一试。
  • 我在循环期间暂时隐藏了滚动条(#2)。我敢肯定有一个技巧可以让这项工作正常进行。
  • 您可以关闭 alClient(align=alNone 然后 alClient),但这肯定会闪烁。因此,请始终保留 align alNone,并改为设置锚点。该解决方法对 VCL 网格滚动错误特别有用。
【解决方案2】:

这对我有用 - 它强制窗口重新绘制 StringGrid 的边框区域:

SetWindowPos(Grid.Handle, 0, 0, 0, Grid.Width, Grid.Height, SWP_DRAWFRAME);

【讨论】:

    猜你喜欢
    • 2013-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-19
    • 1970-01-01
    相关资源
    最近更新 更多