如何覆盖TClientDataSet的排序机制

时间:2013-07-29 10:26:48

标签: delphi indexing delphi-xe2 tclientdataset

是否可以更改TClientDataSet中用于排序记录的索引的方式?阅读this question之后,我认为能够在客户端数据集中对字符串字段进行逻辑排序会很不错。但是我不知道如何在索引时覆盖客户端数据集的默认行为。有什么想法吗?

PS:我的CDS未链接到任何提供商。我正在寻找一种方法来修改TClientDataSet(或实现机制的父级)本身的排序机制。

3 个答案:

答案 0 :(得分:5)

您不能覆盖ClientDataSet的排序机制 - 除非您重写Midas的相应部分。

要实现正确的排序(无论逻辑意味着什么),您可以引入一个新字段并以某种方式设置其值,以便使用标准机制排序,它们将提供所需的排序顺序。

答案 1 :(得分:2)

Understanding ClientDataSet阅读优秀的在线文章Cary Jensen索引。

它解释了如何使用IndexDefsIndexFieldNamesIndexName使用各种排序和索引方法。

修改:回复您的评论。

您无法覆盖TClientDataSet中的排序方法,但可以添加:

如果您想对除现有字段之外的任何内容进行自定义排序,则必须添加Calculated Field,在OnCalcFields事件中执行一种订单计算,然后将该字段添加到IndexDefs

答案 2 :(得分:1)

我会尝试使用提供ClientDataSet的SQL语句来实现所需的排序。

例如,如果我在FieldN中处理以下字符串

a_1
a_20
a_10
a_2

我希望它们像这样排序(我假设这类似于你的意思逻辑

a_1
a_2
a_10
a_20

然后我会把SQL写成

SELECT     FieldA, 
           FieldB, 
           ... ,
           FieldN,
           CAST(SUBSTRING(FieldN, 3, 2) TO INTEGER) As FieldM '<== pseudocode
FROM       TableA
ORDER BY   FieldM

SubString和Cast to Integer操作的确切语法取决于您使用的DBMS。