VBGood网站全文搜索 Google

搜索VBGood全站网页(全文搜索)
首页 - 经验之谈 - 如何用VB 创建控件
发表评论(0)作者:不详, 平台:VB6.0+Win98, 阅读:10838, 日期:2001-06-23
如何用VB 创建控件
---- VB5.0 中 文 企 业 版 的 推 出 着 实 让 我 惊 喜 了 一 翻, 尽 管VB5.0 中 文 企 业 版 不 是 同 类 可 视 化 开 发 软 件 中 最 快 速, 但 全 中 文 化 的 帮 助 与 联 机 手 册, 快 捷 编 程 实 时 帮 助 都 让 我 爱 不 释 手, 更 可 爱 的 是VB5.0 企 业 版 也 能 制 作Activex 控 件 了。 毕 竟, 对 于 我 们 这 些 非 专 业 编 程 人 员, 速 度 不 是 唯 一 的 追 求, 方 便 快 捷 的 实 现 自 己 想 法 才 是 我 们 最 终 的 目 的。

---- 在 开 发 一 个 小 型 数 据 库 系 统 中, 我 发 现 录 入 界 面 存 在 一 个 如 下 的 问 题。 绑 定 于 数 据 库 的 文 本 框 不 能 对 日 期、 字 符、 数 字 不 能 进 行 智 能 识 别, 若 在 绑 定 于 日 期 型 字 段 的 文 本 框 录 入 字 符 中, 数 据 库Update 时, 应 用 程 序 发 生 错 误, 尽 管 该 问 题 可 用MaskEeit 控 件 解 决, 但 该 控 件 的 使 用 则 较 为 复 杂, 所 以, 我 们 不 如 用VB5.0 强 大 的Activex 控 件 界 面 向 导, 花 十 分 种 来 制 作 一 个Textpro 的 文 本 框 增 强 控 件。

---- 该 控 制 实 现 如 下 功 能:

---- 1. 具 有 一 个 文 本 框 的 属 性( 包 括 数 据 绑 定)

---- 2. 具 有 一 个 新 的 属 性TextType。 该 属 性 是 一 个 数 值 型,0 代 表 只 接 受 日 期,1 代 表 只 接 受 数 字, 其 它 数 字 接 受 字 符( 缺 省 为2)。 设 计 时, 当TextType 属 性 更 改 后,Text 属 性 改 为0( 数 字 型), ""( 字 符 型), 当 前 日 期( 日 期 型)

---- 运 行 时, 根 据TextType 属 性, 对 错 误 输 入 自 动 提 示 相 应 信 息, 并 去 掉 错 误 输 入, 恢 复 最 近 一 次 的 正 确 输 入。

---- 好 了, 打 开 你 的 电 脑, 让 我 们 用 十 分 种 来 创 造 一 个 奇 迹 !

---- 一、 运 行 可 爱 的VB5.0 之 后, 在 新 建 工 程 中 选 择Activex 控 件, 一 个 已 经 创 建 好 的 用 户 控 件VB5.0 的 集 成 开 发 环 境 中, 我 们 在 属 性 中 将 它 的 名 称 改 为Textpro; 再 双 击 右 边 工 具 栏 的 文 本 框 控 件, 在 窗 体 中 就 会 出 现 一 个 文 本 框, 将 文 本 框 的 名 称 改 为Text1。

---- 二、 使 用Activex 控 件 界 面 向 导:

---- 1. 从 外 接 程 序 中 选 择Activex 控 件 界 面 向 导( 若 没 有, 请 选 择 外 接 程 序 管 理 器(A), 在VB Activex Control Interface Wizard 前 打 勾 并 确 定, 再 选 择Activex 控 件 界 面 向 导)。

---- 2. 单 击" 下 一 步(N)" 跳 过"Activex 控 件 界 面 向 导 一 介 绍" 窗 体。

---- 3. 在"Activex 控 件 界 面 向 导" 一 选 定 界 面 成 员 窗 体 中, 将 左 面" 可 用 名 称" 的 内 容, 加 到 右 面" 选 定 名 称" 中 去, 在 这 里 我 们 将 一 个 文 本 框 具 有 的 所 有 属 性 与 事 件 从 左 面 加 到 右 面, 单 击" 下 一 步(N)"。

