动态网站制作指南 [  QQ表情  ]
[ 投票调查 ]
[ 企业邮箱 ]
[ 网站空间 ]
网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 邮件系统 | 网络安全 | 认证考试 | 系统进程
ASP源码 | .Net源码 | PHP源码 | JSP源码 | JAVA源码 | CGI源码 | VB源码 | C++源码 | Delphi源码 | PB源码 | VF源码 | 汇编 | 服务器
电脑书籍下载:程序设计书籍 | 数据库教程书籍 | 平面与多媒体书籍 | 网络通讯书籍 | 系统管理书籍 | 网络安全书籍 | 认证考试书籍
Firefox | IE | Maxthon | 迅雷 | 电驴 | BitComet | FlashGet | QQ | QQ空间 | Vista | 输入法 | Ghost | Word | Excel | wps | Powerpoint
asp | .net | php | jsp | Sql | c# | Ajax | xml | Dreamweaver | FrontPages | Javascript | css | photoshop | fireworks | Flash | Cad | Discuz!
当前位置 > 网站建设学院 > 网络编程 > C/C++教程
Tag:注入,存储过程,分页,安全,优化,xmlhttp,fso,jmail,application,session,防盗链,stream,无组件,组件,md5,乱码,缓存,加密,验证码,算法,cookies,ubb,正则表达式,水印,索引,日志,压缩,base64,url重写,上传,控件,Web.config,JDBC,函数,内存,PDF,迁移,结构,破解,编译,配置,进程,分词,IIS,Apache,Tomcat,phpmyadmin,Gzip,触发器,socket
网络编程:ASP教程,ASP.NET教程,PHP教程,JSP教程,C#教程,数据库,XML教程,Ajax,Java,Perl,Shell,VB教程,Delphi,C/C++教程,软件工程,J2EE/J2ME,移动开发
文章搜索服务
邮件订阅
输入你的邮件地址,
你将不会错过任何关于:
[ C/C++教程 ]的信息



