Delphi 2009 - clientdataset最近发现

时间:2014-01-07 22:37:03

标签: delphi delphi-2009 dbgrid

我遇到clientdatasetfindnearest方法的问题。

我在dbgrid中显示了一些记录,并利用on标题单击来更改网格的索引和排序。我还可以再次单击一列来将列从升序更改为降序排序。此外,在我单击列后,我有一个Tedit框,用户可以输入数据,程序使用findnearest方法在已单击的列中查找最接近的匹配项。它为升序或降序索引执行此操作。

我的问题是,当索引按降序排列时,findnearest会在应该选择的记录之后选择记录。

这是一些数据,一组数据是升序,另一组是降序。

Ascending - Able,Arnold,Arney,Barney,Bubba

降序 - 布巴,巴尼,阿尼,阿诺德,阿布尔

当我在Ascending上搜索“A”时,记录指针落在Able上。 当我在Descending上搜索“B”时,记录指针落在Arney上。 我的两个例子不是理论,这就是实际发生的事情。

我的问题是 - 按降序排列,为什么它会跳过Bubba和Barney?请不要再给我一个例子。如果您打算做一个例子,请使用我的数据。请给我一个解释为什么findnearst以降序顺序跳过前两个记录,显然以“B”开头。

3 个答案:

答案 0 :(得分:3)

我可以解释为什么会这样(希望有一些清晰度)以及为什么它实际上是正确的行为。 (以下描述将简单地讨论单字节字符,但答案也应适用于其他字符。)

考虑到以下数据(我故意让它们稍微不同以便于解释 - 你会明白为什么在下面,我希望),让我们假设我们位于顶行( A 为在这两种情况下,升序,查理降序。

(Ascending)         (Descending)
LastName            LastName
========            ========
A                   Charlie
Abe                 Bob
Ada                 Ada
B                   Abe
Bob                 A

从第一行(行 A )开始按升序排列并搜索 Ac ,我们首先会遇到 Abe 。这不是匹配,我们正在寻找的应该是按升序排列,所以我们继续寻找 Ac

它不存在,我们现在位于发现匹配的行,即紧接着的行( Ada )。换句话说,如果它存在,我们将定位在匹配的位置(最近的行)。

现在让我们说我们搜索 Al 。我们在 Ada ,所以我们转到下一行,发现没有 Al 。我们现在处于 B ,如果存在,则会发现 Al 。换句话说,我们在最近的行。 (这可以通过快速测试来确认。)

当我们按降序排列时,示例的工作方式相同。 (请记住,我的数据略有不同,以便更容易解释。)让我们搜索 Cecil

我们排在第一行, Charlie ,然后转到下一行寻找 Ce (在 > Charlie 按降序排列,而不是之前,如上面数据中的 Abe A 所示。我们发现我们没有匹配项,而且我们目前排在 Bob 行,如果它存在,则会找到 C 。换句话说,按降序排列,我们位于最近的行,就像在升序示例中一样。

所以FindNearest没有问题。如果您希望行为不同,则必须在代码中实现它(检查您是否找到了完全匹配,如果不需要先移动一行,并检查它是否在您想要的位置)相反)。

答案 1 :(得分:1)

好的,我会去的。

你的基本问题是你在想FindBarest应该“知道”这些物品的订单。 即你想要的行为是当列表按降序排列时你希望FindNearest从列表底部开始并向上工作。

它没有,它始终从顶部起作用,你可以通过给它一个无序列表很容易地证明这一点。

答案 2 :(得分:0)

在delphi中,findnearest方法根据delphi文档执行GotoNearest和GotoNearest;将光标定位在记录上,该记录是密钥缓冲区中当前键值指定的确切记录,或位于其值超过指定值的第一个记录上。

这是有道理的升序,我有两个记录AU和BU并搜索B. B大于AU但小于BU,因此它将光标放在第一个记录上,其值超过指定的值 - BU。

但是在下降过程中,它在结果方面的作用是不同的。如果我按降序顺序有两个记录BU和AU,并且我搜索B,则光标落在AU上。这对我来说很困惑。 BU大于B,为什么不登陆BU?

原因; docuentation表示如果没有匹配,则光标将定位在第一个记录上,其值将执行指定的值。但事实上,最接近的是执行getnext。因此,在升序索引中,getnext是一个更大的键,但在降序索引中,getnext是一个更小的键。