【问题标题】:How to override sort mechanism of TClientDataSet如何覆盖 TClientDataSet 的排序机制
【发布时间】:2013-07-29 02:25:46
【问题描述】:

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

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

【问题讨论】:

  • 您是否正在向用户显示来自 CDS 的数据?如果是这样,您使用的是哪个组件?大多数 Grid 和 ListView 类型的组件都允许您实现自定义排序,因此,如果 CDS 没有您需要的功能,您可以尝试使用它。
  • @LightBulb 我正在使用 JvDBGrid。

标签: delphi indexing delphi-xe2 tclientdataset


【解决方案1】:

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

要实现正确的排序(无论逻辑是什么意思),您可以引入一个新字段并设置其值,以便使用标准机制进行排序时,它们将给出所需的排序顺序。

【讨论】:

  • midas.obj 源是否可用?如果源代码可用并且许可协议允许对其进行修改,我非常愿意更改它的相应部分。
  • c:\Program Files (x86)\Embarcadero\RAD Studio\9.0\source\data\dsnap\midas\
  • 我的 XE2 安装文件夹中没有提到的文件夹。 :-(
  • Midas 来源自 D2010 起包含在 Professional 及更高版本中。如果您还没有摆弄设置,则应该安装它。
  • 我会尝试重新安装我的 XE2
【解决方案2】:

阅读优秀的在线文章Understanding ClientDataSet Indexes by Cary Jensen

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

编辑:回复您的评论。

您不能覆盖TClientDataSet 中的排序方法,但您可以添加这样做:

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

【讨论】:

  • 我已经阅读了这篇文章。我希望覆盖根据当前索引比较和定位记录的实际方法。类似docwiki.embarcadero.com/Libraries/XE4/en/…
  • 我还有一个关于使用计算字段和索引的问题。到目前为止,我一直无法在索引中使用内部计算字段:stackoverflow.com/questions/17896329/…
  • 嗯,这太糟糕了。我以为我过去做过类似的事情,但我不记得这个项目了。对此感到抱歉。您能否将一个小的(仅代码)示例上传到 gist.github.com 之类的东西,然后我可能会在本周晚些时候对此进行调查。上传示例时在此处发表评论。
  • 我有一个使用 fkInternalCalc 字段和 IndexName 设置的项目运行。它不适用于 fkCalculated 字段,因为处理索引的 midas 实现看不到这些字段。
【解决方案3】:

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

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

a_1
a_20
a_10
a_2

我希望它们像这样排序(我认为这类似于你所说的 logically

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。

【讨论】:

  • 我的 CDS 是一个内存中数据集。
  • 计算机上的所有数据都在内存中,您的 CDS 有什么特别之处? :-)
  • ClientDataSet 无法执行 SQL。
  • @UweRaabe 我知道!我建议他使用 SQL 来feed CDS。我认为有些查询组件具有内置的 CDS。无论如何,OP似乎下定决心要解决他的确切问题,不一定是逻辑排序问题。
  • @Sam 我的 CDS 中充满了来自串行端口而非 RDBMS 的数据
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-09-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-29
  • 1970-01-01
  • 2018-09-27
相关资源
最近更新 更多