动态生成控件的事件,除了委托之外,还有callbyname

鹏哥制造 2014-04-23 11:29:03
实例不太好说清楚,可以下载看看:
在http://pan.baidu.com/s/1mgE3dJa下载!
vb2010编写的关于短波收发信机的模拟测试及考试的软件。目前仅实现了频谱仪、双音信号发生器、负载的类,可以测试大部分发射机指标。
软件中采用了callbyname来实现动态新增类间的函数调用,控件使用了devexpress的控件RibbonForm、SplitContainerControl等来仿照office2010的风格,支持皮肤更换。
接线图采用Crainiate的flowchart控件,感觉比visio的要好。
演示中调用了msAgent程序,部分电脑可能无法实现,可网上下载个msAgent.exe安装。其实就是office的精灵。
因为编写的目的只是做个小试验,代码很是混乱,所以没有共享出来,有需要的小伙伴可以通过邮箱或qq索取。qq号:25599396,注明是需要代码。邮箱:cn2719691@163.com。后续完善代码后会在百度空间中共享,或另起贴子共享。
水平有限,请各位大虾批评指正!
...全文
163 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
鹏哥制造 2014-04-24
  • 打赏
  • 举报
回复
引用 3 楼 caozhy 的回复:
CallByName是VB6的遗留语法,实际上原生的,地道的VB.NET写法是使用反射。
斑竹老大,能给个例子吗?关于反射的?之前一直在玩vb6,对.net比较陌生,除了语法习惯一样外。
鹏哥制造 2014-04-23
  • 打赏
  • 举报
回复
CallByName(shape.Tag, "rfIn", Method, o) 动态新增类的时候是将类保存在对应接线图中的shape.tag里面的,而且所有生成的动态类都有sub rfin() Method代表的是过程而不是函数等。后面跟的就是参数了。
threenewbee 2014-04-23
  • 打赏
  • 举报
回复
CallByName是VB6的遗留语法,实际上原生的,地道的VB.NET写法是使用反射。
鹏哥制造 2014-04-23
  • 打赏
  • 举报
回复
再来个动态生成类的调用过程: ''' <summary> ''' 供触发类调用,触发后将输入信号配置自身属性,并更新显示,部分不带输入的设备将报错。 ''' </summary> ''' <param name="oRF">触发类输出信号</param> ''' <param name="line">信号传递来的线,如无则代表自发</param> ''' <remarks></remarks> Public Sub rfIn(ByVal oRF As pgzz.addShape.mMix, Optional ByVal line As Line = Nothing) Dim ss As New pgzz.addShape(Flowchart1) If line Is Nothing Then '如果line is nothing,则代表自主动作,需找line,并传递出去。 Else '也需找line并传递出去。 'Exit Sub '考虑信号是否过大烧毁设备? If (oRF.Amp1 > 30 AndAlso oRF.Rf1 = True) OrElse (oRF.Amp2 > 30 AndAlso oRF.Rf2 = True) Then Dim fire As New frmFire Dim meL As Point = Me.Location meL.Y = meL.Y + 151 fire.Location = meL fire.Size = Me.Size fire.Show() MsgBox("信号过大,系统将终止测试!", MsgBoxStyle.Critical, "错误") fire.Close() Exit Sub End If Me.p_Rf = oRF '频谱仪输出好像跟输入无关呢??要单独设置的啊,不过没做。 '=========================== '置频谱仪显示 rfShow() '=========================== End If line = ss.getLine(Me.p_icom1) If line Is Nothing Then '代表没有输出给其它设备 Exit Sub End If If line.End.Shape.Tooltip Like "*In*" Then '接口允许接受信号。 '获取母体 Dim shape As Shape = DirectCast(line.End.Shape.Tag, Shape) Dim o(1) As Object o(0) = Me.p_Rf o(1) = line CallByName(shape.Tag, "rfIn", Method, o) Else '接线错误。 MsgBox("接线错误,系统将终止测试!", MsgBoxStyle.Critical, "错误") Exit Sub End If ' rfInit() End Sub
鹏哥制造 2014-04-23
  • 打赏
  • 举报
回复
先贴个根据接线图生成模拟仪表的过程源代码:

''' <summary>
''' 新建测试类,并将类添加到shape.tag中
''' </summary>
''' <param name="shape"></param>
''' <remarks></remarks>
Private Sub addClass(ByVal shape As Shape)
If mybRow = 2 Then
If mybCou = 1 Then Exit Sub
mybRow = 0
mybCou = 1
End If

'And
'添加前进行接线检查,检查是否有线未连接,是否有shape主体未连接,
'后续改为按流程图添加,写成1个过程,添加后将该控件赋给shape.tag。使用时再用DirectCast(shape1.Tag, ShapeAttribute)套出来。

Dim icoms As New List(Of Shape)
Dim icom As Shape
For Each icom In Me.Flowchart1.Shapes.Values
'MsgBox(icom.Key & "'" & shape.Key)
If icom.Key Like shape.Key & "-icom*" Then
icoms.Add(icom)
End If
Next

Select Case shape.Tooltip

Case "频谱仪"
Dim ppy1 As New ppy(Flowchart1, shape.Key)
ppy1.Location = New Point(100 + 650 * mybRow, 50 + mybCou * 250)
ppy1.setIcom(icoms) '添加接口
Me.SplitContainerControl2.Panel2.Controls.Add(ppy1) '测试类是否可通过name来调用呢?已生成控件了?
shape.Tag = ppy1
Case "高频信号发生器"
Dim gx As New 高频信号发生器(Flowchart1, shape.Key)
gx.Location = New Point(100 + 650 * mybRow, 50 + mybCou * 250)
gx.setIcom(icoms) '添加接口
Me.SplitContainerControl2.Panel2.Controls.Add(gx)
shape.Tag = gx
Case "负载"
Dim fz As New 负载(Flowchart1, shape.Key)
'fz.Location = New Point(300.0, 250.0)
'负载只加载类,不显示。

fz.setIcom(icoms) '添加接口
mybRow = mybRow - 1
shape.Tag = fz
Case "功率计"

Case "音频分析仪"

Case "双音信号发生器"
Dim sy As New 双音信号发生器(Flowchart1, shape.Key)
sy.Location = New Point(100 + 650 * mybRow, 50 + mybCou * 250)
sy.setIcom(icoms) '添加接口
Me.SplitContainerControl2.Panel2.Controls.Add(sy)
shape.Tag = sy
Case "电台"
Dim dt As New 电台(Flowchart1, shape.Key)
dt.Location = New Point(100.0, 450.0)

Me.SplitContainerControl2.Panel2.Controls.Add(dt)


dt.setIcom(icoms) '添加接口
mybRow = mybRow - 1

shape.Tag = dt
Case Else


End Select

mybRow = mybRow + 1
End Sub

16,554

社区成员

发帖
与我相关
我的任务
社区描述
VB技术相关讨论,主要为经典vb,即VB6.0
社区管理员
  • VB.NET
  • 水哥阿乐
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