关于VB的动态生成控件
我想做一个由用户输入行数和列数,然后就生成相应的控件(IMAGE),每个都有相同的数据和函数,运行期生成。我用了NEW,出错!CreateObject,出错!controls.add,能生成控件,但是我编的事件就拜拜了。
其实就像是扫雷游戏,里面放地雷的按钮几百个,不可能是一个一个的做吧?
问题点数:100、回复次数:5Top
1 楼tangolibra(tango)回复于 2002-11-08 00:07:07 得分 50
数组控件知道否?
参考一下MSDN
使用控件数组
控件数组是一组具有共同名称和类型的控件。它们的事件过程也相同。一个控件数组至少应有一个元素,元素数目可在系统资源和内存允许的范围内增加;数组的大小也取决于每个控件所需的内存和 Windows 资源。在控件数组中可用到的最大索引值为 32767。同一控件数组中的元素有自己的属性设置值。常见的控件数组的用处包括实现菜单控件和选项按钮分组。
注意 Visual Basic 包括了在运行时动态地将未引用的控件添加到 Controls 集合中的能力。本主题仅指在设计时通过将一个控件剪切和粘贴到窗体上添加的引用控件。有关在运行时添加控件的详细信息,请参阅参考主题“Add 方法(Controls 集合)”和“Add 方法(Licenses 集合)”。
为何使用控件数组
在设计时,使用控件数组添加控件所消耗的资源比直接向窗体添加多个相同类型的控件消耗的资源要少。当希望若干控件共享代码时,控件数组也很有用。例如,如果创建了一个包含三个选项按钮的控件数组,则无论单击哪个按钮时都将执行相同的代码。
若要在运行时创建一个控件的新实例,则新控件必须是控件数组的成员。使用控件数组时,每个新成员继承数组的公共事件过程。
使用控件数组机制是不可能在运行时创建新控件的,因为每个新控件都继承为数组编写好的事件过程。例如,如果窗体上有若干文本框,而且每个文本框都接受一个日期数值,则可创建一个控件数组,使所有文本框共享同一个合法性检查代码。
示例应用程序:Calc.vbp
图 7.3 所示的 Calculator 示例应用程序(列在 Samples 目录中)包含两个控件数组─ 数字按钮和操作按钮。
图 7.2 控件数组示例
下表列出 Calculator 示例中控件数组的 Name 和 Index 属性值。
数字 (n) 操作符 (n)
0 = Number(0) + = Operator(1)
1 = Number(1) – = Operator(2)
2 = Number(2) X = Operator(3)
3 = Number(3) / = Operator(4)
4 = Number(4) = = Operator(5)
5 = Number(5)
6 = Number(6)
7 = Number(7)
8 = Number(8)
9 = Number(9)
请注意示例是如何使用 object(index) 语法引用每个控件的。在创建控件时指定索引值。实际上,在设计时为一个控件指定任意的索引,这将使控件成为数组的一部分。
Index 属性区分控件数组中的元素。当数组中的一个控件识别了一个事件时,Visual Basic 将调用公共事件过程并传递一个参数(Index 属性的值),分辨是哪个控件识别事件。
例如,Number_Click 事件过程的第一行代码是这样的:
Private Sub Number_Click (Index As Integer)
如果 Number(0) 识别事件,则 Visual Basic 将 0 作为 index 参数传递,而如果 Number(1) 识别事件,则 Visual Basic 将 1 作为 index 参数传递。与索引值不同,对于 Number(0) 到 Number(9) 已执行的其余 Number_Click 代码都是相同的。
Top
2 楼tangolibra(tango)回复于 2002-11-08 00:10:16 得分 50
运行时添加控件数组
在运行时,可用 Load 和 Unload 语句添加和删除控件数组中的控件,然而,添加的控件必须是现有控件数组的元素。必须在设计时创建一个(在大多数情况下)Index 属性为 0 的控件,然后在运行时使用如下语法:
Load object(index%)
Unload object(index%)
参数 描述
object 在控件数组中添加或删除的控件名称。
index% 控件在数组中的索引值。
加载控件数组的新元素时,大多数属性设置值将由数组中具有最小下标的现有元素复制─ 本例中是索引值为 0 的元素。因为不会自动把 Visible、Index 和 TabIndex 属性设置值复制到控件数组的新元素中,所以,为了使新添加的控件可见,必须将其 Visible 属性设置为 True。
注意 试图对数组中已存在的索引值使用 Load 语句时,Visual Basic 将生成一个错误。
重点 可用 Unload 语句删除所有由 Load 语句创建的控件,然而,Unload 无法删除设计时创建的控件,无论它们是否是控件数组的一部分。
Top
3 楼qianlinsong(坦白痞子)回复于 2002-11-08 18:13:36 得分 0
tangolibra(tango) 大哥!谢谢你!我按你的方法试过了,可以实现!!!
我给你加分,尽管你粘贴了MSDN!^_^Top
4 楼qianlinsong(坦白痞子)回复于 2002-11-08 18:14:06 得分 0
再给你100
Top
5 楼tangolibra(tango)回复于 2002-11-09 22:16:15 得分 0
互相帮助!Top




