热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

过新年,特献薄礼:用VBScript实现的集合类!

特需要使用集合的时候,无法找到VBScript中的Collection对象;到处找不到,那就自己写一个吧!注:1.需要VBScript5.0或更高版本,使用Class及
特需要使用集合的时候,无法找到 Vbscript 中的 Collection 对象;到处找不到,那就自己写一个吧!

注:
1. 需要 Vbscript 5.0 或更高版本,使用 Class 及动态数组实现;
2. 如果哪位高人能够提供更好的方法,不要忘了回贴告诉在下啊!

下面为源码:
===================================
' Filename: CollCls.vbs - 集合类定义(模拟集合行为)
' Programmer: zhang_resource
' Built: 2004-01-12
' Last Edited: 2004-01-13
' (c) All Rights Reserved.

' 关于集合类:
' 1. 索引从 1 开始到 Count
' 2. 不支持默认项的语法 objColl("Key"), 只支持 objColl.Item("Key") 的语法
' 3. 提供以下外部方法:
'  - Add() 支持错误捕获
'  - Remove() 支持错误捕获
'  - Item() 支持错误捕获
'  - Count()
'  - Clear()

' 注解:
' 1. Class 的支持自 Vbscript 5.0 开始,包含在 IE5.0(浏览器)、IIS4.0(服务器)及其后续版本中
' 2. 本模块仅用于客户端(IE 浏览器)
'    IE 客户端引用:
'      <SCRIPT language="Vbscript" src="CollCls.vbs">
'      

Class clsCollection
' --- Private ---

' 以下 2 个数组用以保存集合元素及其健值 Key 索引,
' 具有相同的数组维数及下标
Private m_ItemArray() ' 用以保存集合元素的数组,可为任意类型的数据
Private m_KeyArray() ' 用以保存集合元素 Key 值的数组,其值为字符串
Private m_Count ' 集合元素的个数

Private Sub Class_Initialize() ' 类初始化
m_Count = 0
ReDim m_ItemArray(0) ' 第 0 个元素将不起作用
ReDim m_KeyArray(0) ' 第 0 个元素将不起作用
End Sub

' --- Public ---

'''''''''''''''''''''''''''''''''''''''''''''''''''''
'' Add() Method
'' Item_Key: 关键字Key[字符串],不能重复,不区分大小写
'' Item_Value: 集合元素的值,任意类型
'''''''''''''''''''''''''''''''''''''''''''''''''''''
Public Function Add(Item_Key, Item_Value)
Dim i

' 判断加入的元素是否与原来相同
If m_Count > 0 Then
If VarType(m_ItemArray(m_Count)) <> VarType(Item_Value) Then
Add = Null
Err.Raise 111, "CollCls:第53行", "加入的新元素与集合中的元素类型不一致。"
Exit Function
End If
End If

' 判断关键字是否有重复
For i = 1 To m_Count
If LCase(m_KeyArray(i)) = LCase(Item_Key) Then
Add = Null
Err.Raise 222, "CollCls:第62行", "新元素的关键字与原有关键字冲突。"
Exit Function
End If
Next

' 添加到数组中
m_Count = m_Count + 1

ReDim Preserve m_ItemArray(m_Count)
ReDim Preserve m_KeyArray(m_Count)

m_KeyArray(m_Count) = Item_Key

If IsObject(Item_Value) = True Then
Set m_ItemArray(m_Count) = Item_Value
Set Add = Item_Value
Else
m_ItemArray(m_Count) = Item_Value
Add = Item_Value
End If
End Function

'''''''''''''''''''''''''''''''''''''''''''''''''''''
'' Clear() Method
'''''''''''''''''''''''''''''''''''''''''''''''''''''
Public Sub Clear()
Call Class_Initialize()
End Sub

'''''''''''''''''''''''''''''''''''''''''''''''''''''
'' Count() Method
'''''''''''''''''''''''''''''''''''''''''''''''''''''
Public Function Count()
Count = m_Count
End Function

'''''''''''''''''''''''''''''''''''''''''''''''''''''
'' Remove() Method
'''''''''''''''''''''''''''''''''''''''''''''''''''''
Public Sub Remove(Key_Index)
Dim i, j

' 方式(按关键字Key[字符串]; 按索引Index[整数])
Select Case VarType(Key_Index)
Case 8 ' 字符串 By Key
For i = 1 To m_Count
If LCase(Key_Index) = LCase(m_KeyArray(i)) Then
For j = i To m_Count - 1
m_KeyArray(j) = m_KeyArray(j + 1)
m_ItemArray(j) = m_ItemArray(j + 1)
Next

m_Count = m_Count - 1

ReDim Preserve m_KeyArray(m_Count)
ReDim Preserve m_ItemArray(m_Count)

Exit Sub
End If
Next
Case 2 ' 整数 By Index
i = Key_Index

If i > 0 And i < m_Count + 1 Then
For j = i To m_Count - 1
m_KeyArray(j) = m_KeyArray(j + 1)
m_ItemArray(j) = m_ItemArray(j + 1)
Next

m_Count = m_Count - 1

ReDim Preserve m_KeyArray(m_Count)
ReDim Preserve m_ItemArray(m_Count)

Exit Sub
End If
End Select

Err.Raise 333, "CollCls:第140行", "删除元素未成功,请检查指定的索引或关键字是否正确。"
End Sub

'''''''''''''''''''''''''''''''''''''''''''''''''''''
'' Item() Method
'''''''''''''''''''''''''''''''''''''''''''''''''''''
Public Function Item(Key_Index)
Dim i

