VB6中可以用
Dim frm As Form
For Each frm In Forms
……
Next frm
来取得窗口集合.这个功能在VB.NET中该怎样来完成呢?
先来分析一下Forms的含义与作用:
Forms是一个collection(集合),其元素是进程中被加载的Form。
包括MDI Form,MDI Child Form和non-MDI Form。
Forms集合只有一个属性,就是Count,表明了该集合中有多少元素。
为了达到要求,应该添加自己的forms集合.
添加一个新的module, 然后在module中写入:
Module FormsCollection
Public Forms As New FormsCollectionClass() ‘类定义在后
End Module
添加一个类模块:
Class FormsCollectionClass
Implements Ienumerable
‘Implements 关键字用于对类成员实现特定接口进行界定。
‘为使用For each功能,要实现Ienumerable接口,表示公开枚举数,
该枚举数支持在集合上进行简单迭代。
Private c As New Collection()
‘Collection 对象提供了一种将一组相关项作为一个对象进行引用的便捷方法。集合中的项
(或成员)只需要存在于集合中即可成为相关项。集合中的成员不需要具有相同的数据类型。
它有两个方法:用Add添加元素,和用Remove从集合中删去元素。它有两个属性:
用count来记录元素数目,用只读属性Item返回Collection 对象的特定成员的位置或键
Sub Add(ByVal f As Form) ‘向集合中添加元素的方法
Dim itemCount As Integer
For itemCount = 1 To c.Count
‘判断f是否在forms中,如果在则不加入
If f.Name = CType(c.Item(itemCount), Form).Name Then
Exit Sub
End If
Next
c.Add(f)
End Sub
Sub Remove(ByVal f As Form) ‘向集合中删除元素的方法
Dim itemCount As Integer
For itemCount = 1 To c.Count
‘判断f是否在forms中,如果在则删除掉
If f.Name = CType(c.Item(itemCount), Form).Name Then
c.Remove(itemCount)
Exit For
End If
Next
End Sub
ReadOnly Property Item(ByVal index) As Form ‘返回集合中某个位置的内容
通过这个类,你可以获得自已的 collection of forms. 现在的Forms具有
collection与枚举的特点。即从 collection中增加或删除相应的form
在主程序中form1的 New 过程中(被region折起来了,详见本系列讨论的第一节),
加入下一句:
Forms.Add(Me)
需要注意的是:
这一句话应该要加在InitializeComponent()之后。这是因为,我们防止重复
加入一个form的手段是运用form的name进行判断的。而正如我在第一节中所
描述的那样,系统把初始化的内容,包括name是写在InitializeComponent()
子过程中的。由于每new一个实例,都会调用它一次,所以必须在add方法中
加入判断重复性的内容。
在 Dispose 方法中,加入下一句:
Forms.Remove(Me)
在这里,我们可以回顾一下第一节中谈到的析构的问题,由于Forms是全局的,
所以当一个form关闭时,它并没有退出生存期,所以应该将关闭的这个form
从集合中删除掉。为什么关闭时会调用Dispose方法的问题请回头看一下第一节。
你的程序中如果有很多个form,你要在每个form的New与dispose方法里中加入上两句
接下来你就可以使用了:
Dim frm As Form
For Each frm In Forms
If frm.Name = "Form2" Then
frm.Close()
End If
Next
现在的forms比以前那一个Count属性的集合使用方法更灵活,内容更多。当然损失的是自动的功能。