VB6: For Each ..... Next

quickcccc 2008-12-09 12:35:49
请问

用 VB6 写一个 Class Box

如何 让 "别人" 使用这个 Class 时

可以用

For Each I in Box
.........
next


...全文
1027 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
vbman2003 2008-12-11
  • 打赏
  • 举报
回复
不是继承
继承可以理解成类之间的类型和子类型关系。
比如你想要写一个程序来记录学校中老师和学生情况。他们有一些共同属性,比如姓名 年龄和住址等等。他们也有各自的属性,比如教师的薪水、教龄等等,学生的成绩和班级等等。你可以为教师和学生建立两个独立的类来处理它们,但是这样做的话,如果要增加一个新的共有属性,就意味着要在这两个独立的类中都增加这个属性...一个比较好的方法是,创建一个包含他们共有属性的基类,比如有属性name,age,然后让教师和学生的类继承这个基类。即它们都是这个类型(类)的子类型,再为这些子类型添加自有的属性......
VB是基于对象的,继承方面做的不好,有一说是VB不支持继承,也有说VB支持接口继承(网上有示例),对此我知道的不多....遇到上面所举的例子,似情况我也会写一个基类,然后在子类中引用这个基类来解决某些问题,不过这显然不是真正意义上的继承...
quickcccc 2008-12-11
  • 打赏
  • 举报
回复
感谢大家协助
vbman2003 2008-12-11
  • 打赏
  • 举报
回复
原来是这样啊,测试成功!
这个要记下来,这个菜单从来没用过,有空要研究一下....
呵呵,谢谢老鸟...
Tiger_Zhao 2008-12-11
  • 打赏
  • 举报
回复
MSDN 中有介绍:mk:@MSITStore:C:\Program%20Files\Microsoft%20Visual%20Studio\MSDN98\98VS\2052\vbcon98.chm::/Html/vbconcreatingyourownclasscollectionthehouseofbricks.htm

[Quote=MSDN:]§ 使 For Each ... Next 有效

伴随着强健性而来的,是重新获得了 For Each ... Next。通过添加下面的方法,可以再一次将所有工作委派给 Collection 对象:

'NewEnum 必须返回一个集合的枚举算子的 IUnknown 接口。
Public Function NewEnum() As IUnknown
Set NewEnum = mcolEmployees.[_NewEnum]
End Function

委派给 Collection 对象的最重要的东西是它的枚举算子。枚举算子是一个小对象,该对象知道如何遍历集合中的各项。不能用 Visual Basic 来书写枚举算子对象,因为 Employees 类是基于 Collection 对象的,可以返回 Collection 对象的枚举算子—它自然知道如何枚举 Collection 对象所保存的各项。

包围 Collection 对象的 _NewEnum 方法的方括号是必要的,这是因为方法名前面的下划线。前面的这个下划线是一个约定,它指明该方法是隐藏在类型库中的。不能把自己的方法命名为 _NewEnum,但是可以把它隐藏在类型库中,并将 For Each ... Next 所需要的过程 ID 赋给它。

§ 要隐藏 NewEnum 方法,并将所需的过程 ID 赋给它,请按照以下步骤执行:

在“工具”菜单上,单击“过程属性”,打开“过程属性”对话框,在“名称”框中,选择 NewEnum 方法。


单击“高级”,显示一些高级功能。选中“隐藏该成员”,使 NewEnum 隐藏在类型库中。


在“过程标识符”框中,键入 -4,将 For Each ... Next 所需要的过程标识符赋给 NewEnum。单击“确定”。
重点 为了使自己的集合类使用 For Each ... Next 来工作,必须提供有正确过程标识符的隐藏 NewEnum 方法。[/Quote]
zhufenghappy 2008-12-10
  • 打赏
  • 举报
回复
设置参数传递窗体阿frm
For Each I in frm.Box
.........
next
vbman2003 2008-12-10
  • 打赏
  • 举报
回复
VB中自己创建的集合类和类生成器创建的集合类似乎不同...
在二者的类属性中似乎看不出差别,但你打开二种集合类的头文件,的确是不同的...
如果你工程中自己创建了一个类,再使用类生成器的时候,它就会有一个提示,告诉你非生成器生成的类,不能分层...
为什么会这样,这个问题我一直想弄明白....
vbman2003 2008-12-10
  • 打赏
  • 举报
回复
你不要复制上面的代码,要直接用类生成器来生成上面的类...
quickcccc 2008-12-10
  • 打赏
  • 举报
回复
感觉它是不是在实现继承啊





quickcccc 2008-12-10
  • 打赏
  • 举报
回复
Hi ~ vbman2003 大大妳好

