VBGood网站全文搜索 Google

搜索VBGood全站网页(全文搜索)
首页 - 经验之谈 - VB中防止将重复项目添加到列表框控件中
发表评论(0)作者:, 平台:, 阅读:9366, 日期:2000-03-17
VB中防止将重复项目添加到列表框控件中

谭 翁

Visual Basic 的 列 表 框 控 件 中 包 含 项 目 的 列 表, 本 文 介 绍 如 何 检 查 列 表 中 项 目 是 否 已 经 存 在, 以 及 如 何 将 新 的 项 目 添 加 到 列 表 框 控 件 中。


使 用SendMessage 函 数 搜 寻 重 复 的 项 目

在Visual Basic 中 开 发 应 用 程 序 时, 可 以 使 用 列 表 框 控 件 来 创 建 一 个 项 目 的 列 表。 要 将 新 的 项 目 添 加 到 列 表 中, 可 以 使 用AddItem 方 法, 该 方 法 不 能 自 动 地 报 告 在 列 表 框 控 件 中 是 否 有 重 复 的 信 息 存 在, 所 以 必 须 在 将 新 项 目 添 加 到 列 表 之 前 首 先 检 查 一 下。


可 以 通 过 使 用Windows 应 用 程 序 编 程 接 口(API) 的SendMessage 函 数 来 在 列 表 框 控 件 中 搜 寻 指 定 的 项 目, 它 函 数 允 许 向 操 作 系 统 中 发 送 消 息。 在 本 文 的 例 子 里, 我 们 让SendMessage 函 数 往 列 表 框 控 件 中 执 行 一 个LB_FINDSTRING 消 息。


LB_FINDSTRING 消 息 允 许 在 一 个 列 表 框 控 件 中 搜 索 同 目 标 字 符 串 相 匹 配 的 项 目。 该 消 息 的 第 一 个 参 数 是 希 望 进 行 的 搜 索 类 型, 须 将 该 值 设 为0, 表 示 从 列 表 框 控 件 中 的 第 一 个 项 目 开 始 搜 索。 第 二 个 参 数 是 一 个NULL 结 束 的 字 符 串, 它 是 实 际 希 望 搜 索 的 项 目。


如 果 该LB_FINDSTRING 消 息 返 回 值-1, 则 表 明 在 列 表 框 控 件 中 没 有 找 到 目 标 字 符 串, 此 时 可 以 使 用AddItem 方 法 来 将 新 的 项 目 添 加 到 列 表 框 控 件 中。 如 果 该 项 目 已 经 在 列 表 中 存 在, 则 可 以 简 单 地 显 示 一 个 信 息 框 或 是 执 行 一 些 其 它 的 过 程, 来 通 知 用 户 一 个 重 复 的 项 目 已 经 在 列 表 框 控 件 中 存 在。


样 例 程 序

该 程 序 显 示 了 如 何 确 定 在 一 个 列 表 框 控 件 中 是 否 已 经 包 含 了 一 个 要 添 加 到 控 件 中 的 项 目。


1. 在Visual Basic 中 开 始 一 个 新 的 工 程, 采 用 缺 省 的 方 法 建 立Form1。

2. 将 如 下 常 量 和 声 明 语 句 添 加 到Form1 的 通 用 声 明 部 分 中( 注 意 该 声 明 语 句 需 要 被 书 写 在 一 行 内):

Private Declare Function SendMessageFind Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Integer, ByVal lParam As String) As Long

Const WM_USER = &H400

Const LB_ERR = (-1)

Const LB_FINDSTRING = &H18F


3. 将 如 下 代 码 添 加 到Form1 的Form_Load 事 件 中:


Private Sub Form_Load()

List1.AddItem "Item #1"

List1.AddItem "Item #2"

List1.AddItem "Item #3"

List1.AddItem "Item #4"

End Sub


4. 在Form1 上 添 加 一 个 文 本 框 控 件, 采 用 缺 省 的 方 法 建 立Text1。

5. 在Form1 上 添 加 一 个 列 表 框 控 件, 采 用 缺 省 的 方 法 建 立List1。

6. 在Form1 上 添 加 一 个 命 令 按 钮 控 件, 采 用 缺 省 的 方 法 建 立Command1, 将 起Caption 属 性 设 置 为“ 重 复”。

7. 将 如 下 代 码 添 加 到Command1 的 单 击 事 件 中:


Private Sub Command1_Click()

CheckForDupes

End Sub


8. 创 建 一 个 新 的 名 为CheckForDupes 的 函 数, 将 如 下 代 码 添 加 到 该 函 数 中:


Sub CheckForDupes()

Dim Ret As Long

Dim A As String

A = Text1.TEXT

Ret = SendMessageFind(List1.hwnd, LB_FINDSTRING, 0, (A))

If Ret = LB_ERR Then

List1.AddItem Text1.TEXT

Else

List1.ListIndex = Ret

MsgBox " 重 复 项 目 - 不 能 被 添 加 到 列 表 框 中", 16, " 错 误"

End If

End Sub


按 下F5 键 来 执 行 本 程 序。 在 列 表 框 控 件 中 有5 个 项 目。 在 文 本 框 控 件 中 键 入 一 个 新 的 项 目, 单 击 重 复 命 令 按 钮。 程 序 将 在 列 表 框 控 件 中 搜 索 刚 刚 键 入 到 文 本 框 控 件 中 的 项 目。 如 果 该 项 目 未 被 找 到, 则 程 序 将 把 该 项 目 添 加 到 列 表 框 控 件 中。 相 反, 如 果 该 项 目 已 经 在 列 表 框 中 存 在 了, 则 将 显 示 出 一 个 信 息 框 以 通 知 项 目 已 经 存 在。