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