【问题标题】:Refresh DBGrid during code execution在代码执行期间刷新 DBGrid
【发布时间】:2014-06-10 14:07:35
【问题描述】:

我需要关于以下情况的建议。这些是我的设计设置:

object cdsMonitor: TClientDataSet
  Active = True
  …
  object cdsMonitorSendReceive: TBooleanField
    FieldName = 'SendReceive'
  end
  object cdsMonitorMessage: TStringField
    FieldName = 'Message'
  end
  object cdsMonitorTime: TTimeField
    FieldName = 'Time'
  end
end

object dsMonitor: TDataSource
  DataSet = cdsMonitor
  …
end

object dbgMonitor: TDBGrid
  …  
  DataSource = dsMonitor
  …
end

我正在使用以下代码向数据集添加数据:

cdsMonitor.Append;
cdsMonitorSendReceive.Value := False;
cdsMonitorMessage.Value := Bytes;
cdsMonitorTime.Value := Now;
cdsMonitor.Post;

在应用程序源中有一个函数多次执行上述代码块(在一个循环中)。问题是我没有看到附加的行一一出现,但是有几秒钟我什么也没看到(该函数很耗时),然后所有附加的行同时出现。我不仅希望在代码执行完成时查看结果,而且希望在每个附加行之后刷新 DBGrid,以便我可以实时查看进度。我可以通过添加来实现这一点

Application.ProcessMessages;

到上面的代码块。但是,这会干扰代码执行的正常流程,因为不仅更新了网格,而且还处理了其他消息,这是不可取的。所以这不是我正在寻找的解决方案。还有其他想法吗?

【问题讨论】:

  • YourGrid.DataSource.DataSet.Refresh 不会有帮助吗? [只是猜测]
  • 您是否尝试通过调用循环周围的 cdsMonitor.DisableControls 和 cdsMonitor.EnableControls 来替换您的 Application.ProcessMessages?它不会显示中间更新,但应该明显比没有更新快。
  • @TLama,不,Refresh 不起作用。
  • @moskito-x 是的,我看到了,但直到现在我才有机会尝试。谢谢!这正是我想要的!
  • @Rick77 :很高兴知道它有效。谢谢 :-)

标签: delphi delphi-5


【解决方案1】:

你可以做一个dbgMonitor.Repaint;

cdsMonitor.Append;
cdsMonitorSendReceive.Value := False;
cdsMonitorMessage.Value := Bytes;
cdsMonitorTime.Value := Now;
cdsMonitor.Post;
dbgMonitor.Repaint;

这将做你想要实现的目标

【讨论】:

    猜你喜欢
    • 2014-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-09
    • 1970-01-01
    • 2011-08-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多