delphi 如何使用TClientDataSet查找包含字符串

yv5phkfx  于 2023-01-08  发布在  其他
关注(0)|答案(4)|浏览(283)

我用的是 Delphi 2007。
我知道我可以使用TClientDataSet.locate方法来定位记录,如下所示:

myClient.locate('name','John',[loPartialKey,loCaseInsensitive]);

但是,让我们假设我想找到任何记录与'约翰'包含在其名称,一些东西:
名称类似于“%John%”
会在正则SQL表达式中执行此操作。
使用.locate方法是否可以实现这一点?
看起来[loPartialKey]的工作原理是从开始而不是包含。

dxpyg8gm

dxpyg8gm1#

在.Locate中,loPartialKey从字段值的第一个字符开始匹配,因此您不能只使用. Locate来完成您想要的操作。
但是,TClientDataSet * 的Filter属性可以 * 包含like,如将CDS的Filter属性设置为

AField like '%w%'  // matches all AField values containing `w`

或者,在代码中,

ClientDataset1.Filtered := False;
  ClientDataset1.Filter :=  'AField like ' + QuotedStr('%' + edFilter.Text + '%');
  ClientDataset1.Filtered := True;

因此,您可以使用筛选器来缩小行数,然后使用Locate来查找特定的行,或者简单地遍历筛选后的行来查找所需的确切行。

qfe3c7zg

qfe3c7zg2#

不。在第一部分可以部分匹配。如"使用定位"的帮助中所述。
Locate将光标移动到与指定的搜索条件集匹配的第一行。在其最简单的形式中,您传递Locate要搜索的列的名称、要匹配的字段值以及指定搜索是否不区分大小写或是否可以使用部分键匹配的选项标志。(部分关键字匹配是指条件字符串只需是字段值的前缀。)例如,以下代码将光标移动到CustTable中Company列中值为"Professional Divers,Ltd."的第一行:

var
  LocateSuccess: Boolean;
  SearchOptions: TLocateOptions;
begin
  SearchOptions := [loPartialKey];
  LocateSuccess := CustTable.Locate('Company', 'Professional Divers, Ltd.', SearchOptions);
end;

参考:Delphi online documentation: Using Locate

mfpqipee

mfpqipee3#

LocateRecord在内部使用DSCursor.LocateWithFilter,所以我相信可以编写自定义方法来执行您想要的操作

tp5buhyn

tp5buhyn4#

最好使用.FindFirst和.FindNext:

myDataset.Filter := 'CustomerName LIKE ' + ('*' + edtSearch.Text + '*').QuotedString;
myDataset.Filtered := False;
Found :=  myDataset.FindFirst

if Found then

使用。当您要搜索知道确切值的键时,请查找。
对于您不介意其他记录是否会在dbGrid上消失的情况,只使用Filtered:= true就可以了。

相关问题