我做的程序窗体很多,其中有20几个控件数组是每一个窗体都要用到的,所以对他们的控制我想写到模块里,虽然字符串数组可以写成"字符串名(n)"当参数传进过程中,可是控件数组却不行。
比如Text控件,名字是Fielddata(0),Fielddata(1),Fielddata(2),......我现在只能一个一个的把他们写到过程的参数里,这样在过程控制他们也很麻烦,不能像在窗体里控制得那么简单,写一个循环就了事了。那位高人有没有好办法,可以把控件数组传到过程中,在过程中也能把它们作为数组一样的来处理。拜托,帮帮我这个可怜的人好吗!!!!!!!!!!!
比如Text控件,名字是Fielddata(0),Fielddata(1),Fielddata(2),......我现在只能一个一个的把他们写到过程的参数里,这样在过程控制他们也很麻烦,不能像在窗体里控制得那么简单,写一个循环就了事了。那位高人有没有好办法,可以把控件数组传到过程中,在过程中也能把它们作为数组一样的来处理。拜托,帮帮我这个可怜的人好吗!!!!!!!!!!!
解决方案 »
- vb运行到Set FTSCOne = New FullTunnelServiceControl会报自动化错误,这是为何?
- 关于PRINTER属性
- 在本站论坛搜索查询,却对"C#"字符串不支持,即查不到带#号字符串的内容,但包含C#的话题很多,却查不到。总是将#号自动忽略只留下C字符,到底是怎么回事。
- listview控件的问题,谁用过?为什么我的文字显示不全?
- 【散分】本人终于脱离了上半年的单身生活.在此向各位朋友表示感谢~~~散分的同时,也郑重地宣布:
- Inet写断点续传的问题
- Treeview结点存在与否问题
- 取一个整数数组
- 大家帮帮我吧,关于数据库的连接问题.拜托了,谢谢了.
- 存储过程返回的记录集可否读写?
- 怎样让控件获取RS的返回值!
- 怎么写一个程序,能够自动删除!
但必须是控件数组。
Private Function xx(obj As Object)
Dim i As Integer
Debug.Print obj.Count
For i = obj.lbound To obj.ubound
If TypeOf obj.Item(i) Is TextBox Then
Debug.Print "TextBox"
End If
Next i
End FunctionPrivate Sub Command1_Click()
xx Text1
End Sub
但是我认为这样做的效率比较低,而且不安全。
比较好的方法是建立相应的变量数组,将TEXT的内容放在数组中传递。
Public Declare Function SetParent Lib "user32" (ByVal hWndChild As Long, ByVal hWndNewParent As Long) As LongPublic LastForm As Form在所有窗体中
Private Sub Form_Load()
Dim i As Integer
If IsNull(LastForm) Then Exit Sub
With LastForm
For i = 0 To .Text1.Count - 1
SetParent .Text1(i).hWnd, Me.hWnd
Next i
End With
Set LastForm = Me
End Sub这样只需要建立一组控件数组供各个窗体共用。它们会带着内容走的。但注意各窗体的布局给它们留下相同的空间。
在各个子窗体中Option ExplicitPrivate Sub Form_Load()
Dim i As Integer
With Form1
For i = 0 To .Text1.Count - 1
SetParent .Text1(i).hWnd, Me.hWnd
Next i
End WithEnd SubPrivate Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
Dim i As Integer
With Form1
For i = 0 To .Text1.Count - 1
SetParent .Text1(i).hWnd, .hWnd
Next i
End With
End Sub
不需要LastForm变量,控件数组的宗主关系不会因为 SetParent 改变。
只是因为我想在每个界面里Load主信息数据的时候,将数据由数据库里提出用For循环显示在控件上,当更改这20几个控件内容时再到模块里全部For循环把数据库里的数据UpDate一边。
目的就是为了少写几行代码,因为我们领导经常会将各类样品的主信息作变动,不是增加,就是减少,我得一个Form一个Form去修改,太麻烦了,每个Form的字段又取的不一样,所以我就想只在SQL语句上做点文章,不想再一个个的去改窗体了。
我用了第一位朋友的办法,把控件名作为参数,然后在模块里进行判断和操作,方法可行。
For i = obj.lbound To obj.ubound
obj(i).text=MyRs.Fields.Item(i)
Next i
只是我不知道会不会有什么不好的后果。
第二个带API函数的例子我看不懂,我对API一窍不通,特别是那些参数的含义,比如hWnd,到现在我也没整明白"句柄"是什么意思,不知你有没有好介绍,给我讲讲怎么能学好API函数,或者你开始时学API函数的经验。
再次向几位表示感谢 :)
不会的。只要你访问工程中存在的窗体上的控件,该窗体就会自动 Load。不一定要 Show。不知道的事情不要凭猜想,要么查查资料,要么试试。