分享
 
 
 

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

王朝vb·作者佚名  2006-01-08
窄屏简体版  字體: |||超大  

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

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有