zoukankan      html  css  js  c++  java
  • Delphi TQuery 的Locate用法

    Help里的解释

    function Locate(const KeyFields: String; const KeyValues: Variant; Options: TLocateOptions): Boolean;

    KeyFields: is a string containing a semicolon-delimited list of field names on which to search.

    KeyValues: is a variant array containing the values to match in the key fields.

    TLocateOptions is a set that optionally specifies additional search latitude when searching on string fields.

    关于LocateOptions
    type
      TLocateOption = (loCaseInsensitive, loPartialKey);
      TLocateOptions = setof TLocateOption;

    loCaseInsensitive Key fields and key values are matched without regard to case.//忽略大小写
    loPartialKey Key values can include only part of the matching key field value; //只需部分匹配,从头开始匹配 
    {另外,如果KeyFields里没有字符串类型或者LocateOptions=[],该函数都会忽略此项}

    看了这么多,到底Locate是干么的呢?请看

    Searches the dataset for a specified record and makes that record the current record.

    Call Locate to search a dataset for a specific record and position the cursor on it.

    很显然Locate有别于过虑,可不要等同起来哦。Locate主要是在已经Open出来的数据集里定位你要的资料。

    好了,看了Help里面密密麻麻的E文,头都晕了,是不是因为头晕所以一直学不好“英国历史(English)”呢?我怎么看E文都是这种感觉,还是中国的方块字看起来亲切舒服,^_^,扯远了,言归正传,看了理论的东西,我们来实践一下。

    做事情总是从易处着手,写程序也不例外。我们先看看单栏的用法。

    strCode:='Abc'
    Tquery1.Locate('code',strcode,[loCaseInsensitive])

    这样TQuery,就会将光标定位到code字段中等于Abc(abc,aBc,abC,....)的记录上。

    不过,我们既然用来查询大部分情况下我们都是要模糊查询的,所以这样并不是我们要用的方法,我们只要稍微改下Option就OK了。
    Tquery1.Locate('code',strcode,[loPartialKey])

    这样找到的是这样的结果code中“包含”(是从头开始匹配而不是真正的包含)Abc(Abcddfe...,....)

    当然也可以两个同时使用

    Tquery1.Locate('code',strcode,[loCaseInsensitive,loPartialKey])

    with CustTable do
      Locate('Company;Contact;Phone', VarArrayOf(['Sight Diver', 'P', '408-431-1000']), [loPartialKey]);

      1、使用“;”来分割多个字段名称,用VarArrayOf()来传递多个定位值。
      2、字段一定要和数据库完全一样,即使你用习惯了的空格也不行。虽然使得程序看起来跟清楚点,但是Locate不会自己做Trim,所以它把空格也当成字段名称的一部分。
      3、因为定位值采用Variants,所以定位就不知局限于字符串了。
      4、对于多栏查询的结果,一定要所有栏位全部符和才可以,只要有一栏不符合,就会返回False。
      5.  最好不用对空值进行定位,会进行从头到尾的遍历,影响速度.

     Ok,关于Locate的用法就说到这里,写个小例子当作总结。

     var
      LocateSuccess: Boolean;
      SearchOptions: TLocateOptions;
      StrField,StrLocate:String;//字段名称,定位值
    begin
      SearchOptions := [loCasesensitive,loPartialKey];
      LocateSuccess := CustTable.Locate(StrField,StrLocate, SearchOptions);
    end;

  • 相关阅读:
    1206 冲刺三
    1130持续更新
    1128项目跟进
    冲刺一1123(总结)
    冲刺一
    1117 新冲刺
    0621 第三次冲刺及课程设计
    0621回顾和总结
    实验四主存空间的分配和回收
    学习进度条
  • 原文地址:https://www.cnblogs.com/Thenext/p/9604369.html
Copyright © 2011-2022 走看看