发信人: 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]
|
|