0

使用 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;

更新:(在选择正确答案之前等待了几天,因为我认为这是习惯,并且不想阻止进一步的反馈。)尽管我相信正确的答案来自 Marcelo,但有一些关于解决这种情况的建议,因为它是不可能有游标不在记录上。提出了几种解决方法。我选择了我自己的一个。它是这样的:

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

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

4

3 回答 3

1

TDataSet 没有“中立位置”。但与往常一样,您几乎没有选择:

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

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

于 2010-03-28T08:06:20.737 回答
1

你好,

使用 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;

当您的条件确保匹配记录的最大值是您使用上述语句检索到的零或一条记录时。

于 2010-03-28T09:36:01.000 回答
0

据我所知,这是不可能的。除非 Bof 和 Eof 都为真(空数据集),否则光标必须始终位于记录上。

于 2010-03-28T07:59:11.993 回答