什么时候应该使用VirtualTree的BeginSynch和BeginUpdate?

10

我们从一年前开始在Delphi7中使用VirtualTreeView v5.5.3,并且非常喜欢它!

我们想要充分利用该组件的全部功能,但是帮助文件中关于BeginSynch方法的信息很少。

相比于BeginUpdate + EndUpdate,应该在什么情况下使用BeginSynch + EndSynch

其中一个应该嵌套到另一个里面吗?

为了加速应用程序,在绘制之前可以使用哪些方法(例如SortScrollIntoViewMoveToNodeHeightisVisible[]等)对操作进行分组?


docs类似于BeginUpdate,BeginSynch提供了一种将某些事件带入公共线的机制。这意味着,每当您需要确保在树的修改完成之前调用更改事件(例如更改焦点或选择)时,请使用以BeginSynch开始的同步模式(并使用EndSynch停止)。因此,根据我的理解,BeginSynch = BeginUpdate + 一些特殊的事件组织工作,因此简单的BeginUpdate应该更快。 - zed
1个回答

9
据我理解,它们有不同的、几乎相反的用途,对于您的使用情况,您需要使用 BeginUpdate
通常在你要进行大量更新时,并且你不希望在此过程中发生重绘等操作时,会调用BeginUpdate。许多控件,包括 TListBox 和 TDBGrid,都可以加速批量更新。 BeginSynch 与事件有关,特别是 OnChange 事件。当将ChangeDelay 属性设置为大于 0 的值时,VirtualTreeView 可以延迟触发 OnChange 事件。这也意味着您可能会错过一些事件。如果您快速连续做出两次更改,您可能只会得到一个事件,或者您可能会在所需时间之后才会收到该事件。BeginSynch 将启动同步模式,在进行更改后立即(与之同步)触发 OnChange 事件,覆盖 ChangeDelay 属性。开始此同步模式比保存 ChangeDelay 属性的值并在之后恢复它更容易。
因此,在某种程度上,你可以说 BeginUpdate 和 BeginSynch 在速度方面几乎是相反的,但实际上这只是关于你的使用情况而已。对于您的情况 ("grouping manipulations"),您一定会使用 BeginUpdate
在这方面,BeginSynch 的文档可能需要更加清晰。它提到 BeginUpdate,因为它是一种类似的机制(进入某种更新模式,具有相应的 EndSomething 方法),而实际上它应该提到 ChangeDelay,因为它与之功能相关。同时,文档底部的“发送反馈”链接实际上并不是一个链接。

"BeginSynch将启动同步模式,该模式会在更改后立即(与之同步)触发OnChange事件,覆盖ChangeDelay属性。"<<非常好的回答!现在我明白了。谢谢! - SzakiLaci

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接