运用ActiveX组件技术创建通用的查询控件.docx
《运用ActiveX组件技术创建通用的查询控件.docx》由会员分享,可在线阅读,更多相关《运用ActiveX组件技术创建通用的查询控件.docx(7页珍藏版)》请在冰豆网上搜索。
![运用ActiveX组件技术创建通用的查询控件.docx](https://file1.bdocx.com/fileroot1/2022-11/27/f249c263-5526-4ae0-b25f-0741b1391543/f249c263-5526-4ae0-b25f-0741b13915431.gif)
运用ActiveX组件技术创建通用的查询控件
运用ActiveX组件技术创建通用的查询控件
Microsoft的ActiveX技术,为应用程序开发提供了强大的工具。
程序开发人员通过使用ActiveX控件,例如系统定制的按钮、文本框、列表框、组合框,或者由自己创建的更加复杂的组合控件,可以轻松快捷地开发出各种应用程序。
----笔者运用ActiveX组件技术,在VisualBasic5(简体中文版)环境下,创建了一个通用的查询控件。
该控件的功能是,根据用户的选择,生成对数据库表的各种查询组合,即查询语句的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(获取
查询字符串)一个事件。
----定义控件属性有几种方
法:
一是使用类属性过程。
二是建立属性页。
这里使用最简单的方法,向控件模块添加公共变量。
----在控件代码的"通用声明"区域输入下述代码:
PublicConnect,Database,TablenameAsString
PublicEventGetSelectionSql(ByValSelectionSqlAs
String)
同时定义几个临时变量:
DimdbAsDatabase,rs,rs1AsRecordset
DimSelectionSql,MsgAsString
DimiAsInteger
----4.为控件编程----为了实现控件功能,需要对控件的事件编
程。
(以下程序都经过实际运行测试,可以原样复制使用)
(1)o1(Index+2),Combo1(Index).Text)
EndSelect
EndSub
----(6)单击命令按钮:
单击"确定"时,根据用户的选择建立查询字符串,并引发GetSelectionSql事件返回字符串;单击"取消"时,关闭查询窗体。
PrivateSubCommand1_Click(IndexAsInteger)
SelectCaseIndex
Case0'确定
SelectionSql="WHERE"Fori=0ToCheck1.Count-1
IfCheck1(i).Value=1Then
IfSelectionSql<>"WHERE"Then
IfOption1((i-1)*2)Then
SelectionSql=SelectionSql&"AND"
Else
SelectionSql=SelectionSql&"OR"
EndIf
EndIf
IfCombo1(i*3)<>""Then
SelectionSql=SelectionSql&Combo1(i*3)
Else
SelectionSql=""
MsgBox"该项还未设值!
",64,"查询条件:
"
Combo1(i*3).SetFocus
ExitSub
EndIfIfCombo1(i*3+1)<>""Then
SelectionSql=SelectionSql&""&Combo1(i*3+1)_&""
Else
SelectionSql=""
MsgBox"该项还未设值!
",64,"查询条件:
"
Combo1(i*3+1).SetFocus
ExitSub
EndIfSelectionSql=SelectionSql_
&CheckType(rs(Combo1(i*3).Text).Type,_Combo1(i*3+2))
EndIf
NextiIfSelectionSql="WHERE"ThenSelectionSql=""IfCheck2.Value=1Then
MsgBox"SelectionSql="&SelectionSql,64,"查询字符串:
"
EndIfRaiseEventGetSelectionSql(SelectionSql)UnloadParent
Case1'取消UnloadParent
EndSelect
EndSub
----(7)自定义过程:
给左列组合框置值-表的列名。
PrivateSubLoadCboLeft(ByValCboAsComboBox)
Ifrs.EOFAndrs.BOFThen
MsgBoxTablename&"表中无记录!
",64,"查询条件:
"
ExitSub
EndIf
rs.MoveFirstFori=0Tors.Fields.Count-1
Cbo.AddItemrs(i).Name
Next
Cbo.Text=Cbo.List(0)EndSub
----(8)自定义过程:
给右列组合框置值-根据左列组合框中表的列名置相应的列值。
PrivateSubLoadCboRight(ByValCboAsComboBox,ByValColNameAsString)
Ifrs.EOFAndrs.BOFThen
MsgBoxTablename&"表中无记录!
",64,"查找条件:
"
ExitSub
EndIfCbo.ClearSetrs1=db.OpenRecordset_
("selectDISTINCT"&ColName&"from"&Tablename)
DoWhileNotrs1.EOF
IfNotIsNull(rs1(0))Then
Cbo.AddItemrs1(0)
EndIf
rs1.MoveNext
LoopCbo.Text=Cbo.List(0)
EndSub
----(9)自定义函数:
检查数据类型。
PublicFunctionCheckType(ByValsTypeAsString,_
ByValsValueAsString)AsStringSelectCasesType
CasedbBoolean
IfsValue=("true"Or"false"Or0Or1)Then
CheckType=CBool(sValue)
ExitFunction
EndIf
CasedbByte
IfIsNumeric(sValue)Then
CheckType=CByte(sValue)
ExitFunction
EndIf
CasedbInteger
IfIsNumeric(sValue)Then
CheckType=CInt(sValue)
ExitFunction
EndIf
CasedbLong
IfIsNumeric(sValue)Then
CheckType=CLng(sValue)
ExitFunction
EndIf
CasedbCurrency
IfIsNumeric(sValue)Then
CheckType=CCur(sValue)
ExitFunction
EndIf
CasedbSingle
IfIsNumeric(sValue)Then
CheckType=CSng(sValue)
ExitFunction
EndIf
CasedbDouble
IfIsNumeric(sValue)Then
CheckType=CDbl(sValue)
ExitFunction
EndIf
CasedbDate
IfIsDate(sValue)Then
CheckType="CDate('"&sValue&"')"
ExitFunction
EndIf
CasedbText
CheckType="'"&CStr(sValue)&"'"
ExitFunction
CaseElse
MsgBox"该项超出查询范围或数据类型不对!
",16,"查询条件:
"
CheckType=""
EndSelect
EndFunction
----5.生成OCX文件----在"工程组"窗口里选定"查询控件.VBP"工程。
从"文件"菜单里选择"生成查询控件.OCX",生成工程窗口打开,选择好保存控件的路径和文件名后,按确定按钮。
----至此,"查询控件"已创建完毕。
VisualBasic已在您的操作系统注册表里注册了这个控件。
在Windows95中控件的注册位置是:
HKEY_LOCALMACHINE\SOFTWARE\CLASSES\CLSID。
控件的使用说明----控件创建好后,就可以提供给他人使用了。
可以通过创建CAB文件,经国际互连网发行给用户使用。
这里仅说明在VisualBasic编程环境下的使用。
----1.将"查询控件.OCX"、"查询控件.EXP"、"查询控件.LIB"这三个文件复制到您的服务器或工作站的某一路径下。
例如:
C:
\用户控件。
----2.从"工程"菜单里,打开"部件"窗口,选定"查询控件"。
如果在选择窗口中未显示"查询控件",则通过浏览按钮来选定。
选定好后,按确定按钮返回,"查询控件"图标将显式地显示在工具栏中。
----3.新建或添加一个"标准EXE"工程,双击或拖放"查询控件"图标到工程的窗体上。
----4.选中窗体上的"查询控件",在窗体的属性栏或代码窗口"Form_Load"事件中为属性赋值。
例如:
PrivateSubForm_Load()
----查询控件.Connect="Access"
----查询控件.Database="d:
\mydocuments\access\myweb.mdb"----查询控件.Tablename="address"
EndSub----
5.在窗体代码窗口的"查询控件_GetSelectionSql"自定义事件中获取查询字符串。
将该字符串连接到显示窗体或需要地方的SELECT语句上,即可完成各种情况的组合查询。
例如:
----
PrivateSub查询控件_GetSelectionSql(ByValSelectionSqlAsString)----
MySelectionSql=SelectionSql----
EndSub