本月文章推荐
.用C++程序删除文本文件中以“//”.
.网际幕後的无名英雄----IP 原理实.
.C++箴言:接口继承和实现继承.
.C++ 语言基础(1).
.C++编译器如何实现异常处理.
.Pcap程序设计.
.程序员眼中的qmail(qmail源代码分.
.编程资源收集.
.几个游戏代码(麻将原代码).
.C语言整型数据.
.VC的若干实用小技巧(四).
.C语言数组排序小结.
.一个简单的玫瑰花程序(二).
.C语言常用的三种排序方法总结与探.
.修练8年C++面向对象程序设计之体.
.理解内联函数inline在C++中的用法.
.TCanvas类.
.在C++Builder中使用DLL.
.用VSTS代码验证工具捕捉C/C++错误.
.C++BUILDER非可视组件的消息处理.

集合类:VBA集合对象的安全包装

发表日期:2008-3-8 |


你迟早都要治理一组由VBA类模块创建的自定义对象,VBACollection对象是实现这一目的的理想工具。我们在该杂志的Premiere期刊中曾经介绍过Collections,并且阐述了如何使用Collection对象来存储其他对象。虽然该项技术十分有用,但它确实还存在一些局限。在本文中,我们讨论了这些局限,并向你展示如何通过使用(你猜是什么)类模块来克服这些局限。
Collections中碰到的麻烦
Collections对象中到底有什么问题呢?它似乎存储对象存储得非常好。事实上,它工作起来的确是太好了。Collections对象得最大问题是它可以存储到任何数据类型得引用,例如Integer,String,Long,Variant,等(见图1)。
当然,假如你能保证每个对象都具有相同得类型,并且具有相同得属性何方法的话,那么在Collection中处理对象就变得异常简单。例如,作为本月范例ExcelVBA项目的组成部分,我们创建一个自定义的File类来代表一个磁盘文件。这个File类有几个属性,其中包括Path,Size,和ShortName。假如你创建了一个File对象的Collection,那么你将希望这个Collection中的每个对象都具有这些属性。你可以毫无异议地使用与下面类似的代码:
'PrintthesizeofthefirstfileintheCollection.
Debug.PrintcolFiles.Item(1).Size
但是,假如colFilesCollection中的第一个对象不是File,将会出现什么情况呢?假如它是一个Form或Control对象,又会怎样呢?假如它根本就不是一个对象呢?当然,当它试图执行该代码的时候,VBA将生成运行时间错误。


图1(左)VBACollection对象可以容纳任何类型的对象



图2(右)创建一个Collection类来防止不想要的对象进入集合
输入Collection类
Collection类可以充当Collection对象的过滤器,限制你可以在里面存储的对象类型(如图2所示)。通过与你的应用程序中的Collection类(二不是Collection对象本身)的互相作用,你可以防止不想要的对象的进入。创建和使用Collection类答应你扩展Collection对象的属性和方法(后面我们将举例说明)。
为了说明Collection类以及如何创建一个Collection类,我们将使用带有通过扫描磁盘目录创建的文件集合的Excel97项目。图3显示了一个表单,它用你选择了路径之后存储在自定义Collection类中的文件信息使得列表框通俗化。
这个表单使用一个叫做Files的Collection类来通俗化列表框。在创建Collection的时候,以向你的VBA项目添加一个新的类模块作为开始,然后在这个新模块的声明段声明一个PrivateCollection对象。下面是来自Files类模块的声明:
'Collectionoffiles.
PrivatepcolFilesAsNewCollection
为了将Collection对象与外界"隔绝",并阻止程序的其他部分用无用的东西填充它,必须将Collection对象声明为Private。
复制所需要的方法
当然,一旦你已经将Collection对象声明为Private,那么对于任何过程都没有办法向其中添加项目或从中删除项目了。因而,下一步就是复制Collection对象的标准方法了。尽管听起来象是做了大量额外的工作,实际上仍然在做我们前面所提及的"过滤"工作。
请记住,内建的Collection对象具有Add方法,该方法接受对象引用和独特的、包括文字与数字的标识符。假如你的应用程序正在直接使用Collection对象,那么它将极有可能创建对象的一个新的实例,并将其添加到Collection本身。
'Createanewinstanceofanobject.
DimobjFileAsNewFile
objFile.Path="C:AUTOEXEC.BAT"

'AddtoaCollectionobject.
colFiles.AddobjFile,objFile.ShortName

应用Collection类,应用程序调用该类的Add方法,传递任何必需的信息。请将先前的代码与Files类的Add方法做一比较:

WithaCollectionclass,theapplicationcallstheAddmethodoftheclass,passinganyrequiredinformation.ContrastthepreviouscodewiththeAddmethodoftheFilesclass:

PublicFunctionAdd(PathAsString)AsFile

DimobjFileAsFile

'CreatethenewFileobject.

SetobjFile=NewFile
objFile.Path=Path

'AddittothePrivatecollection.
pcolFiles.AddobjFile,objFile.ShortName

'Returnapointertothenewobject.
SetAdd=objFile

EndFunction

在本例中,到Collection的对象创建和添加发生在Add方法内部;而类则保留了完整的控制。任何必需的信息(例如文件的路径)是作为参数向方法提供的。由应用程序调用将文件添加到Collection的代码然后可以简化为:

'Addafiletothecollection.
colFiles.Add"C:AUTOEXEC.BAT"
InadditiontotheAddmethod,theCollectionclassshouldalsoimplementtheItemandRemovemethods,aswellasaCountproperty:

PublicFunctionItem(KeyAsVariant)AsFile
'Returnaniteminthecollection.
SetItem=pcolFiles.Item(Key)
EndFunction

PublicSubRemove(KeyAsVariant)
'Removeanitemfromthecollection.
pcolFiles.RemoveKey
EndSub

PropertyGetCount()AsLong
'Returnthenumberofitems.
Count=pcolFiles.Count
EndProperty

请注重,在这三种方法中,我们省略了错误处理--有些事情你是从来都不应该做的!至少应该包括一个错误处理器,通过使用Err对象的Raise方法来将错误传递、给调用过程。

图3这个表单通过显示文件信息来说明Collection类

'Privatevariabletostorepath.
PrivatepstrPathAsString

PropertyGetPath()AsString
'Returnstoredpathvalue.
Path=pstrPath
EndProperty

PropertyLetPath(strPathAsString)

DimstrFileAsString

'Clearthecollection.
SetpcolFiles=NewCollection

'Makesurethere'sabackslash.
IfRight(strPath,1)<>""Then
strPath=strPath&""
EndIf

'Getthefirstfile.
strFile=Dir(strPath&"*.*",_
vbReadOnlyOrvbHiddenOrvbArchiveOrvbSystem)
DoUntilLen(strFile)=0
'Addittothecollection.
CallAdd(strPath&strFile)
'Getthenextfile.
strFile=Dir()
Loop

'Savethepath.
pstrPath=strPath

EndProperty

图4向Collection类添加Path属性。将该属性和类设置为扫描目录并将所找到的每个文件添加到私有Collection对象。

扩展Collection类

现在,你可以通过声明Files类的一个实例来使用它了,并为曾经由Dir函数找到的每个文件反复调用该类的Add方法。但这不是我们的例子要完成的工作。为什么不是呢?使用Collection类的一个优点是你可以通过添加更多的属性和方法来扩展它的功能;不仅仅限于Add,Remove,Item,和Count。

在我们的Files类的情形中,它难道不对在类本身,而不是使用该类的每个应用程序里面,放置扫描目录的代码做更多的检测吗?这是面向对象设计的一个指导原则:将代码放在最靠近需要它的地方。

为了阐述这个概念,我们向Collection类添加了一个Path属性。当你设置这个属性的时候,这个类将对目录进行扫描,并向Collection对象添加它所找到的每个文件(见图4)。

当一个过程改变该类的Path属性的时候,将触发PropertyLet过程。在我们的例子中,它发生在你从浏览器对话框选择了一个路径之后。这里是完成用文件列表填充Collection任务的简单代码。

'Reinitializethecollection.
SetmobjFiles=NewFiles

'Setthepathproperty.
mobjFiles.Path=strPath

一旦设置了Path属性,Files类就将通俗化它自己的Collection,并且使它可以提供给应用程序。这已经是另一个例子了,在这个例子里面,过程的"guts"存在于类自己内部(你可以证实类已不再需要它的Add和Remove方法了。在有些应用程序中,可能确实是这样,但为了达到说明的目的,我们已经选择了留下它们作为该类的一部分)。

一些不利之处

使用VBACollection类的生活并不总是美酒和玫瑰。当你使用Collection类代替Collection对象时,必须放弃两样东西。第一样是Collection对象的默认方法,Item。默认的方法答应你从你的代码中省略单词"Item"。例如,如下两条语句是一样的,都是假定colFiles引用一个Collection对象。

Debug.PrintcolFiles.Item(1).Size
Debug.PrintcolFiles(1).Size

除非你正在使用的是VisualBasic5.0,否则没有办法为一个类指定默认的方法。因而,你必须总是显式调用Item方法。

Collection类的第二个主要的不足之处是不能创建列举函数。列举类就是可以使ForEach循环工作的类。假如你想重复Collection中的每一个项目,那么就必须用老式的方法来完成,也就是使用Count属性和ForNext循环。例如,下面的代码可以通俗化列表框:


'Fillthelistboxwithinfo.
lstFiles.Clear
ForlngCount=1TomobjFiles.Count
WithmobjFiles.Item(lngCount)
lstFiles.AddItem.ShortName&_
Space(12-Len(.ShortName))&_
vBTab&.AttributeString&_
vbTab&.Size
EndWith
Next

请注重该过程是如何使用计数器变量lngCount来完成从1到Collection中项目数的循环的。With语句使用了Item方法来引用Collection中的每个对象。

请注重,VisualBasic5.0用户可以通过创建列举函数来克服这一局限。在VisualBasicBookOnline中搜索要害字"enumeration"可以得到更为具体的信息。->
上一篇:自己的邮件自己发 人气:262
下一篇:使用foreach来读取记录 人气:204
浏览全部C/C++的内容 Dreamweaver插件下载 常用网页广告代码全集
  最新网站源码 最新软件下载
2008-7-24 Sablog-X v2.0 预览版
2008-7-24 帝国备份王EmpireBak 2008 正式版
2008-7-24 网趣网上购物系统时尚版 v8.2
2008-7-24 纵横B2B电子商务系统XYECS!B2B v
2008-7-24 e路小说小偷 v1.2.0723
2008-7-24 凌风美女图片站程序 v2.2
2008-7-24 TOM15电影收索程序
2008-7-24 清风信息自动采集生成系统 v1.0
2008-7-24 QQ邮箱编辑器 v1.0 (小小菜刀ASP
2008-7-19 UltraEdit 简体中文增强版 14.10
2008-7-19 CentOS 5.2 i386 LiveCD
2008-7-19 Snapture多功能相机 v1.4
2008-7-19 iAcces中文输入法 v1.0Build016
2008-7-19 Cookbook烹饪秘籍 v2.5
2008-7-19 苹果专用DVD转换工具 v1.1.59汉化
2008-7-19 Modem修复软件ZiPhone修改版04.0
2008-7-19 AgileMessenger即时通讯工具美化
2008-7-19 Sketches画图软件 v0.7b6破解版


  发表评论
姓 名: 验证码:
内 容:
[ 汉字翻译拼音 ] [ 广告代码 ] [ 符号对照表 ] [ 进制转换 ] [ 经典小工具 ] [ 个税计算 ] [ 汉字简繁转换 ] [ 普通单位换算 ] [ 公制单位换算 ]
[ 生辰老黄历 ] [ 国内电话区号 ] [ 国家代码与域名缩写 ] [ 文字加密解密 ] [ 健康查询 ] [ 万年历 ] [ 手机号码查询 ] [ ip搜索 ] [ Google PR查询 ]
业务联系 | 广告刊登 | 频道合作 | 投稿荐稿 | 联系方式 | 加入收藏 | RSS订阅
Copyright © 2000-2008 www.knowsky.com All rights reserved | 网络实名:动态网站制作指南 | 沪ICP备05001343号