Delphi TDataset的查找和定位方法已经存在多久了?

Delphi TDataset的查找和定位方法已经存在多久了?,delphi,dataset,Delphi,Dataset,我正在对别人编写的Delphi4-era程序的代码库进行更新和修复。按照现代标准,很多代码都有点吓人,我不禁想知道,我看到的一些东西是否存在,是因为原始作者不知道某些标准库功能,还是因为它们不可用 我在应用程序中看到的一个更令人讨厌的“模式”如下所示: table := TClientDataset.Create; with table do begin CloneCursor(dmDatabase.OriginalTable, false, true); filtered := tru

我正在对别人编写的Delphi4-era程序的代码库进行更新和修复。按照现代标准,很多代码都有点吓人,我不禁想知道,我看到的一些东西是否存在,是因为原始作者不知道某些标准库功能,还是因为它们不可用

我在应用程序中看到的一个更令人讨厌的“模式”如下所示:

table := TClientDataset.Create;
with table do
begin
  CloneCursor(dmDatabase.OriginalTable, false, true);
  filtered := true;
  active := true;
  first;
  while not EOF do
  begin
    if fieldByName('whatever').AsString = 'some criteria' then break;
    next;
  end;
  if EOF then exit;
  //do something based on the current row of the dataset
  table.free;
end;

几乎所有这些组都可以被对原始数据集的
Lookup
Locate
的单行调用所取代,而根本不需要中间CD。这让我想知道,这些方法在D4时代可用吗?当
Lookup
Locate
首次添加时?

在Delphi2中引入了查找和定位。看起来原始作者根本没有利用它们。

似乎原始程序员想要确保行指针没有更改 完全执行
Locate
(或
Lookup
)将更改行指针,引发所有类型的错误 数据事件(Datasource.OnDataChange、Dataset.AfterScroll等)的类型

使用
TClientDataset.CloneCursor
进行搜索时,这些事件都不会在
dmDatabase.originables
上触发,并且不需要从数据库重新加载数据

在我看来,这就是目的。TClientDataset在D3上显示。克隆游标是一种
高级功能-并且需要
dmDatabase.originatable
也是一张CD。

如果找不到“某些标准”,那么
就不会被释放?@Jrl:就像我说的,按照现代标准,有些代码有点可怕但这基本上是从记忆中重建出来的一般模式。try finally块可能存在,也可能不存在。有一些,但没有应该的那么多。这看起来像是某人编写的代码,他刚刚学会了足够的delphi来完成工作,并且知道一种(暴力方式)来做事情。即使在Delphi1中,他也可以编写一个助手函数,避免复制粘贴疾病。我记得使用这种模式是因为Locate在某些字段中没有像预期的那样工作。现在不确定是哪一个,也不知道这是否是这段代码背后的动机…我可能会使用DisableControls/EnableControls和bookmarks,而不是像这样为每个操作克隆光标。
Lookup
不会更改行指针
Locate
可以,但在少数情况下,这是在原始数据集上进行的,没有CD/
CloneCursor
之类的东西,它基本上是
Locate
的重新实现。但是为什么他们没有在克隆上使用
Locate
LookUp
?另一个好问题:为什么这会到处重复(正如梅森所说)代替单一搜索功能?我知道这是很有可能的-除非在(R.I.P.)Delphi.net中使用预先分配的vararray,这很麻烦-使用
locate
-我甚至这样做了一个。+1;文件D2-CS-2.0\SOURCE\VCL\DB.PAS:810函数locate(const KeyFields:string;const KeyValues:Variant;@Jeroen:为什么Delphi 2的VCL源代码足够方便以这种方式进行搜索?
D-:
@afrazier:不是每个人都这样吗?:)确认,绝对不是在Delphi 1 VCL中。我仍然有Delphi 1,因为我仍然有一些支持.Urk的16位应用。我甚至仍然在Delphi 1和Delphi 2010之间交叉编译代码。尝试用VB 3和VB.Net来做这件事!@afrazier:因为我保留了旧东西的副本:)事实上:这在帮助使用旧版本Delphi的客户时非常有用。