Delphi 如何覆盖TClientDataSet的排序机制
是否可以更改在Delphi 如何覆盖TClientDataSet的排序机制,delphi,indexing,delphi-xe2,tclientdataset,Delphi,Indexing,Delphi Xe2,Tclientdataset,是否可以更改在TClientDataSet中使用索引对记录进行排序的方式?阅读之后,我认为能够在客户机数据集中对字符串字段进行逻辑排序会很好。但我不知道在索引方面如何覆盖客户机数据集的默认行为。有什么想法吗 PS:我的CD没有链接到任何提供商。我正在寻找一种方法来修改TClientDataSet(或实现该机制的父级)本身的排序机制。我将尝试使用一条SQL语句来实现所需的排序,该语句为ClientDataSet提供数据 例如,如果我在FieldN中处理以下字符串 a_1 a_20 a_10 a_2
TClientDataSet
中使用索引对记录进行排序的方式?阅读之后,我认为能够在客户机数据集中对字符串字段进行逻辑排序会很好。但我不知道在索引方面如何覆盖客户机数据集的默认行为。有什么想法吗
PS:我的CD没有链接到任何提供商。我正在寻找一种方法来修改
TClientDataSet
(或实现该机制的父级)本身的排序机制。我将尝试使用一条SQL语句来实现所需的排序,该语句为ClientDataSet提供数据
例如,如果我在FieldN中处理以下字符串
a_1
a_20
a_10
a_2
我想让它们像这样分类(我想这与你所说的逻辑相似)
然后我将编写SQL作为
SELECT FieldA,
FieldB,
... ,
FieldN,
CAST(SUBSTRING(FieldN, 3, 2) TO INTEGER) As FieldM '<== pseudocode
FROM TableA
ORDER BY FieldM
选择FieldA,
FieldB,
... ,
菲尔登,
CAST(将子字符串(FieldN,3,2)转换为整数)作为FieldM'阅读优秀的在线文章索引
它解释了如何使用排序和索引的各种方法,以及
编辑:回复您的评论
您不能重写中的排序方法,但可以添加以下内容:
如果要对现有字段以外的任何字段执行自定义排序,则必须添加一个,在事件中执行某种顺序计算,然后将该字段添加到索引defs
除非重写Midas的相应部分,否则无法覆盖ClientDataSet的排序机制
为了实现正确的排序(无论采用何种逻辑方法),您可以引入一个新字段并设置其值,这样,使用标准机制进行排序后,它们将给出所需的排序顺序。我的CD是内存中的数据集。计算机上的所有数据都在内存中,您的CD有什么特别之处?:-)ClientDataSet无法执行SQL。@我知道!我建议他使用SQL来feed
CD。我认为有些查询组件具有内置CD。无论如何,OP似乎下定决心要解决他的确切问题,不一定是逻辑排序的问题。@Sam My CD中充满了来自串行端口的数据,而不是来自RDBMSI的数据。我读过这篇文章。我希望重写根据当前索引比较和定位记录的实际方法。我还有一个关于使用计算字段和索引的问题。到目前为止,我无法在索引中使用内部计算字段:嗯,这太糟糕了。我以为我以前做过类似的事情,但我已经记不起这个项目了。对不起。你能上传一个小的(仅代码)示例到类似的东西上吗?我可能会在本周晚些时候对此进行研究。上传示例时在此处发表评论。我有一个项目正在运行,其中fkInternalCalc字段和IndexName设置为该字段。它不适用于计算字段,因为处理索引的midas实现看不到这些字段。是否向用户显示CD中的数据?如果是,您正在使用哪个组件?大多数Grid和ListView类型的组件允许您实现自定义排序,因此,如果CD没有您需要的内容,您可以尝试改用它。@LightBulb我使用的是JvDBGrid。midas.obj源可用吗?如果源代码可用并且许可协议允许对其进行修改,我非常愿意更改相应的部分。c:\Program Files(x86)\Embarcadero\RAD Studio\9.0\source\data\dsnap\midas\我的XE2安装文件夹中没有提到的文件夹:-(自2010年起,专业版和更高版本中就包含了midas源代码。如果您没有修改设置,应该安装它。我将尝试重新安装XE2
SELECT FieldA,
FieldB,
... ,
FieldN,
CAST(SUBSTRING(FieldN, 3, 2) TO INTEGER) As FieldM '<== pseudocode
FROM TableA
ORDER BY FieldM