精华区 [关闭][返回]

当前位置:网易精华区>>讨论区精华>>编程开发>>● 数据库技术>>VisualBasic专题>>VB Tips(4) - 利用抽象类接口设计通用MDI

主题:VB Tips(4) - 利用抽象类接口设计通用MDI
发信人: johnnyxu()
整理人: (1999-07-04 09:24:55), 站内信件
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]

[关闭][返回]