Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 如何覆盖TClientDataSet的排序机制_Delphi_Indexing_Delphi Xe2_Tclientdataset - Fatal编程技术网

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