zoukankan      html  css  js  c++  java
  • VB中用“消息类”灵活地控制程序

     我们在进行编程的时候,经常需要对某一过程或函数的运行状态做出响应,而采取不同的处理方法。如我们在加载数据库的时候,可能需要较长的时间,但在这期间,用户可能会做其它的操作,因此我们就需要知道程序运行的状态,以确定是否响应用户的操作。
        
              一般地,如果我们需要在一段子程序运行的过程中了解正在发生的事情,则可以采用在该子程序中加入显示某种消息的语句,如:
          Public Sub AutoAccess
          ……
          frmMain.lblMessage = “正在进行采集,请稍侯……”
          ……
          End Sub
          不过,像这样的代码是很难通用的,因为它已经和具体的程序界面结合起来了。如果我们写了一段功能全面的模块,希望当程序界面发生变动的时候不影响到这部分模块的话,那么我们有两种方法可以做到:一种方法是将此模块封装为类,将代码封装成类之后,就可以通过类的事件来通知调用程序。这种做法有一些缺点,比如,如果在程序的许多地方都需要使用这段代码的话,那么就需要为该类创建多个实例,假如这段子程序很大的话,那么系统开销将会很大。所以,在某些应用场合并不是最佳方案;另一种方法就是采用“消息类”来解决,下面我就向大家介绍此种方法。
          所谓“消息类”方法,同样是靠类的事件通知调用程序的,只不过这个类的功能仅限于传递消息,所以它很小:
          clsMessage.cls清单:
          '消息类型,属于枚举类型数据
          Enum E_MessageType
          eMessage_Unknow
          eMessage_Error_Para_FileNotFound
          eMessage_Error_Para_OpenParaBaseErr
          eMessage_Error_Para_Dev_Load
          eMessage_Error_Para_Dev_Save
          eMessage_Error_Para_RTU_Load
          eMessage_Error_Para_RTU_Save
          eMessage_Error_Para_GPS_Load
          eMessage_Error_Para_GPS_Save
          eMessage_Error_Para_Net_Load
          eMessage_Error_Para_Net_Save
          End Enum
          Public Tag As String
          '----------
          '要激活该事件,用下列语法使用:
          'RaiseEvent SomeThingHappened[(arg1, arg2, ... , argn)]
          Public Event SomeThingHappened(MSGType As E_MessageType, _MSGNumber As Long, _MSGDescrible As String)
          '局部变量保存属性值
          Private meMSGType As E_MessageType'消息类型
          Private mlngMSGNumber As Long'消息号
          Private mstrMSGDescrible As String'消息描述
          '本属性为对消息的描述
          Public Property Let MSGDescrible(ByVal vData As  String)
          Attribute MSGDescrible.VB_Description = “事件的描述”
          '当给属性赋值时在参数左边使用。
          mstrMSGDescrible = vData
          End Property
          Public Property Get MSGDescrible() As String
          '当检索属性值时在参数右边使用。
          MSGDescrible = mstrMSGDescrible
          End Property
          '本属性用于返回消息号,为自定义的值
          Public Property Let MSGNumber(ByVal vData As Long)
          Attribute MSGNumber.VB_Description = “事件代码,为用户在程序中自己定义”
          '当给属性赋值时在参数左边使用。
          mlngMSGNumber = vData
          End Property
          Public Property Get MSGNumber() As Long
          '当检索属性值时在参数右边使用。
          MSGNumber = mlngMSGNumber
          End Property
          '本属性用于标识消息的类别
          Public Property Let MSGType(ByVal vData As E_MessageType)
          Attribute MSGType.VB_Description = “消息的类型,用户可以可以自己定义”
          '当给属性赋值时在参数左边使用。
          meMSGType = vData
          End Property
          Public Property Get MSGType() As E_MessageType
          '当检索属性值时在参数右边使用。
          MSGType = meMSGType
          End Property
          '本方法用于弹出事件
          Public Sub Raise()
          Attribute Raise.VB_Description = “用此方法弹出事件”
          RaiseEvent SomeThingHappened(meMSGType, mlngMSGNumber, mstrMSGDescrible)
          End Sub
          使用的时候很简单方便,见下列代码:
          mAccess.bas清单:
          Public Sub BeginAccess(DevPara as Define_Para, cMsg as clsMessage)
          ……
          eComInit = BuildCom(Para)
          If eComInit = e_ComInitFaild Then '
          AccessSeparate = False
          cMsg.Raise eInitPort, False, “端口打开错误,请检查端口。”
          Exit Function
          ElseIf eComInit = e_RTUNoAddress Then '
          cMsg.Raise eFailed, False, “没有为采集器指定通讯端口!”
          AccessSeparate = False
          Exit Function
          End If
          If UBound(Para.Devices) = 0 Then
          cMsg.Raise eFailed, 0, “采集器没有挂接设备!”
          'MsgBox “该采集器没有挂接设备!”
          Exit  Function
          End If
          ……
          End Sub
          同样地,可以在其它界面中采用同样的方法调用BeginAccess子程序,而不必在BeginAccess中考虑如何操作界面。上例是一个采集程序中的部分代码。在实际应用中,BeginAccess本身调用了许多其它过程和函数,大量的返回信息就是靠类似clsMessage这样的“消息类”分门别类地传递回去,使得主程序的结构非常清晰,而且设计得很完善的功能模块mAccess.bas在多个应用程序中不必做任何改。
          实际上,我们可以采用这种方法建立功能更全面的类,拥有多种事件类型,而且还可以设计一个消息集合来收集消息,以便于记录程序运行事件。进入讨论组讨论。

  • 相关阅读:
    【转】Uiautomator Api浅析
    【转】UiAutomator简要介绍
    后台自动启动appium
    adb通过wifi连接Android设备
    Python字符串处理和输入输出
    OJ题目输出的生成
    Weka的使用和二次开发(朴素贝叶斯及其属性选择)
    PointNet++论文理解和代码分析
    VGG-16复现
    二维偏序-最长上升子序列的两种求解方式
  • 原文地址:https://www.cnblogs.com/googlegis/p/2979179.html
Copyright © 2011-2022 走看看