'方式(按关键字Key[字符串]; 按索引Index[整数])
Select Case VarType(Key_Index)
Case 8 ' By Key
For i = 1 To m_Count
If LCase(Key_Index) = LCase(m_KeyArray(i)) Then
If IsObject(m_ItemArray(i)) = True Then
Set Item = m_ItemArray(i)
Else
Item = m_ItemArray(i)
End If

Exit Function
End If
Next
Case 2 ' By Index
i = Key_Index

If i > 0 And i < m_Count + 1 Then
If IsObject(m_ItemArray(i)) = True Then
Set Item = m_ItemArray(i)
Else
Item = m_ItemArray(i)
End If

Exit Function
End If
End Select

Item = Null
Err.Raise 444, "CollCls:第178行", "元素未找到,请检查指定的索引或关键字是否正确。"
End Function
End Class

4 个解决方案

#1













' 嵌入客户端集合对象定义
《SCRIPT》




Class clsA
Public a
Public b
Public c
End Class

Dim objA, objB
Dim objColl
Dim n

Set objA = New clsA
Set objB = New clsA
Set objColl = New clsCollection

With objA
.a = 123
.b = "456"
.c = "hello world"
End With

With objB
.a = "World Hello"
.b = "789"
.c = 123
End With

With objColl
.Add "objA", objA
.Add "objB", objB
End With

Document.Write "objA.c = " & objColl.Item("objA").c & "
"
Document.Write "objB.c = " & objColl.Item("objB").c & "
"
《SCRIPT》


#2


dictionary对象不行吗

#3


dictionary对象,好啊,多谢!
可是我的机器使用 Scripting 对象时,总是时灵时不灵,真是搞不定,没办法只好。。。

#4


我用增加时,dictionary时老是出现“此键已与该集合的一个元素关联 ”

推荐阅读
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • C语言注释工具及快捷键,删除C语言注释工具的实现思路
    本文介绍了C语言中注释的两种方式以及注释的作用,提供了删除C语言注释的工具实现思路,并分享了C语言中注释的快捷键操作方法。 ... [详细]
  • 本文介绍了如何在给定的有序字符序列中插入新字符,并保持序列的有序性。通过示例代码演示了插入过程,以及插入后的字符序列。 ... [详细]
  • 前景:当UI一个查询条件为多项选择,或录入多个条件的时候,比如查询所有名称里面包含以下动态条件,需要模糊查询里面每一项时比如是这样一个数组条件:newstring[]{兴业银行, ... [详细]
  • Java中包装类的设计原因以及操作方法
    本文主要介绍了Java中设计包装类的原因以及操作方法。在Java中,除了对象类型,还有八大基本类型,为了将基本类型转换成对象,Java引入了包装类。文章通过介绍包装类的定义和实现,解答了为什么需要包装类的问题,并提供了简单易用的操作方法。通过本文的学习,读者可以更好地理解和应用Java中的包装类。 ... [详细]
  • 本文介绍了Oracle存储过程的基本语法和写法示例,同时还介绍了已命名的系统异常的产生原因。 ... [详细]
  • 从Oracle安全移植到国产达梦数据库的DBA实践与攻略
    随着我国对信息安全和自主可控技术的重视,国产数据库在党政机关、军队和大型央企等行业中得到了快速应用。本文介绍了如何降低从Oracle到国产达梦数据库的技术门槛,保障用户现有业务系统投资。具体包括分析待移植系统、确定移植对象、数据迁移、PL/SQL移植、校验移植结果以及应用系统的测试和优化等步骤。同时提供了移植攻略,包括待移植系统分析和准备移植环境的方法。通过本文的实践与攻略,DBA可以更好地完成Oracle安全移植到国产达梦数据库的工作。 ... [详细]
  • Spring框架《一》简介
    Spring框架《一》1.Spring概述1.1简介1.2Spring模板二、IOC容器和Bean1.IOC和DI简介2.三种通过类型获取bean3.给bean的属性赋值3.1依赖 ... [详细]
  • 深入理解Java虚拟机的并发编程与性能优化
    本文主要介绍了Java内存模型与线程的相关概念,探讨了并发编程在服务端应用中的重要性。同时,介绍了Java语言和虚拟机提供的工具,帮助开发人员处理并发方面的问题,提高程序的并发能力和性能优化。文章指出,充分利用计算机处理器的能力和协调线程之间的并发操作是提高服务端程序性能的关键。 ... [详细]
  • NetBPM的安装还是比较简单的,有比较详细的文档。1.当然是先下载运行程序了,netbpm-0.8.3.1.zip,官方网站ÿ ... [详细]
  • 织梦DedeCMS配置手机wap站点,并绑定二级域名
    织梦DedeCMS织梦配置手机wap站点,并绑定二级域名。1.安装手机wap浏览模块2.根目录创建wap文件夹,将templets\wap文件移入根目录下的wap,如图:织梦Ded ... [详细]
  • 搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的详细步骤
    本文详细介绍了搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的步骤,包括环境说明、相关软件下载的地址以及所需的插件下载地址。 ... [详细]
  • 这是原文链接:sendingformdata许多情况下,我们使用表单发送数据到服务器。服务器处理数据并返回响应给用户。这看起来很简单,但是 ... [详细]
  • PHP设置MySQL字符集的方法及使用mysqli_set_charset函数
    本文介绍了PHP设置MySQL字符集的方法,详细介绍了使用mysqli_set_charset函数来规定与数据库服务器进行数据传送时要使用的字符集。通过示例代码演示了如何设置默认客户端字符集。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
author-avatar
吃货程序猿
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有