Henry手记-VB.net WinForm中的FORM初探(三)

Henry手记-VB.net WinForm中的FORM初探(三)

**** 韩睿(2002.9.25)

三、 Forms到哪去了?

第一节讲的是一个窗体的类的问题,第两节讨论的是两窗体间的切换

(其实也可以引申为多窗体间的切换),这节讨论一下多窗体的问题。

这是 vb.net版上一位网友发的询问贴,内容如下:

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 ‘ 返回集合中某个位置的内容

Get

Return c.Item(index)

End Get

End Property

ReadOnly Property count() As Integer ‘ 集合中元素数目的记录

Get

Return c.Count()

End Get

End Property

Overridable Function GetEnumerator() As _

IEnumerator Implements IEnumerable.GetEnumerator

‘返回可循环访问集合的枚举数。一旦为类定义了 Ienumerable接口,就必须要重写

GetEnumerator。调用 GetEnumerator 时,它将构建一个枚举数对象,其中包含集合中

的当前版本号以及对集合项的引用。每次访问枚举数时,它都会将枚举数的版本与集合

的版本进行比较。如果版本不匹配,则认为集合被更改,从而发生异常。

Return c.GetEnumerator

End Function

End Class

     通过这个类,你可以获得自已的 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 属性的集合使用方法更灵活,内容更多。当然损失的是自动的功能。

在多窗体中使用时,还是请参看第二节的使用方法,综合考虑一下。

----

声明:本文版权与解释权归韩睿所有,如需转载,请保留完整的内容及此声明。

QQ: 18349592

Published At
Categories with Web编程
Tagged with
comments powered by Disqus