---- 4. 在"Activex 控 件 界 面 向 导 ─ ─ 创 建 自 定 义 界 面 成 员" 窗 体 上, 建 立 自 定 义 属 性TextType, 单 击 确 定, 单 击" 下 一 步(N)"。

---- 5. 在"Activex 控 件 界 面 向 导 ─ ─ 映 射 属 性" 窗 体 中, 将 共 有 属 性 中 的 文 本 框 属 性 映 射 到Text1, 单 击" 下 一 步(N)"。

---- 在"Activex 控 件 界 面 向 导 ─ ─ 设 置 属 性" 窗 体 中, 单 击" 公 有 名 称" 中 的TextType, 将 数 据 类 型 设 置 为Integer, 缺 省 值 设 计 为2, 并 在 说 明 中 添 加 庐 项 属 性 的 说 明"0 接 受 日 期,1 接 受 数 值, 其 它 接 受 文 本, 默 认 为 文 本" 单 击 完 成。

---- 6. 程 序 会 有 一 个 总 结 生 成。 单 击 放 弃, 程 序 回 到VB5.0 的 集 成 开 发 环 境。

---- 7. 为Text 属 性 加 入 数 据 绑 定 特 性, 单 击 菜 单 上" 工 具" 选 择 过 程 属 性, 在 名 称 中 选 择Text, 单 击" 高 级》" 把 数 据 绑 定 中 的 前 三 项 打 上 勾, 单 击" 确 定"。

---- 至 此, 一 个 具 有Text 的 属 性, 并 加 上 了TextType 属 性 的 控 件 在Activx 控 件 界 面 向 导 的 帮 助 下 生 成 了, 双 击 用 户 控 件 窗 体, 在code 框 内, 我 们 可 以 发 现 程 序 已 为 我 们 生 成 了 几 百 行 代 码, 我 们 只 需100 行 左 右 的 代 码 便 可 完 成 这 个 控 件。

---- 三 . 添 加 代 码

---- 首 先, 为 了 实 现 功 能, 我 们 需 要 了 两 个 函 数, 来 判 断 文 本 内 容,VB5.0 的ISIsNumeric() 和IsDate() 能 很 好 的 实 现 功 能, 因 为 是 中 文 版, 其 使 用 方 法 就 不 多 讲 了。 我 们 设 计 了 以 下 常 量 来 作 为 全 局 变 量

Dim fflag As Boolean 注释:定义更改标志
Dim stemps As String 注释:定义临时保存文本字符变量
定义了以下函数来更改text1.text的内容
Private Sub MakeText()
注释:注释:根据TextType属性更改text的值
注释:VB5.0用m_来定义自定义属性的值,
m_TextType是设计时textype的属性
If m_TextType = 0 Or m_TextType = 1 Then
If m_TextType = 0 And IsDate(Text1.Text) = False Then
Text1.Text = Date
End If
If m_TextType = 1 And IsNumeric(Text1.Text) = False Then
Text1.Text = "0"
End If
Else
Text1.Text = ""
End If
注释:更改完毕
End Sub

---- 将 上 述 代 码 加 入 通 用 节

---- 我 们 将 在 text1 的LostFocus 和KeyPress 事 件 中 检 测 文 本 内 容 的 合 法 性, 代 码 如 下:

