使用 TDataSet.FindKey 您可以定位记录。当结果为 True 时,数据集光标将定位在找到的记录上。当结果为 False 时,光标不会移动。这导致在发出 FindKey 之前的记录数据显示在数据感知组件中。

如何对 FindKey 的结果进行编码以返回空记录?

    if Not tblSomeTable.FindKey([SomeSearchData]) then
    begin
        < code to return empty or move data cursor to neutral position >
    end;

更新: (等了几天才选择正确的答案,因为我相信这是惯例,并且不想阻止进一步的反馈。)有一些关于解决这种情况的建议,尽管我相信正确的答案来自马塞洛,因为这是不可能的让光标不在记录上。建议了几种解决方法。我选择了我自己的一个。它是这样的:

    If Not tblSomeTable.FindKey([SomeSearchData]) then
    begin
        tblSomeTable.FindKey([-1,2010]);
    end

我所做的是创建一个虚拟的空白记录,其索引永远不可能是实际数据,即:第一个索引值永远不会是-1。如果初始搜索结果为空,则 FindKey 会将光标定位在该空记录上。这将提供我想要的视觉效果。

有帮助吗?

解决方案

这是不可能的,因为据我所知。光标必须始终上的记录,除非BOF和EOF都是真实的(空的数据集)。

其他提示

TDataSet 没有“中立位置”。但一如既往,你有几个选择:

  1. 将数据集设置为插入/追加记录模式。因此,控件和代码将看到空记录。请小心,因为某些事情可能会偶然将数据分配给字段,然后新记录可能会发布到数据库。
  2. 根据您使用的数据访问组件,您可以将数据集设置为缓存更新模式,将新的空记录插入并发布到数据集中,并将所有更改标记为已应用。然后分配一个过滤器,通常会拒绝这个空记录。然后在您的代码中,您必须切换过滤器,因此它将拒绝所有记录,不包括这个空记录。
  3. 考虑断开 TDataSource 与数据集的连接,然后再次连接。

请注意,但可能还会发明一些其他方法:)

喂,

使用SetRange代替FindKey。

tblSomeTable.SetRange([SomeSearchData],[SomeSearchData]);
try
  while not tblSomeTable.Eof do begin
    <do something with the Record>
    tblSomeTable.Next;
  end;
finally
  tblSomeTable.CanelRange;
end;

在标准确保了最大的匹配的记录是一个你与上述零或一个记录中的语句检索。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top