做编程的人对集合都比较熟悉了,但是,在应用中,还是稍加注意的,在我使用中发现一些有趣的现象与大家共享:
WWW_PLCJS※COM-PLC-技.术_网(可※编程控※制器技术门户)
WWW_P※LCJS_CO※M-PLC-技-.术_网
假设这样一种情况:我们从数据库或文本文件中读取一批数据,想放入集合,试试用以下语句读取:WWW_P※LCJS_COM-PLC-)技.术_网
P.L.C.技.术.网——可编程控制器技术门户
dim i as integerWWW_P※LCJS_CO※M-PLC-技-.术_网
WWW_P※LCJS_COM-PLC-)技.术_网
dim IntCollection as new CollectionWWW_PLCJS※COM-PLC-技.术_网(可※编程控※制器技术门户)
plcjs.技.术_网
for i=0 to 1000WWW_PLCJS_COM-PLC-技.术_网
WWW_PLCJS_COM-PLC-技.术_网
IntCollection.add iW1WW_P4LCJS_COM-PLC-技.术_网
WW.W_PLCJS_COM-PLC-技.术_网
next iWWW_PLCJS_COM-PLC-技.术_网
WWW.PLCJS.COM——可编程控制器技术门户
这个在实际运行中是OK的,但是有下一种情况:我们要把某些类放入到集合中去,那么用如下语句试试:WWcW_PLCJS_COM-PLC-技.术_网
WWW_PLCJ-S_COM-PLC-技.术_网(可-编程控-制器技术-门户)
Class MyTestWWW_PLC※JS_COM-PmLC-技.术_网
WWW_PLCJ-S_COM-PLC-技.术_网(可-编程控-制器技术-门户)
Option ExplicitWWW_PL※CJS_COM-PLC-技.术_网
W1WW_P4LCJS_COM-PLC-技.术_网
保持属性值的局部变量P.L.C.技.术.网——可编程控制器技术门户
Private mvarCurrentTemp As Single 局部复制WWW_PLCJS_COM-PLC-技.术_网
Private mvarMotor_Status As Byte 局部复制WWW_PLCJ-S_COM-PLC-技.术_网(可-编程控-制器技术-门户)
Private mvarValve_Status As Boolean 局部复制WWW_P※LCJS_COM-PLC-)技.术_网
保持属性值的局部变量WWW_PLCJS※COM-PLC-技×术_网(可编程控※制器技术门户)
Private mvarHi_ControlTemp As Single 局部复制WWW_PLCJS※COM-PLC-技.术_网(可※编程控※制器技术门户)
Private mvarLo_ControlTemp As Single 局部复制WWW_PLC※JS_COM-PmLC-技.术_网
Private mvarHiLimitTemp As Single 局部复制WWW_PLCJS_COM-PLC-技.术_网
保持属性值的局部变量WW.W_PLCJS_COM-PLC-技.术_网
Private mvarTimeStamp As Date 局部复制WWW_PLC※JS_COM-PmLC-技.术_网
Public Property Let TimeStamp(ByVal vData As Date)WW.W_PLCJS_COM-PLC-技.术_网
向属性指派值时使用,位于赋值语句的左边。W1WW_P4LCJS_COM-PLC-技.术_网
Syntax: X.TimeStamp = 5WWW_PLCJS@_COM%-PLC-技.术_网
mvarTimeStamp = vDataWWW※PLCJS_COM-PL#C-技.术_网(可编※程控※制器技术门户)
End PropertyWW.W_PLCJS_COM-PLC-技.术_网
Public Property Get TimeStamp() As DateWW.W_PLC※JS_C,OM-PL,C-技.术_网
检索属性值时使用,位于赋值语句的右边。WWcW_PLCJS_COM-PLC-技.术_网
Syntax: Debug.Print X.TimeStampWWW_PLC※JS_COM-PLC-技.术_网(可编程控※制器技术门户)
TimeStamp = mvarTimeStampWWW_PLCJS@_COM%-PLC-技.术_网
End Propertyplcjs.技.术_网
WWW_PL※CJS_COM-PLC-技.术_网
Public Property Let HiLimitTemp(ByVal vData As Single)WWW_P※LCJS_CO※M-PLC-技-.术_网
向属性指派值时使用,位于赋值语句的左边。——可——编——程——控-制-器-技——术——门——户
Syntax: X.HiLimitTemp = 5WWW_PLCJS@_COM%-PLC-技.术_网
mvarHiLimitTemp = vDataWWW_PL※CJS_COM-PLC-技.术_网
End PropertyWWW.PLCJS.COM——可编程控制器技术门户
Public Property Get HiLimitTemp() As SingleWWW※PLCJS_COM-PL#C-技.术_网(可编※程控※制器技术门户)
检索属性值时使用,位于赋值语句的右边。P.L.C.技.术.网——可编程控制器技术门户
Syntax: Debug.Print X.HiLimitTempP.L.C.技.术.网——可编程控制器技术门户
HiLimitTemp = mvarHiLimitTempP.L.C.技.术.网——可编程控制器技术门户
End Propertyplcjs.技.术_网
WWW_P※LCJS_CO※M-PLC-技-.术_网
Public Property Let Lo_ControlTemp(ByVal vData As Single)WWW_PLC※JS_COM-PLC-技.术_网(可编程控※制器技术门户)
向属性指派值时使用,位于赋值语句的左边。WWW_P※LCJS_CO※M-PLC-技-.术_网
Syntax: X.Lo_ControlTemp = 5WWW_PL※CJS_COM-PLC-技.术_网
mvarLo_ControlTemp = vDataWWW_PLC※JS_COM-PLC-技.术_网(可编程控※制器技术门户)
End PropertyWWW_P※LCJS_COM-PLC-)技.术_网
WWW_PLCJS※COM-PLC-技.术_网(可※编程控※制器技术门户)
end CassP.L.C.技.术.网——可编程控制器技术门户
P_L_C_技_术_网——可——编——程——控-制-器-技——术——门——户
然后用下面语句试试:WWW_PLCJS※COM-PLC-技.术_网(可※编程控※制器技术门户)
WWW_PLC※JS_COM-PmLC-技.术_网
dim MyCollection as new CollectionWWW_PLC※JS_COM-PLC-技.术_网(可编程控※制器技术门户)
W1WW_P4LCJS_COM-PLC-技.术_网
sub GetCollection()WWW.PLCJS.COM——可编程控制器技术门户
WWW※PLCJS_COM-PL#C-技.术_网(可编※程控※制器技术门户)
for i=0 to 1000WWW_PLCJS※COM-PLC-技.术_网(可※编程控※制器技术门户)
WW.W_PLC※JS_C,OM-PL,C-技.术_网
dim Temp as new MyTestWWW※PLCJS_COM-PL#C-技.术_网(可编※程控※制器技术门户)
WWW_PLCJS※COM-PLC-技×术_网(可编程控※制器技术门户)
Temp.TimeStamp=now()WWW.PLCJS.COM——可编程控制器技术门户
WWW_PL※CJS_COM-PLC-技.术_网
Temp.HiLimitTemp=rnd()*100WWW_P※LCJS_CO※M-PLC-技-.术_网
P_L_C_技_术_网——可——编——程——控-制-器-技——术——门——户
MyCollection.add TempWWW_P※LCJS_CO※M-PLC-技-.术_网
WWW_PLCJS@_COM%-PLC-技.术_网
next iplcjs.技.术_网
W1WW_P4LCJS_COM-PLC-技.术_网
end sub W1WW_P4LCJS_COM-PLC-技.术_网
P_L_C_技_术_网——可——编——程——控-制-器-技——术——门——户
通过这条语句,我们发现集合里面只有最后一个数据,当然个数还是一个不少1001个,但是它的每一个数据都是相同的,我没有去仔细查阅一些资料,我认为,集合内部放的是个指针,定义了一个变量后,其指针但始固定了,因次每次向集合里加一个Item,它只是把指针放入到集合里面去了,因此在上面程序中,它只是始终把Temp指针放入集合中去,最终导致集合中只有一组数据.WWW_PLC※JS_COM-PLC-技.术_网(可编程控※制器技术门户)
P.L.C.技.术.网——可编程控制器技术门户
实际上,上面的代码只要稍微改动一下就可以了:WWW_PLCJS_COM-PLC-技.术_网
WWW_P※LCJS_CO※M-PLC-技-.术_网
dim MyCollection as new CollectionWW.W_PLC※JS_C,OM-PL,C-技.术_网
WWW_P※LCJS_CO※M-PLC-技-.术_网
sub GetCollection()P_L_C_技_术_网——可——编——程——控-制-器-技——术——门——户
WWW_PLCJS※COM-PLC-技.术_网(可※编程控※制器技术门户)
for i=0 to 1000WW.W_PLCJS_COM-PLC-技.术_网
WWW.PLCJS.COM——可编程控制器技术门户
dim k as singleWWW_PLC※JS_COM-PLC-技.术_网(可编程控※制器技术门户)
P_L_C_技_术_网——可——编——程——控-制-器-技——术——门——户
k=rnd()*100WWW_PLCJS@_COM%-PLC-技.术_网
WWW_PL※CJS_COM-PLC-技.术_网
AddToCollection(k)WW.W_PLC※JS_C,OM-PL,C-技.术_网
WWW_PLCJS@_COM%-PLC-技.术_网
next iWWW※PLCJS_COM-PL#C-技.术_网(可编※程控※制器技术门户)
——可——编——程——控-制-器-技——术——门——户
end sub WWW_PLCJS@_COM%-PLC-技.术_网
WWW_PLC※JS_COM-PmLC-技.术_网
sub AddToCollection(byval k as single)W1WW_P4LCJS_COM-PLC-技.术_网
WWW_PLCJS※COM-PLC-技×术_网(可编程控※制器技术门户)
dim Temp as new MyTestWWW※PLCJS_COM-PL#C-技.术_网(可编※程控※制器技术门户)
WWcW_PLCJS_COM-PLC-技.术_网
Temp.TimeStamp=now()WWcW_PLCJS_COM-PLC-技.术_网
plcjs.技.术_网
Temp.HiLimitTemp=kW1WW_P4LCJS_COM-PLC-技.术_网
WWW_P※LCJS_COM-PLC-)技.术_网
MyCollection.add TempWWW_PLCJS_COM-PLC-技.术_网
WWW_PLCJS@_COM%-PLC-技.术_网
end sub ——可——编——程——控-制-器-技——术——门——户
WW.W_PLC※JS_C,OM-PL,C-技.术_网
这样就可以了,为什么呢,因为调用函数每次都分配一些内存给Temp类,然后将Temp类的指针交给集合,下一次调用时,就可以,由于这一块内存被占用了,系统会重新开辟一块内存空间给函数,这样就实现了集合数据的正确填充.WWW_PLC※JS_COM-PmLC-技.术_网
WW.W_PLC※JS_C,OM-PL,C-技.术_网
在VB中,集合的概念还不够强,但在VB2005里面,很多东西都用到了集合的概念,学好这个东西对于程序开发有极大的好处.WWW_PL※CJS_COM-PLC-技.术_网
WWW※PLCJS_COM-PL#C-技.术_网(可编※程控※制器技术门户)