已经 OK 了 , 谢谢呦

=======================

我想再问个问题

这个源码中 涉及到相互引用

相互引用的机制 让我看得一头雾水

不知哪里可以看到原理教学

或者哪里有更简单的实例来说明相互引用的机制

vbman2003 2008-12-09
  • 打赏
  • 举报
回复
不是很明白你的意思...
用类向导生成器生成集合类,在其中自己定义属性方法....试试这个,看看是不是你要的
quickcccc 2008-12-09
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 vbman2003 的回复:]
不知道你要的是不是如下所示:

下面的类都是由类生成器生成的,没有作修改:

[/Quote]

报告大大
以下失败耶 ><"
请检查一下


'枚举

For Each o In obj
Debug.Print o.MyName
Next
daxiangyy 2008-12-09
  • 打赏
  • 举报
回复
不错,学习以下
vbman2003 2008-12-09
  • 打赏
  • 举报
回复
测试中 Set o = New MyClass 多余....
vbman2003 2008-12-09
  • 打赏
  • 举报
回复
不知道你要的是不是如下所示:

下面的类都是由类生成器生成的,没有作修改:

类MyClass


Option Explicit

'保持属性值的局部变量
Private mvarMyName As String '局部复制
Private mvarMyClassBox As MyClassBox

Public Property Get MyClassBox() As MyClassBox
If mvarMyClassBox Is Nothing Then
Set mvarMyClassBox = New MyClassBox
End If
Set MyClassBox = mvarMyClassBox
End Property

Public Property Set MyClassBox(vData As MyClassBox)
Set mvarMyClassBox = vData
End Property

Private Sub Class_Terminate()
Set mvarMyClassBox = Nothing
End Sub

Public Property Let MyName(ByVal vData As String)
'向属性指派值时使用,位于赋值语句的左边。
'Syntax: X.MyName = 5
mvarMyName = vData
End Property

Public Property Get MyName() As String
'检索属性值时使用,位于赋值语句的右边。
'Syntax: Debug.Print X.MyName
MyName = mvarMyName
End Property


下面是集合类MyClassBox

Option Explicit

'局部变量,保存集合
Private mCol As Collection

Public Function Add(MyName As String, MyClassBox As MyClassBox, Optional sKey As String) As MyClass
'创建新对象
Dim objNewMember As MyClass
Set objNewMember = New MyClass

'设置传入方法的属性
objNewMember.MyName = MyName
Set objNewMember.MyClassBox = MyClassBox
If Len(sKey) = 0 Then
mCol.Add objNewMember
Else
mCol.Add objNewMember, sKey
End If
'返回已创建的对象
Set Add = objNewMember
Set objNewMember = Nothing

End Function

Public Property Get Item(vntIndexKey As Variant) As MyClass
'引用集合中的一个元素时使用。
'vntIndexKey 包含集合的索引或关键字,
'这是为什么要声明为 Variant 的原因
'语法:Set foo = x.Item(xyz) or Set foo = x.Item(5)
Set Item = mCol(vntIndexKey)
End Property

Public Property Get Count() As Long
'检索集合中的元素数时使用。语法:Debug.Print x.Count
Count = mCol.Count
End Property

Public Sub Remove(vntIndexKey As Variant)
'删除集合中的元素时使用。
'vntIndexKey 包含索引或关键字,这是为什么要声明为 Variant 的原因
'语法:x.Remove(xyz)
mCol.Remove vntIndexKey
End Sub

Public Property Get NewEnum() As IUnknown
'本属性允许用 For...Each 语法枚举该集合。
Set NewEnum = mCol.[_NewEnum]
End Property

Private Sub Class_Initialize()
'创建类后创建集合
Set mCol = New Collection
End Sub

Private Sub Class_Terminate()
'类终止后破坏集合
Set mCol = Nothing
End Sub



下面是测试:

Private Sub Command2_Click()
Dim o As MyClass
Dim obj As MyClassBox
Dim tmp As String
Dim i As Integer

'add
Set obj = New MyClassBox
For i = 1 To 100
Set o = New MyClass
tmp = "Name" & i
obj.Add tmp, obj
Next

'枚举
For Each o In obj
Debug.Print o.MyName
Next

Set o = Nothing
Set obj = Nothing
End Sub
chenyanm 2008-12-09
  • 打赏
  • 举报
回复
For Each in Box
next
只能访问集合或数组
是对集合或数组的穷举


但如果你想在类里面实现用户可以对你类的方法进行穷举基本没什么意义,也做不到
duyin2004 2008-12-09
  • 打赏
  • 举报
回复
For Each in Box
next
只能访问集合或数组
将box写成数组或集合,就可以访问

7,763

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