TDataset的Lookup和Locate方法有多长时间了?

Mas*_*ler 5 delphi dataset

我正在努力在其他人编写的Delphi 4时代程序的代码库中进行现代化和修复错误.很多代码在现代标准下都有点可怕,我不禁想知道我看到的一些东西是否存在,因为原作者不知道某些标准库的功能,或者它们是不是可用.

我在应用程序中看到的一个更令人讨厌的"模式"看起来像这样:

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;
Run Code Online (Sandbox Code Playgroud)

几乎所有这些组都可以被原始数据集中的一个Lookup或一个单行调用替换Locate,而根本不需要中间CDS.这让我想知道,这些方法是否在D4时代可用?什么时候Lookup和Locate第一次添加?

Bru*_*Gee 6

在Delphi 2中引入了Lookup和Locate.看起来原作者根本没有利用它们.

  • @afrazier:不是每个人都?:) (7认同)
  • @Jeroen:*为什么*你有Delphi 2的VCL源码,方便搜索吗?`D-:` (5认同)
  • 确认,绝对不是在Delphi 1 VCL中.我仍然使用Delphi 1,因为我仍然支持一些16位应用程序.乌尔克.我甚至还在Delphi 1和Delphi 2010之间交叉编译代码.尝试用VB 3和VB.Net做到这一点! (5认同)
  • +1; 文件D2-CS-2.0\SOURCE\VCL\DB.PAS:810函数Locate(const KeyFields:string; const KeyValues:Variant; (3认同)

Fab*_*ujo 6

似乎原始程序员想要确保行指针根本没有改变.执行Locate(或Lookup)将更改行指针,激发各种数据事件(Datasource.OnDataChange,Dataset.AfterScroll等).

进行搜索时TClientDataset.CloneCursor,没有触发这些事件dmDatabase.OriginalTable ,也无需从数据库重新加载数据.

在我看来这是意图.TClientDataset在D3上展示.而克隆光标是一种先进的功能-并且需要dmDatabase.OriginalTable是一个CDS也.