【问题标题】:When should I use VirtualTree's BeginSynch vs BeginUpdate?我什么时候应该使用 VirtualTree 的 BeginSynch 和 BeginUpdate?
【发布时间】:2019-09-04 04:21:56
【问题描述】:

自 1 年以来,我们就开始在 Delphi7 中使用 VirtualTreeView v5.5.3 并且喜欢它!

我们想充分发挥组件的潜力,但帮助文件中只有很少的关于BeginSynch 方法的信息。

BeginUpdate + EndUpdate相比,什么时候应该使用BeginSynch + EndSynch

哪个应该嵌套到另一个中?

在什么情况下可以使用哪些方法? (Sort, ScrollIntoView, MoveTo, NodeHeight, isVisible[], ... ) 在绘画之前对操作进行分组以加速应用程序?

【问题讨论】:

  • 来自docs: 与 BeginUpdate 类似,BeginSynch 提供了一种将某些事件纳入公共线路的机制。这意味着,只要您需要确保在树中的修改完成之前调用更改事件(例如,更改焦点或选择时),请使用以 BeginSynch 开始(并以 EndSynch 停止)的同步模式。 所以,据我了解,BeginSynch = BeginUpdate + 一些特殊的活动组织工作,所以简单的 BeginUpdate 应该更快。

标签: delphi virtualtreeview


【解决方案1】:

据我了解,它们有不同的、几乎相反的目的,对于您的用例,您需要BeginUpdate

BeginUpdate 通常在您想要进行 很多 更新时调用,并且您不希望在此过程中发生重绘等。许多控件,包括 TListBox 和 TDBGrid,都有这种可能来加速批量更新。

BeginSynch 与事件有关,尤其是 OnChange 事件。当您将 ChangeDelay 属性设置为高于 0 的值时,VirtualTreeView 可以触发 OnChange 事件,但会有一些延迟。 这也意味着您可能会错过一些活动。如果您快速连续进行两次更改,您可能只会获得一个事件,或者您可能会比预期更晚获得该事件。 BeginSynch 将启动同步模式,在进行更改后立即触发 OnChange 事件(同步),覆盖 ChangeDelay 属性。启动此同步模式比保存 ChangeDelay 属性的值并在之后恢复它更容易。

因此,在某种程度上,您可以说 BeginUpdate 和 BeginSync 在速度方面几乎是相反的,但实际上这只是您的用例。对于您的情况(“分组操作”),您肯定会使用BeginUpdate

BeginSynch 上的文档在这方面可能会更清楚一些。它引用 BeginUpdate 是因为它是一种类似的机制(进入某种更新模式,具有相关的 EndSomething 方法),而实际上它应该引用与其功能相关的 ChangeDelay。有趣的是,文档底部的“发送反馈”链接实际上并不是一个链接......

【讨论】:

  • "BeginSynch 将启动一个同步模式,在进行更改之后(同步)立即触发 OnChange 事件,覆盖 ChangeDelay 属性。"
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-09-07
  • 2012-09-22
  • 1970-01-01
  • 2015-12-05
  • 2012-12-23
  • 2021-07-13
  • 1970-01-01
相关资源
最近更新 更多