运用ActiveX组件技术创建通用的查询控件
Microsoft 的ActiveX 技术, 为应用程序开发提供了强大的工具。程序开发人员通过使用ActiveX 控件, 例如系统定制的按钮、文本框、列表框、组合框, 或者由自己创建的更加复杂的组合控件, 可以轻松快捷地开发出各种应用程序。 ---- 笔者运用ActiveX 组件技术, 在Visual Basic 5 ( 简体中文版) 环境下, 创建了一个通用的查询控件。该控件的功能是, 根据用户的选择, 生成对数据库表的各种查询组合, 即查询语句的Where 子句。
控件的实现步骤-
--- 1. 建立控件工程---- 从" 文件" 菜单里选择" 新建工程" 命令。在新建工程对话框里, 选择"ActiveX 控件" 图标, 用" 查询控件.VBP" 文件名保存工程。这时在工具栏中已经添加了" 查询控件" 的图标, 并且该控件和OLE 控件的图标都处于隙式状态。只要" 查询控件" 可见, 它们就始终为此状态。
---- 2. 建立控件窗体---- 对工程中的UserControl1( 用户控件) 模块进行处理, 建立如图所示的控件对象窗体:
---- (1) 放置1 个标签框。设置Caption 属性为" 选择查询条件:";
---- (2) 放置7 个检查框。检查框由上而下名为
Check1(0)-Check1(6), 且Check1(6) 的Caption 属性
设为" 显示查询字符串";
---- (3) 放置18 个组合框。组合框分左、中、右3 列6 横
行, 自左至右、由上而下, 名为Combo1(0)-Combo1(17)。
给中间列6 个组合框的List 属性输入: =、< =、>=、< 、
>、Like 等关系运算符;
---- (4) 放置10 个选择按钮。
按钮自左到右、由上而下名为Option1(0) -Option1(9),
且左列的Text 的属性设为" 与", 右列设为" 或"。
---- (5) 放置2 个命令按钮。按钮名为Command1(0) 和
Command1(1), 设置Caption 属性分别为" 确定" 和" 取
消"。
---- 3. 定义控件属性和事件---- 控件属性和事件, 是控件的使用者与控件交互的接口。由于该控件要根据使用者的
要求查询指定的数据库表, 并返回查询字符串, 故需定
义Connect( 数据库连接信息)、Database( 数据库名)、
Tablename( 表名) 三个属性和GetSelectionSql( 获取
查询字符串) 一个事件。 ---- 定义控件属性有几种方
法:
一是使用类属性过程。
二是建立属性页。
这里使用最简单的方法, 向控件模块添加公共变量。
---- 在控件代码的" 通用声明" 区域输入下述代码:
Public Connect, Database, Tablename As String
Public Event GetSelectionSql(ByVal SelectionSql As
String)
同时定义几个临时变量:
Dim db As Database, rs, rs1 As Recordset
Dim SelectionSql,Msg As String
Dim i As Integer
---- 4. 为控件编程---- 为了实现控件功能, 需要对控件的事件编程。( 以下程序都经过实际运行测试, 可以原样复制使用) (1) o1(Index + 2), Combo1(Index).Text)
End Select
End Sub
---- (6) 单击命令按钮: 单击" 确定" 时, 根据用户的选择建立查询字符串, 并引发GetSelectionSql 事件返回字符串; 单击" 取消" 时, 关闭查询窗体。
Private Sub Command1_Click(Index As Integer)
Select Case Index
Case 0 '确定
SelectionSql = " WHERE " For i = 0 To Check1.Count - 1 If Check1(i).Value = 1 Then
If SelectionSql < > " WHERE " Then
If Option1((i - 1) * 2) Then
SelectionSql = SelectionSql & " AND "
Else
SelectionSql = SelectionSql & " OR "
End If
End If
If Combo1(i * 3) < > "" Then
SelectionSql = SelectionSql & Combo1(i * 3) Else
SelectionSql = ""
MsgBox "该项还未设值!", 64, "查询条件:"
Combo1(i * 3).SetFocus
Exit Sub
End If If Combo1(i * 3 + 1) < > "" Then
SelectionSql = SelectionSql & " " & Combo1(i * 3 + 1) _ & " "
Else
SelectionSql = ""
MsgBox "该项还未设值!", 64, "查询条件:"
Combo1(i * 3 + 1).SetFocus
Exit Sub
End If SelectionSql = SelectionSql _
& CheckType(rs(Combo1(i * 3).Text).Type, _ Combo1(i * 3 + 2)) End If
Next i If SelectionSql = " WHERE " Then SelectionSql = "" If Check2.Value = 1 Then
MsgBox "SelectionSql = " & SelectionSql , 64, "查询字符串:"
End If RaiseEvent GetSelectionSql(SelectionSql) Unload Parent Case 1 '取消Unload Parent
End Select
End Sub
---- (7) 自定义过程: 给左列组合框置值- 表的列名。 Private Sub LoadCboLeft(ByVal Cbo As ComboBox)
If rs.EOF And rs.BOF Then
MsgBox Tablename & "表中无记录!", 64, "查询条件:"
Exit Sub
End If
rs.MoveFirst For i = 0 To rs.Fields.Count - 1
Cbo.AddItem rs(i).Name
Next
Cbo.Text = Cbo.List(0) End Sub
---- (8) 自定义过程: 给右列组合框置值- 根据左列组合框中表的
列名置相应的列值。 Private Sub LoadCboRight(ByVal Cbo As ComboBox, ByVal ColName As String)
If rs.EOF And rs.BOF Then
MsgBox Tablename & "表中无记录!", 64, "查找条件:"
Exit Sub
End If Cbo.Clear Set rs1 = db.OpenRecordset _
("select DISTINCT " & ColName & " from " & Tablename)
Do While Not rs1.EOF
If Not IsNull(rs1(0)) Then
Cbo.AddItem rs1(0)
End If
rs1.MoveNext
Loop Cbo.Text = Cbo.List(0)
End Sub
---- (9) 自定义函数: 检查数据类型。 Public Function CheckType(ByVal sType As String, _
ByVal sValue As String) As String Select Case sType
Case dbBoolean
If sValue = ("true" Or "false" Or 0 Or 1) Then
CheckType = CBool(sValue)
Exit Function
End If
Case dbByte
If IsNumeric(sValue) Then CheckType = CByte(sValue) Exit Function
End If
Case dbInteger
If IsNumeric(sValue) Then CheckType = CInt(sValue) Exit Function
End If
Case dbLong
If IsNumeric(sValue) Then CheckType = CLng(sValue) Exit Function
End If
Case dbCurrency
If IsNumeric(sValue) Then CheckType = CCur(sValue) Exit Function
End If
Case dbSingle
If IsNumeric(sValue) Then
CheckType = CSng(sValue)
Exit Function
End If
Case dbDouble
If IsNumeric(sValue) Then
CheckType = CDbl(sValue)
Exit Function
End If
Case dbDate
If IsDate(sValue) Then
CheckType = "CDate('" & sValue & "')"
Exit Function
End If
Case dbText
CheckType = "'" & CStr(sValue) & "'"
Exit Function
Case Else
MsgBox "该项超出查询范围或数据类型不对!", 16, "查询条件:" CheckType = ""
End Select
End Function
---- 5. 生成OCX 文件---- 在" 工程组" 窗口里选定" 查询控
件.VBP" 工程。从" 文件" 菜单里选择" 生成查询控件.OCX", 生成工程窗口打开, 选择好保存控件的路径和文件名后, 按确定按钮。 ---- 至此," 查询控件" 已创建完毕。Visual Basic 已在您的操作系统注册表里注册了这个控件。在Windows 95 中控件的注册位置是:HKEY_LOCAL MACHINE\SOFTWARE\CLASSES\CLSID。控件的使用说明---- 控件创建好后, 就可以提供给他人使用了。可以通过创建CAB 文件, 经国际互连网发行给用户使用。这里仅说明在Visual Basic 编程环境下的使用。---- 1. 将" 查询控件.OCX"、" 查询控件.EXP"、" 查询控件.LIB" 这三个文件复制到您的服务器或工作站的某一路径下。例如:C:\ 用户控件。 ---- 2. 从" 工程" 菜单里, 打开" 部件" 窗口, 选定" 查询控件"。如果在选择窗口中未显示" 查询控件", 则通过浏览按钮来选定。选定好后, 按确定按钮返回," 查询控件" 图标将显式地显示在工具栏中。 ---- 3. 新建或添加一个" 标准EXE" 工程, 双击或拖放" 查询控件" 图标到工程的窗体上。 ---- 4. 选中窗体上的" 查询控件", 在窗体的属性栏或代码窗口"Form_Load" 事件中为属性赋值。例如:
Private Sub Form_Load()
---- 查询控件.Connect = "Access"
---- 查询控件.Database = "d:\my documents\access\myweb.mdb"
---- 查询控件.Tablename = "address"
End Sub ----
5. 在窗体代码窗口的" 查询控件_GetSelectionSql" 自定义事件中获取查询字符串。将该字符串连接到显示窗体或需要地方的SELECT 语句上, 即可完成各种情况的组合查询。例如: ----
Private Sub 查询控件_GetSelectionSql(ByVal SelectionSql As String) ----
MySelectionSql = SelectionSql ----
End Sub

