VST实例(11) 排序

发布时间 2023-05-31 11:02:56作者: Luo大哥

VST.sort和vst.sorttree可以对VST进行排序。

procedure Sort(Node: PVirtualNode; Column: TColumnIndex; Direction: TSortDirection; DoInit: Boolean = True); virtual;

Sort方法对节点的子节点进行排序。应用程序通过OnCompareNodes事件来确定如何进行排序。Column参数仅传递给比较函数,因此应用程序也可以按特定列进行排序。为了使应用程序免于关注排序方向,使用Direction参数。这样,应用程序总是可以将节点按升序进行比较,而Sort方法会根据此标志重新排序节点。

procedure SortTree(Column: TColumnIndex; Direction: TSortDirection; DoInit: Boolean = True); virtual;

这个方法用来对整个VST进行排序,如果节点数量非常庞大,此方法初始化树中的所有节点,这可能需要相当长的时间,而且违反了虚拟范例,因此通常不建议使用。

参数Column是一个整数。

而参数Direction表示排序方向,有两个值:

sdAscending:升序

sdDescending:降序

Herder.options如果包含“hoHeaderClickAutoSort”,则在单机标题时会进行排序。

Herder.options如果包含“hoShowSortGlyphs”,则将在点击header进行排序时,会显示一个三角标志,指示是升序还是降序。

最后,我们开始讲讲怎么排序吧。我们要让VST进行排序,需要在事件“OnCompareNodes”中写代码,让VST知道该怎么进行排序。

procedure TForm2.vstCompareNodes(Sender: TBaseVirtualTree; Node1,
  Node2: PVirtualNode; Column: TColumnIndex; var Result: Integer);
begin
   Result:=CompareStr(vst.Text[node1,column],vst.Text[node2,Column]);
end;

本程序中作为示例仅仅使用了文本排序,这种排序肯定是不合理的,例如:“2”会大于“111”,实际应用中你肯定会采用更复杂的排序方式。不管你采用什么排序方式,result的结果都应该是-1,0,或1。