精华区 [关闭][返回]

当前位置:网易精华区>>讨论区精华>>编程开发>>● VB和Basic>>● VB和Basic(1)>>高级技巧>>VB Tips(4) - 利用抽象类接口设计通用MDI

主题:VB Tips(4) - 利用抽象类接口设计通用MDI
发信人: johnnyxu()
整理人: (2000-01-31 15:56:36), 站内信件
VB Tips(4) - 利用抽象类接口设计通用MDI窗体工具栏

    我打算用MDI窗体中的工具按钮控制所有子窗体中的信息集,如移动、
添加、删除、保存记录等操作,而不必在每个子窗体添加工具栏。这里有
一个问题要解决:当多个子窗体同时打开时,MDI窗体的工具按钮应能根据
当前活动子窗体来操纵其相应的记录集(RecordSet)。
    我想利用抽象类接口是最好的解决之道。
    在VB中向项目添加一个类模块(Class Module)AbstractClass,作为
抽象类,代码如下:

    '前一条记录
    Public Sub MovePrevious()

    End Sub
    '下一条记录
    Public Sub MoveNext()

    End Sub
    '加新记录
    Public Sub AddNew()

    End Sub
    '保存记录
    Public Sub Update()

    End
    '取消操作
    Public Sub Cancel()

    End
    '删除记录
    Public Sub Delete()

    End
    .....

    所有过程或函数的内容为空,这就是抽象类。
    接着,有两个MDI子窗体Form1和Form2,它们对应的ADO记录集为rsForm1
和rsForm2。向项目添加两个类模块ImpClass1和ImpClass2实现抽象类接口
AbstractClass。ImpClass1和ImpClass2的结构类似如下,可根据rsForm1和
rsForm2的具体情况修改过程或函数的代码。

    Option Explicit
    Implements AbstractClass
    Dim rs As ADODB.Recordset

    '前一条记录
    Private Sub AbstractClass_MovePrevious()
       rs.MovePrevious
    End Sub
    '下一条记录
    Private Sub AbstractClass_MoveNext()
       rs.MoveNext
    End Sub
    '类初始化
    Private Sub Class_Initialize()
       Set rs = rsForm1
       ' 或Set rs = rsForm2
    End Sub
    '加新记录
    Private Sub AbstractClass_AddNew()
       rs.AddNew
    End Sub
    '保存记录
    Private Sub AbstractClass_Update()
       rs.Update
    End
    '取消操作
    Private Sub AbstractClass_Cancel()
       rs.Cancel
    End
    '删除记录
    Private Sub AbstractClass_Delete()
       rs.Delete
    End

    可见子类ImpClass1和ImpClass2"重载"了抽象类(父类)AbstractClass,
类似Java语言中的子类重载父类的方法或过程的概念。
    然后,向项目添加一个模块modPulic,代码如下:
    Dim AbsAdo as AbstractClass
    在MDI窗体的工具按钮的ButtonClick事件中加入代码:

    Select Case Button.Key
    Case "delete"
       absAdo.Delete
    case "addnew""
       absAdo.AddNew
    case "update"
       absAdo.Update
    case "moveprevious"
       absAdo.moveprevious   
    case "movenext"
       absAdo.MoveNext
    case "cancel"
       absAdo.Cancel
    End Select

    absAdo仅仅是一个抽象类,它将根据当前活动子窗体是Form1还是Form2,
来决定是运行ImpClass1还是ImpClass2中的代码。
    在Form1中加入:

    Dim clsForm1 As ImpClass1
    Private Sub Form_Activate()
        Set absAdo = clsForm1
    End Sub
    Private Sub Form_Load()
        Set clsForm1 = New ImpClass1
        Set absAdo = clsForm1
        ...
    End Sub

    在Form2中加入:
    
    Dim clsForm2 As ImpClass2
    Private Sub Form_Activate()
        Set absAdo = clsForm2
    End Sub
    Private Sub Form_Load()
        Set clsForm2 = New ImpClass2
        Set absAdo = clsForm2
        ...
    End Sub

    由以上代码可见,当活动子窗体为Form1时,抽象类absAdo指向clsForm1,
运行ImpClass1中的代码;当活动子窗体为Form2时,抽象类absAdo指向
clsForm2,运行ImpClass2中的代码,而在MDI父窗体中只有absAdo,不需考
虑当前哪个子窗体是活动的。

    利用抽象类接口设计通用MDI窗体工具栏,有以下优点:
    1、无须在每个子窗体中添加工具栏或按钮
    2、MDI父窗体中的代码更简洁高效
    3、在各自的类模块中编写各记录集的实际操作代码

John
[email protected]

--
※ 来源:.月光软件站 http://www.moon-soft.com.[FROM: 202.109.33.145]

[关闭][返回]