運用ActiveX組件技術創建通用的查詢控件
發表于:2007-07-14來源:作者:點擊數:
標簽:
珠海遠都軟件有限公司卞國斌 ---- Microsoft 的ActiveX 技 術, 為 應 用 程 序 開 發 提 供 了 強 大 的 工 具。 程 序 開 發 人 員 通 過 使 用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"、" 查 詢 控 件.E
XP"、" 查 詢 控 件.LIB" 這 三 個 文 件 復 制 到 您 的 服 務 器 或 工 作 站 的 某 一 路 徑 下。 例 如:C:\ 用 戶 控 件。
---- 2. 從" 工 程" 菜 單 里, 打 開" 部 件" 窗 口, 選 定" 查 詢 控 件"。 如 果 在 選 擇 窗 口 中 未 顯 示" 查 詢 控 件", 則 通 過 瀏 覽 按 鈕 來 選 定。 選 定 好 后, 按 確 定 按 鈕 返 回," 查 詢 控 件" 圖 標 將 顯 式 地 顯 示 在 工 具 欄 中。
---- 3. 新 建 或 添 加 一 個" 標 準EXE" 工 程, 雙 擊 或 拖 放" 查 詢 控 件" 圖 標 到 工 程 的 窗 體 上。
---- 4. 選 中 窗 體 上 的" 查 詢 控 件", 在 窗 體 的 屬 性 欄 或 代 碼 窗 口 "Form_Load" 事 件 中 為 屬 性 賦 值。 例 如: Private Sub Form_Load()
---- 查 詢 控 件.Connect = "A
clearcase/" target="_blank" >ccess"
---- 查 詢 控 件.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
原文轉自:http://www.anti-gravitydesign.com