1、VB如何用代码动态的创建控件数组?
前提是窗体上没有这个控件,要新生成一个。
比如窗体上只有一个按钮,其它什么都没有(不是隐匿了),我要每按一下按钮,就生成一个名为texttem的文本框,只是它们的index值不同。
2、有没有办法把在窗体上的线控件(line),移动到窗体上的某个容器当中(比如:picturebox,frame等),并让其显示!
前提是窗体上没有这个控件,要新生成一个。
比如窗体上只有一个按钮,其它什么都没有(不是隐匿了),我要每按一下按钮,就生成一个名为texttem的文本框,只是它们的index值不同。
2、有没有办法把在窗体上的线控件(line),移动到窗体上的某个容器当中(比如:picturebox,frame等),并让其显示!
解决方案 »
- 如何查找两时间段记录
- mapx 如何实现图元在图层间的拷贝
- 获取ORACLE服务器时间
- 给学习VB的人们信心:大家进来说一下有多少是专业的,多少是业余的?
- 求救关于vb运行时错误(在线等)。。。急啊急啊。。。冒烟了
- 关于TREEVIEW 的问题
- *************100分求解****************
- Bardo(巴顿) xxlroad(土八路) 再请教一个问题
- 我想在按钮上加个ICO图片和文字,图片在左边,右边是文字.如何做到?
- 怎样通过地址传递参数,从而改变实际参数的值?
- 【道歉帖】关于CSDN头像BUG......让部分朋友感到迷惑了,不好意思,非常抱歉.......
- 一台主机,两块网卡,两个IP,可以当两个服务器用吗?
Option Explicit
Dim Text() As ObjectPrivate Sub Form_Load()
Dim i As Integer
Dim nTop As Long
ReDim Text(1 To 10)
For i = 1 To 10
Set Text(i) = Controls.Add("VB.TextBox", "Text1" & CStr(i))
Text(i).Height = 300
Text(i).Top = nTop
Text(i).Visible = True
nTop = nTop + 30 * 15
Next iEnd Sub与VB本身的控件数组区别在于,数组下标只能为1。
Dim Text() As ObjectPrivate Sub Form_Load()
Dim i As Integer
Dim nTop As Long
ReDim Text(1 To 10)
For i = 1 To 10
Set Text(i) = Controls.Add("VB.TextBox", "Text1" & CStr(i))
Text(i).Height = 300
Text(i).Top = nTop
Text(i).Visible = True
nTop = nTop + 30 * 15
Next iEnd SubPrivate Sub Form_Unload(Cancel As Integer)
Dim i As Integer
For i = 10 To 1
Controls.Remove "VB.TextBox", "Text1" & CStr(i)
Next
End Sub
别忘了删除控件。
Option Explicit
Dim Text() As ObjectPrivate Sub Command1_Click() '改变线控件的容器
Set Me.Line1.Container = Me.Picture1
End SubPrivate Sub Form_Load()
Dim i As Integer
Dim nTop As Long
ReDim Text(1 To 10)
For i = 1 To 10
Set Text(i) = Controls.Add("VB.TextBox", "Text1" & CStr(i))
Text(i).Height = 300
Text(i).Top = nTop
Text(i).Visible = True
nTop = nTop + 30 * 15
Next iEnd SubPrivate Sub Form_Unload(Cancel As Integer)
Dim i As Integer
For i = 10 To 1 Step -1
Controls.Remove Text(i)
Next
End Sub
MsgBox Text(2).Index
End Sub
'返回-----对象不是数组
Dim i As Integer
Dim nTop As Long
ReDim Text(1 To 10)
For i = 1 To 10
Set Text(i) = Controls.Add("VB.TextBox", "Text" & CStr(i))
Text(i).Height = 300
Text(i).Top = nTop
Text(i).Visible = True
Text(i).Text = Text(i).Name
nTop = nTop + 30 * 15
Next iEnd Sub
这段代码所生成的动态控件不是数组,因为它们的名字不一样,它的功能和下面的代码的功能是一样的!
Private Sub Form_Load()
Dim i As Integer
Dim nTop As Long
Dim Text As TextBox
For i = 1 To 10
Set Text = Controls.Add("VB.TextBox", "Text" & CStr(i))
With Text
.Height = 300
.Top = nTop
.Visible = True
.Text = Text.Name
nTop = nTop + 30 * 15
End With
Next iEnd Sub
dim withevents Text as textbox
..
太简单了,不说了
对控件数组,比较麻烦一些
'Form
Option ExplicitDim Text() As Object
Dim clsT() As New Class1
Private Sub Form_Load()
Dim i As Integer
Dim nTop As Long
ReDim Text(10)
ReDim clsT(10)
For i = 0 To 10
Set Text(i) = Controls.Add("VB.TextBox", "Text1" & CStr(i))
Text(i).Height = 300
Text(i).Top = nTop
Text(i).Visible = True
nTop = nTop + 30 * 15
clsT(i).Init Text(i) Next iEnd Sub
'Class
Option ExplicitDim WithEvents T As TextBox
Private Sub T_Change()
MsgBox 11
End SubPublic Sub Init(tmp As TextBox)
Set T = tmp
End Sub
设置line控件的parent属性为picturebox试试
Set Me.Line1.Container = Me.Picture1
但第一个问题4楼的朋友好像给出的不对吧!不是控件数组!因为不能用索引,我的目的就是想用索引!
我的思路是,在窗体上加入一个PICTUREBOX这个控件,命名为PICOUT,在PICOUT这个控件里再画一个PICTUREBOX控件(为了实现边界滚动条)。在程序运行的时候从数据库当中读取数据,按数据动态生成FRAME这个控件(有几条数据,就生成几个,要在这里作动态的实时曲线的!其FRAME的CAPTION为各个机器的名字!NAME=FAMQX & adcqx.recordset.fiels(0),数据库控件为ADODC控件,名为adcqx,读取数据库中的字段0,是主关键字。),之后要在各个FRAME上画出坐标系,到这为止,我都会,并且都是用from.Controls.Add()这个方法加入的,就是到读入实时温度的时候,不知道要怎么在各个坐标系上画出曲线!我是想根据IP地址,在数据库中可以查到是那台机器,并用 from.controls("FAMQX" & adcqx.recordset.fiels(0))来找到是那个动态生成的FRAME控件,但就是坐标不知道要怎么得到!谁有思路?
倒.......你应该在逻辑上建立一个结构,用于保存每个机器的数据,比如:type MyType
DeviceNum as string '机器标识,唯一
dX() as long 'X数据
dY() as long 'Y数据
end typedim theData() as mytype '所有收到的X,Y数据都往这里面保存这样你的代码逻辑就非常清楚了:接收数据----->存入结构------>更新界面显示(也就是你要的图象)而要把你的这些数据一起画在一个图表上,使用我所说的这种逻辑结构,将是非常容易的事.你甚至可以再在结构里加一个表示颜色的成员,让更新界面显示的过程根据这个成员的值来显示不同的颜色,以方便区分不同机器.当然,如果你的数据库结构如果可以做此改动,就可以省去定义类型这一步.但无论如何,关键在于你代码的逻辑功能混乱了.每部分的功能都不清晰.....最后画图表了,才在这一步里去存储"最后一个点的坐标"....总之"要如何知道第几台机器的最后一个点的坐标"不在于你用什么方式去画,而是在于你如何去知道.....你使用控件,无非就是为了利用它来保存这个值.何必呢?可以用结构,也可以用数据库来保存.....最终效率都比控件好太多太多...你做得冒烟,我个人认为,主要是因为你程序的逻辑结构没整好......以上一家之言,仅供参考......:)
使用当然不能按一般的办法使用.把11楼阿勇代码里类的Dim WithEvents T As TextBox改为Public,就可以clsT(n).T.Text="xxxxx"了,与普通控件数组差不多了.本来这样的要求就要写多些代码,也不在乎多写一个对象名吧.....
Option ExplicitDim ArrayControl() As TextBox
Dim WithEvents ArrayControlEvent As TextBox
Dim WithEvents m_Parent As Form
Dim m_Count As Integer
Dim m_Name As StringPublic Event Click(ByVal Index As Integer)Public Function Add(ByVal Parent As Form, ByVal Name As String, Optional ByVal Count As Integer = 0) As Variant
Dim i As Integer
If Count < 1 Then
Exit Function
End If
Call Delete
m_Count = Count - 1
ReDim ArrayControl(m_Count)
For i = 0 To m_Count
Set ArrayControl(i) = Parent.Controls.Add("VB.TextBox", Name & CStr(i))
ArrayControl(i).Visible = True
Next
m_Name = Name
Set m_Parent = Parent
Add = ArrayControl
End FunctionPublic Sub Delete()
Dim i As Integer
If m_Count < 0 Then Exit Sub
For i = 0 To m_Count
m_Parent.Controls.Remove ArrayControl(i)
Next
m_Count = -1
End SubPrivate Sub ArrayControlEvent_Click()
RaiseEvent Click(Val(Mid(ArrayControlEvent.Name, Len(m_Name) + 1)))
End SubPrivate Sub ArrayControlEvent_LostFocus()
Set ArrayControlEvent = m_Parent.ActiveControl
End SubPrivate Sub Class_Initialize()
m_Count = -1
End SubPrivate Sub Class_Terminate()
Delete
End SubPrivate Sub m_Parent_Activate()
If TypeName(m_Parent.ActiveControl) = "TextBox" Then
Set ArrayControlEvent = m_Parent.ActiveControl
End If
End Sub'调用代码:
Option ExplicitDim WithEvents TextBox_Array As DynamicTextBoxPrivate Sub Form_Load()
Dim i As Integer
Dim nTop As Long
Dim Ctrls As Variant
Set TextBox_Array = New DynamicTextBox
Ctrls = TextBox_Array.Add(Me, "Text1", 10)
For i = 0 To 9
Ctrls(i).Move 0, nTop, 1500, 300
nTop = nTop + 30 * 15
Next i
End SubPrivate Sub Form_Unload(Cancel As Integer)
Set TextBox_Array = Nothing
End SubPrivate Sub TextBox_Array_Click(ByVal Index As Integer)
MsgBox Index
End Sub