Private Sub Text1_KeyPress(KeyAscii As Integer)
If fflag = False Then
flag = True
End If
If KeyAscii = 13 Then 注释:回车键被按下
If m_TextType = 1 Then
If IsNumeric(Text1.Text) = False Then
tt = MsgBox("该处只接受数字!!", 0, "输入错误")
Text1.Text = stemps
If Text1.Text = "" Then Text1.Text = 0
fflag = False
Else
stemps = Text1.Text
fflag = False
End If
End If
If m_TextType = 0 Then
If IsDate(Text1.Text) = False Then
tt = MsgBox("该处只接受日期!!如:
" + Chr(13) + "(1976-03-19)", 0, "输入错误")
Text1.Text = stemps
If Text1.Text = "" Then Text1.Text = Date
fflag = False
Else
stemps = Text1.Text
fflag = False

End If
End If
End If
RaiseEvent KeyPress(KeyAscii)
End Sub

Private Sub Text1_LostFocus()
If fflag = False Then
fflag = True
End If
If m_TextType = 1 Then
If IsNumeric(Text1.Text) = False Then
tt = MsgBox("该处只接受数字!!", 0, "输入错误")
Text1.Text = stemps
注释:If Text1.Text = Null Then Text1.Text = 0
If Text1.Text = "" Then Text1.Text = 0
fflag = False
Else
stemps = Text1.Text
fflag = False
End If
End If
If m_TextType = 0 Then
If IsDate(Text1.Text) = False Then
tt = MsgBox("该处只接受日期!!如:
" + Chr(13) + "(1976-03-19)", 0, "输入错误")
Text1.Text = stemps
注释:If Text1.Text = Null Then Text1.Text = Date
If Text1.Text = "" Then Text1.Text = Date
fflag = False
Else
stemps = Text1.Text
fflag = False
End If
End If
End Sub

---- 自 此, 我 们 的 控 件 已 大 致 完 成, 下 面 再 在 一 些 小 地 方 进 行 一 下 改 进。

---- 首 先 我 们 为 了 实 现 在 设 计 时,Text 属 性 随TextType 变 化 而 变 化, 我 们 在

Public Property Let TextType(ByVal New_TextType As Integer)
m_TextType = New_TextType注释:注释: 获 得 改 变 值
MakeText 注释:注释: 根 据TextType 属 性 更 改text 的 值
PropertyChanged "TextType"
End Property

---- 加 入2 句 代 码( 有 注 解 的 为 我 们 加 入)

---- 为 了 实 现 绑 定 数 据 库 时 的 同 步 修 改, 我 们Text1_Change() 在 加 入 一 句 代 码( 有 注 解 的 为 我 们 加 入)。

Private Sub Text1_Change()
RaiseEvent Change
PropertyChanged "Text"
注释:绑定数据库时实现同步修改,参见联机手册
End Sub
为了恢复以前的输入,
我们在Text1_GotFocus()事件中记录了正确值
Private Sub Text1_GotFocus()
stemps = Text1.Text
End Sub
为了让Text1充满控件我们在UserControl_Resize()加入代码
Private Sub UserControl_Resize()
MakeText 注释:根据TextType属性更改text的值
Text1.Width = Width 注释:适应大小
Text1.Height = Height
Text1.Top = Top
Text1.Left = UserControl.ScaleLeft
fflag = False
stemps = Text1.Text
End Sub

---- 最 后 别 忘 了 给 控 件 选 一 个 漂 亮 的 图 标, 在 属 性 拦 的ToolboxBar!

---- 四、 测 试 控 件

---- 1 . 选 择 菜 单 中 的" 文 件", 选 择" 文 件" 中 的" 添 加 工 程。。。", 选 择" 添 加 工 程。。。" 的" 标 准EXE", 一 个 新 的 工 程 加 入VB5.0 的 集 成 开 发 环 境, 关 闭 控 件 的 设 计 表 单, 控 件 工 具 栏 就 会 增 加 一 个Textpro 的 控 件

---- 2 . 用 一 般 设 计 程 序 的 方 法 测 试 控 件。

---- 五、 注 意 事 项

---- 1 . 若 再 次 使 用 控 件 向 导, 自 己 加 的 代 码 将 被 注 释 掉( 建 议 不 二 次 使 用 控 件 向 导)。

---- 2 . 第 一 次 使 用 第 三 方 控 件 时, 必 须 在 控 件 工 具 栏 中 用 鼠 标 右 键 激 活 的 部 件 中 注 册 控 件。

---- 3 . 该 控 件 的 开 发 环 境 为VBSP3 版,VB 必 须 用SP3 修 正 过, 方 能 注 册。(《 电 脑 报 配 套 光 盘 四》 有。