delphi中locate用法

上一篇 / 下一篇  2008-05-29 15:14:40 / 个人分类:Delphi

AM _f-Z|,\7|*f0TDataSet控件以及它的继承控件,例如TSimpleDataSet/TClientDataSet等都可以使用Locate方法在结果数据集中查寻数据。程序首先必须使用SQL命令从后端数据库中取得数据并且形成结果数据集,然后才使用Locate方法查寻数据。
;G ?Z.r1b3D `S:n0当使用Locate方法查寻数据时,开发人员可以使用任何的字段条件来查寻,而无须理会这个字段是不是索引字段。当然,当开发人员使用索引字段来查寻数据时,Locate会直接使用索引来帮助查寻,因此速度会非常快速。如果开发人员使用非索引字段查寻数据,那么Locate也将使用目前它知道最好的方式来查寻数据。
WKT1Kq7W$pEm0此外,Locate方法不只能够查寻一个单一的字段,它同时还能以数个字段的条件来查寻数据。开发人员可以组合数个字段的查寻条件在结果数据集中查寻数据。51Testing软件测试网8G-Hi*OJ2AR
由于Locate能够查寻各种不同数据类型的字段,因此Locate方法在设定查寻条件时是以Variant类型的变量来储存查寻数值的。当开发人员要使用多个字段来查寻数据时必须建立一个Variant数组来储存查寻数值。
g]-E6H7qK0此外,Locate方法在查寻数据时也能够使用模糊条件标准来寻找特定的数据,例如开发人员可以要求Locate在查寻数据时不分大小写,或是以部分字符串来查寻数据,这样就为开发人员提供了非常大的弹性空间。51Testing软件测试网6WjWvqb(J
下面就是Locate的方法原型:
GpvTO N:Ho w z%~0function Locate(const KeyFields: String; const KeyValues: Variant;51Testing软件测试网8K5B[0J(l\
Options: TLocateOptions): Boolean;
;Rv+|cT9``*R"s*E0Locate方法接受三个参数。第一个参数KeyFields是开发人员要查寻的字段名称。如果开发人员要查寻单一字段,那么只需要直接传入此字段名称。如果要以多个字段条件来查寻,那么便需传入所有的字段名称,并且以分号分隔每一个字段名称。51Testing软件测试网XMd1Igx}
第二个参数KeyValues是指开发人员欲查寻的条件数值。它的类型是Variant,因为Variant几乎可以代表任何的类型,因此开发人员可以查寻整数、小数、字符串,或是布尔值的条件。同样,如果开发人员只查寻一个条件数值,那么就可以直接在这个参数位置传入。如果是以多个字段条件来查寻,那么开发人员必须建立一个Variant数组,然后在这个数组中的每一个元素中指定条件数值,再传递Variant数组到这个参数中。至于Variant数组则可以使用VarArrayOf方法,或是使用VarArrayCreate方法来建立,在稍后的范例中会有程序代码说明。51Testing软件测试网G3E!V~1G R)R
Locate方法的最后一个参数TLocateOptions则是让开发人员在查寻字符串字段时,指定以什么标准来查寻数据。开发人员可以指明不分大小写来查寻字符串数据,或是以部分字符串数值来查寻数据。下面就是TLocateOptions的类型定义:51Testing软件测试网ElbhW V
type51Testing软件测试网s!a8K+Jj
TLocateOption = (loCaseInsensitive, loPartialKey);
E;pa"@@$g(^4b5I)r0TLocateOptions = setof TLocateOption;51Testing软件测试网K?~8~)PW
在使用Locate时,如果使用loCaseInsensitive就代表不分大小写查寻数据;如果使用loPartialKey就代表要以部分字符串来查寻数据。51Testing软件测试网#U s2[D&@d{
Locate方法的回传数值是布尔值,它代表Locate方法是否成功找到了要查寻的数据。如果找到,就回传True,否则就回传False。当Locate方法成功地查寻到数据之后,它就会移动目前的记录位置到这笔数据上,否则就会停留在Locate开始查寻之前的记录位置上。51Testing软件测试网.G%Y1}My2`w-~_Y
请注意Locate方法查寻数据的结果是一笔数据,因此,如果你想查寻符合条件的一群数据,那么你可以使用稍后将介绍的过滤器(Filter)功能。
4V9rV:j_k2q0现在,让我们使用数个范例来说明如何使用Locate方法。下面的范例程序代码即是以一个字段来查寻数据,它是以数据表的NAME字段来查寻拥有“李维”数值的这笔数据,由于最后一个参数是空集合,因此,这代表NAME字段必须拥有一模一样的“李维”这个数值才算查寻成功。51Testing软件测试网K)z KN U
aSQLClientDataSet.Locate('NAME', '李维' , []);51Testing软件测试网;p"x5OKB
下面的程序代码则以City和District两个字段来查寻数据,查寻的条件是City字段拥有“台北”数值,而District字段拥有“大安区”数值的数据。
-v Xv0x J/m0aSQLClientDataSet.Locate('City;District', VarArrayOf(['台北,大安区']),[]);51Testing软件测试网 gXA,zZ&yw}sc
下面的程序代码和第一个范例非常相像,只是这个程序代码查寻的是第一笔在NAME字段以“李”数值开头的数据。
F.Z$Ree!L*F0aSQLClientDataSet.Locate('NAME', '李', [loPartialKey]);51Testing软件测试网C,Z;h;eGb?X
最后一个范例则是查寻ID字段中任何以“A12”数值开头的第一笔,而且是不分A大小写的数据。51Testing软件测试网$w4cd4U N,P
aSQLClientDataSet.Locate('ID', 'A12', [loCaseInsensitive ,loPartialKey]);
&R4i#Q#{,[.mu`0现在就让我们使用Locate方法在范例应用程序中查寻数据。
|xj1efV0wK0单字段查寻51Testing软件测试网4w']-iU| G!Y
首先让我们以单一的字段来展示如何查寻数据,稍后再说明如何以多个字段查寻数据。现在请双击图4-3中的【Locate】按钮,并且在它的事件处理函数中撰写如下的程序代码:
;y/FBae0dmSearchData.sqlcdsTest.Locate('SPECIES_NO', edtID.Text, [loCaseInsensitive, loPartialKey]);51Testing软件测试网7QOzz,LO,qF2N
这行程序代码使用数据模块中的TSimpleDataSet来查寻SPECIES_NO字段中包含用户在edtID这个TEdit控件中输入的数值。现在请执行这个范例应用程序,并且在主窗体右边的TEdit控件中输入数值来查寻数据。例如图4-4便是范例应用程序执行的画面。当我们在TEdit控件中输入90100并且点击【Locate】按钮之后,TSimpleDataSet便会立刻找到并且把目前的记录位置移动到这笔数据之上。51Testing软件测试网+{/z/m_;pd8N

e ~$Kj{Q4vc0图4-4 Locate找到90100这笔数据51Testing软件测试网1NG~U(wi/J
使用Locate方法查寻单一字段的数据是非常简单的,现在再让我们看看如何使用多个字段来查寻数据。51Testing软件测试网T ay%M'FI*W I2t
多字段查寻
$s]*[Z KtHd0请在Delphi中建立一个应用程序,并与上面的范例一样建立一个数据模块,并且传入TSQLConnection、TSimpleDataSet,连接到相同的范例数据库CHINESEDEMO.GDB。接着在主窗体中放入如图4-5所示的控件。在主窗体中我们使用了一个TComboBox,在这个TComboBox中将会填入范例数据表所有的字段名称,以便让用户可以自由选择要使用来查寻的字段。51Testing软件测试网4_!_c0W+M.fR
另外,主窗体使用了一个TCheckListBox,它主要是用来储存所有用户输入的查寻条件。当用户在查寻字段中选择了一个字段,然后在查寻数值中输入了欲查寻的数值时,那么就可以点击主窗体中往下箭头的按钮把这个查寻条件加入到TCheckListBox中。当用户输入完所有查寻的条件之后,就可以点击主窗体中的【Locate】按钮以开始查寻数据。此时范例应用程序就会分析TCheckListBox中所有的查寻字段和查寻数值,再调用Locate以多个字段条件来查寻数据。
y{^9J&li051Testing软件测试网_^:YZ4fZw L;V
图4-5 范例应用程序的主窗体51Testing软件测试网C;{\0m,c
例如图4-6就是这个范例应用程序执行的画面。首先,当范例应用程序执行后,用户便可以在TComboBox中选择欲查寻的字段,接着就可以在查寻数值控件中输入欲查寻的数值,接着点击往下箭头的按钮,加入查寻条件到TCheckListBox中,或是点击往上箭头的按钮,清除某一个查寻条件。
a [*nHk&W.S0在TCheckListBox中的查寻条件是以:51Testing软件测试网t6z"f t-y9v_*u
查寻字段名称\查寻字段数值
*NE^5j,Sg&HIWk/Yj0为格式储存的,当用户点击了【Locate】按钮之后就会从TCheckListBox中一一地取出查寻条件,并且分析出查寻字段名称以及查寻字段数值,再放入到Locate方法的第一个以及第二个参数中。51Testing软件测试网AP.F ] @1mT
51Testing软件测试网j7\9jz.Oj ~
图4-6 执行范例应用程序的画面
UM?_rC?j0U0最后当输入完所有的查寻条件之后,用户就可以点击主窗体中的【Locate】按钮来查寻数据了。例如图4-7便是我们查寻TOPOTYPE字段包含“China”的数值,以及SPECIES_NAME字段以O字母为开头的数值。在点击了【Locate】按钮之后,范例应用程序调用Locate方法并且以多个字段为查寻条件,果然立即找到了这笔数据。
2Az uPQd$}0
w+R?;MpR LG0图4-7 以数个字段条件来查寻数据
y r4}:ZGgG0这个范例应用程序是如何运作的呢?这个范例的应用程序执行了下列的工作51Testing软件测试网N)@{}bS6o(s0_
1. 程序启动时在TComboBox中填入范例数据表所有的字段名称;51Testing软件测试网 M QRL(q/g!J2f
2. 点击往下箭头按钮把查寻字段和查寻数值加入到TCheckListBox中,以及点击往上箭头清除查寻条件;51Testing软件测试网H/GVG4i*lA
3. 点击【Locate】按钮时从TCheckListBox中取出查寻条件,并且填入Locate方法的参数中,查寻数据。
I&vcM-e"k0现在就让我们实现以上的工作。首先在范例应用程序启动时,存取数据模块中TSimpleDataSet的Field对象的FieldName特性值以取得字段名称,再填入TComboBox中:
crfVS0procedure TfrmMain.FormActivate(Sender: TObject);51Testing软件测试网'k:vgF8HNl$@OZ+I
var51Testing软件测试网R wLM C&I3v,C
iField : Integer;
-C+V/S`'T%U"t?0begin
(b;U-qWt!Z _)xl/}*F4Y0for iField := 0 to dmSearchData.sqlcdsTest.FieldCount - 1 do
}I0T~l#oL ]0begin51Testing软件测试网_DA Lf
cbFields.Items.Add(dmSearchData.sqlcdsTest.Fields[iField].FieldName)51Testing软件测试网h7?8U/shM+}
end;51Testing软件测试网\6\)](t,v\ yy
cbFields.ItemIndex := 0;
;S!B/o6S;a+@B0E0N X8W0end;51Testing软件测试网}zO}L!\+r
当点击往下箭头按钮时,取出TComboBox中选择的字段名称,以及查寻数值控件中输入的查寻数值,再检查TCheckListBox中是否已经存在了这个查寻字段,如果没有,就将字段名称加字段数值加入到TCheckListBox中。51Testing软件测试网4s:Y8wY$C+_ V
此外,当点击往上箭头按钮时,我们就删除TCheckListBox中目前被选择的查寻条件。
#gm,Y2?7[0procedure TfrmMain.sbtnAddClick(Sender: TObject);
0sLdO6D"X8\"J0begin51Testing软件测试网#L_@lt%t@8_H
if (not AlreadyInCond(cbFields.Text)) then51Testing软件测试网vO.GtVt L
begin
v'g_8`(R,X e0clbConditions.Items.Add(cbFields.Text + '\' + lblSearchValue.Text);
%S)}"Kxv9G'AT0clbConditions.Checked[clbConditions.Count - 1] := True;
;b j Qj_[*tU].b0end;51Testing软件测试网G ~/BD(@D'bA
end;
H s[bDP0
'o$R#iXQb0procedure TfrmMain.sbtnDeleteClick(Sender: TObject);51Testing软件测试网d.~q]o/d
begin
O `'Y~K#b0try51Testing软件测试网B1FRko H+oO
clbConditions.Items.Delete(clbConditions.ItemIndex);
)Khx0L$L0k0except
'H |*t(U4W Qz{0on Exception do;51Testing软件测试网 dE@JDn8P5X | `
end;
:F(Rq Cf0end;
3{"Q4] \5L^2R0最后,当用户点击了主窗体中的【Locate】按钮,范例应用程序就先检查用户是否输入任何的查寻条件。如果有,就调用GetSerchFields从TCheckListBox中取出所有的查寻字段名称,然后调用GetSearchValues取得所有用户输入的查寻数值,最后调用Locate方法来查寻数据。51Testing软件测试网~|1|4X&r E h
其中的GetSearchValues会先调用VarArrayCreate方法以建立一个Variant数组,再于这个Variant数组中一一输入用户的查寻数值。
U8N&R'cF051Testing软件测试网aVg;_[iU f
procedure TfrmMain.btnLocateClick(Sender: TObject);51Testing软件测试网1o,^|5X#A,r
var51Testing软件测试网!sY$@ r7Y AoR
sFields : String;51Testing软件测试网 LI;TxfF
begin51Testing软件测试网W1rbT#g3~4j _
lStart := GetTickCount;
Hm5rk0A5|%r#XH.E0if (CanSearch) then51Testing软件测试网Az5`YR L Z| v-KD4h#c&@
begin
'w'K,rGf8yTL|0sFields := GetSerchFields;51Testing软件测试网O+Pb BS V0vI/}
dmSearchData.sqlcdsTest.Locate(sFields, GetSearchValues,51Testing软件测试网9t9R?2nSxw
[loCaseInsensitive, loPartialKey]);
&pvp;Nm$z H\ I0end;
%MdW+Kq#P#i i ]M0lEnd := GetTickCount;51Testing软件测试网C@4Zq @| F(? |
Self.Caption := FloatToStr((lEnd - lStart) /1000.0);
"p*y_-KNLQ8B] I0end;

8pc;m7n-RMO0

@saX!BbQ4w051Testing软件测试网,m2[$L+v3},_;GUO;V%^
function TfrmMain.GetSearchValues : Variant;51Testing软件测试网^*Q6nOwxQ
var51Testing软件测试网:Hz^ mN!s
iCount : Integer;51Testing软件测试网U3u#ORkHl
sCond : String;51Testing软件测试网3ay0nBW
begin51Testing软件测试网 g2aa3k.b{jgD
Result := VarArrayCreate([0, Self.clbConditions.Items.Count - 1],
Q StXPpR0varVariant);;51Testing软件测试网)ru$x&XW3Yu
for iCount := 0 to Self.clbConditions.Items.Count - 1 do
o-@"}F e{V0begin51Testing软件测试网Ky4I?i?]3h T
sCond := Self.clbConditions.Items[iCount];
?FM,i+K0Result[iCount] := GetSearchValue(sCond);
X1N2C8EKl0end;
,J5JkF:I0end;51Testing软件测试网Wy2t{;W3f/x;@

m?paGw0function TfrmMain.GetSearchFields: String;
pT%y{} Z r4i(B0var
,DG6H5o#lB.h0iCount : Integer;
l`.f+Q\;@&G0sCond : String;51Testing软件测试网 {:t!V.X.Q |*d
begin51Testing软件测试网 Iq,x/H2t[`y7N'YV[
Result := '';
6V&LD({,v)R C dZ[ B0for iCount := 0 to Self.clbConditions.Items.Count - 1 do
g:ZG jMf-i0begin51Testing软件测试网&E~ `9}yi(x
sCond := Self.clbConditions.Items[iCount];
CkJSs+mhSG0Result := Result + GetSearchField(sCond) + ';';51Testing软件测试网s"zQi_J)M
end;
hw!x0GLnP6L0Delete(Result, Length(Result), 1);
PYr0m+V"Y/z0end;
] R5L#w9nu? R0
C.y7o,j`:@sG |nF0function TfrmMain.CanSearch: Boolean;51Testing软件测试网o*\T Ba7h.qrR Z
begin51Testing软件测试网y#eun QP
Result := Self.clbConditions.Items.Count > 0;51Testing软件测试网_,t8K0d4}$f/[
end;
J X7~\ZG^VP0
#b!d[6q_2bh;t0function TfrmMain.GetSearchField(const sCond: String): String;51Testing软件测试网 y'm6f4? g/?-Tt
var51Testing软件测试网 `w]p%S'q
iPos : Integer;
l;Ep0m L3V:n Le4j0begin51Testing软件测试网/yp5gi6g*Hz/I
iPos := Pos('\', sCond);
+?N.ZH:FK0Result := Copy(sCond, 1, iPos - 1);51Testing软件测试网Z ~5P4](mQ*i]
end;
Hb eL3[,g;P$A051Testing软件测试网8VZ q ]d:CQ*j bJ
function TfrmMain.GetSearchValue(const sCond: String): String;51Testing软件测试网,T6Rm[1b(`?:`;b
var51Testing软件测试网} x e2a)F&|
iPos : Integer;
4rWj%On$VB0begin51Testing软件测试网Z6gMld+Q Uw^
iPos := Pos('\', sCond);51Testing软件测试网\#q'qdAv3}q
Result := Copy(sCond, iPos + 1, Length(sCOnd) - iPos);
*pH J S6~#_0end;51Testing软件测试网!{3h1|z-e3g8t
function TfrmMain.AlreadyInCond(const sField: String): Boolean;
|VM]^RUR\5c,S{RA0var
z D}0dAY*v#C0iCount : Integer;51Testing软件测试网&_;y jp3d0}
sCond : String;51Testing软件测试网_2r3iI_^
iPos : Integer;
|o},W R2FS0begin
.{O fW$h$i_\0Result := False;51Testing软件测试网"hZ!v8nA+L.J:\7CZ1Y
for iCount := 0 to clbConditions.Items.Count - 1 do51Testing软件测试网0OH2Y0L f [DlAQI
begin
Ir3cOY$]Q0sCond := clbConditions.Items[iCount];
)Ae}r*x?0iPos := Pos(sField, sCond);
~sr fk0if (iPos <> 0) then
F3Y-j*KS @'M?0begin51Testing软件测试网%a Q`0gWJE^
Result := True;
.h7A,|*DtoI0Break;51Testing软件测试网O:T6b:m4[r0n^.j
end;51Testing软件测试网E?x A t2Db
end;
wwWY3W$U~LG0end;
\DQT}'NJg%`1O051Testing软件测试网t5`4w^4P
上面的范例展示了如何使用Locate方法以多个字段条件来查寻数据。由于Locate方法的第二个参数是Variant类型,因此,我们几乎可以查寻任何类型的字段。Locate方法非常适合在所有数据已经存在于结果数据集中的应用,但是对拥有大量记录的数据表却不见得适合,在稍后的小节中,本章会继续讨论如何使用Locate在大量的数据中查寻数据。51Testing软件测试网i l z7xP$^@K


TAG: Delphi

 

评分:0

我来说两句

日历

« 2023-07-10  
      1
2345678
9101112131415
16171819202122
23242526272829
3031     

数据统计

  • 访问量: 31315
  • 日志数: 39
  • 图片数: 2
  • 建立时间: 2008-04-03
  • 更新时间: 2012-02-03

RSS订阅

Open Toolbar