发信人: aaaaaaaaa()
整理人: cobe(2000-02-13 00:10:58), 站内信件
|
编者的话
====================================================================
大家好!
欢迎大家回答问题和提出问题,同时也欢迎大家
提供有关VB和VBA和ASP的好作品。
我的主页巳更新欢迎大家访问:
goodvbhome.yeah.net
版主 冯德平
[email protected]
=============================================
VB邮件(6.27)
a 最小化成任务栏上的图标
建立一个表单Name为test,Caption为任务栏功能演示,
在表单中放入Label1,Label2,Label3。
Label1的Caption为 To: 冯德平
Label2的Caption为 goodvbhome.yeah.net
Label3的Caption 为 From: [email protected]
在Module1 中加入如下代码:
Option Explicit
Public Const NIM_ADD As Variant = &H0
Public Const NIM_DELETE As Variant = &H2
Public Const NIM_MODIFY As Variant = &H1
Public Const NIF_MESSAGE = &H1 '消息合法。
Public Const NIF_ICON = &H2 '图标句柄合法。
Public Const NIF_TIP = &H4 '提示合法。
'定义MouseMove消息,该消息将被发送到
'窗体的MouseMove事件处理函数中处理。
Public Const WM_MOUSEMOVE = &H200
'定义鼠标消息常数
Public Const WM_LBUTTONDBLCLK = &H203
Public Const WM_LBUTTONDOWN = &H201
Public Const WM_LBUTTONUP = &H202
Public Const WM_RBUTTONDBLCLK = &H206
Public Const WM_RBUTTONDOWN = &H204
Public Const WM_RBUTTONUP = &H205
Public Type NOTIFYICONDATA
cbSize As Long
hwnd As Long
uID As Long
uFlags As Long
uCallbackMessage As Long
hIcon As Long
szTip As String * 64
End Type
Public Declare Function Shell_NotifyIcon Lib "shell32.dll" Alias "Shel l_NotifyIconA" (ByVal dwMessage As Long, lpData As NOTIFYICONDATA) As Long
在Form中加入如下代码:
Option Explicit
Dim TRAYDATA As NOTIFYICONDATA
Private Sub toTray()
With TRAYDATA
.cbSize = Len(TRAYDATA)
.hwnd = Me.hwnd '句柄
.hIcon = Me.Icon '图标
'告诉图标发送MouseMove消息
'以后的消息在MouseMove事件中返回,X为消息代码
.uCallbackMessage = WM_MOUSEMOVE
.uID = 1& '定义图标号
.uFlags = NIF_ICON Or NIF_TIP Or NIF_MESSAGE
.szTip = "冯德平,你好" & Chr(0) '定义提示
'必须如此,才能callback
Me.ScaleMode = vbPixels
If Shell_NotifyIcon(NIM_ADD, TRAYDATA) = 0 Then MsgBox "不能创 建图标!"
End With
End Sub
Private Sub outTray()
If Shell_NotifyIcon(NIM_DELETE, TRAYDATA) = 0 Then MsgBox "不能删除 图标!"
Me.ScaleMode = vbTwips
End Sub
Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As S ingle, Y As Single)
'X中返回消息(long型)
Select Case CLng(X)
Case WM_LBUTTONDBLCLK '左键双击
'这三行的顺序一定不能改!!
Me.WindowState = vbNormal
Me.Visible = True
Call outTray
Case WM_LBUTTONDOWN '左键下
Case WM_LBUTTONUP '左建起
Case WM_RBUTTONDBLCLK '右键双击
Case WM_RBUTTONDOWN '右键下
MsgBox "右键下"
Case WM_RBUTTONUP '右键起
End Select
End Sub
Private Sub Form_Resize()
If Me.WindowState = vbMinimized Then
Me.Visible = False
Call toTray
End If
End Sub
作者: puzzlebird
信箱: [email protected]
b 编 写 直 接 使 用ODBC API 访 问ODBC 数 据 库 的VB 程 序
---- 开 放 数 据 库 互 连(ODBC) 已 经 成 为Client /Server 数 据 库 应 用 系 统 中 访 问 远 程 数 据 库 的 一 个 标 准。 做 为 强 大 的 前 端 开 发 工 具,MS Visual Basic 为 开 发 者 提 供 了 多 种 访 问ODBC 数 据 源 的 途 径, 如JET 数 据 库 引 擎、ODBC API 函 数、RDO 接 口 等 。 比 较 而 言, 直 接 使 用ODBC API 函 数 的 编 程 难 度 最 大, 但 由 此 获 得 的 存 取 数 据 库 的 性 能 也 是 最 佳。 诚 然,VB 4.0 企 业 版 提 供 的RDO 接 口 的 性 能 已 经 接 近ODBC API, 但 是 遗 憾 的 是 , 这 个 接 口 只 能 在32 位Windows 环 境 中 运 行, 而ODBC API 函 数 则 没 有 这 个 限 制。
ODBC API 函 数 的 声 明 方 法 ---- 与 使 用 其 它 动 态 库 函 数 一 样 , 在VB 中 使 用ODBC API 函 数 之 前, 必 须 事 先 声 明 将 要 使 用 的 函 数、 常 量 和 数 据 结 构。ODBC API 函 数 驻 留 在ODBC 运 行 动 态 库ODBC.DLL(16 位) 或ODBC32.DLL(32 位) 中, 该 动 态 库 位 于Windo ws 子 目 录system 中。 通 常 做 法 是 在VB 项 目 中 单 独 使 用 一 个 模 块 文 件, 然 后 将ODBC API 声 明 语 句 加 入 其 中, 如 下 所 示, 就 是 本 文 实 例 中 使 用 的 模 块 文 件module1.bas 的 内 容:
---- Declare Function SQLAllocEnv Lib "odbc32.dll" (phenv&) As Integer
---- Declare Function SQLAllocConnect Lib "odbc32.dll" (ByVal henv&, p hdbc&) As Integer
---- Declare Function SQLAllocStmt Lib "odbc32.dll" (ByVal hdbc&, phst mt&) As Integer
---- Declare Function SQLConnect Lib "odbc32.dll" (ByVal hdbc&, ByVal szDSN$, ByVal cbDSN%, ByVal szUID$, ByVal cbUID%, ByVal szAuthStr$, By Val cbAuthStr%) As Integer
---- Declare Function SQLColAttributesString Lib "odbc32.dll" Alias "S QLColAttributes" (ByVal hstmt&, ByVal icol%, ByVal fDescType%, ByVal r gbDesc As String, ByVal cbDescMax%, pcbDesc%, pfDesc&) As Integer
---- Declare Function SQLDisconnect Lib "odbc32.dll" (ByVal hdbc&) As Integer
---- Declare Function SQLExecDirect Lib "odbc32.dll" (ByVal hstmt&, By Val szSqlStr$, ByVal cbSqlStr&) As Integer
---- Declare Function SQLFetch Lib "odbc32.dll" (ByVal hstmt&) As Inte ger
---- Declare Function SQLFreeConnect Lib "odbc32.dll" (ByVal hdbc&) As Integer
---- Declare Function SQLFreeEnv Lib "odbc32.dll" (ByVal henv&) As Int eger
---- Declare Function SQLFreeStmt Lib "odbc32.dll" (ByVal hstmt&, ByVa l fOption%) As Integer Declare Function SQLGetData Lib "odbc32.dll" (B yVal hstmt&, ByVal icol%, ByVal fCType%, ByVal rgbValue As String, ByV al cbValueMax&, pcbValue&) As Integer
---- Declare Function SQLNumResultCols Lib "odbc32.dll" (ByVal hstmt&, pccol%) As Integer
---- Global Const SQL_C_CHAR As Long = 1
---- Global Const SQL_COLUMN_LABEL As Long = 18
---- Global Const SQL_DROP As Long = 1
---- Global Const SQL_ERROR As Long = -1
---- Global Const SQL_NO_DATA_FOUND As Long = 100
---- Global Const SQL_SUCCESS As Long = 0
---- 需 要 说 明 的 是, 在 函 数 声 明 时, 应 该 根 据 程 序 的 运 行 环 境 选 择 相 应 的 动 态 库。 在VB 子 目 录samples\remauto\db_odbc 中 有 两 个 正 文 文 件ODBC16.TXT 和ODBC32.TXT, 分 别 存 有 所 有16 位 和32 位ODBC API 函 数、 常 量 和 数 据 结 构 的 声 明 语 句, 编 程 时 可 以 从 中 拷 贝 所 需 的 声 明 语 句。
使 用ODBC API 的 编 程 方 法 ---- 在VB 中 调 用ODBC API 函 数 访 问ODB C 数 据 库, 代 码 编 制 一 般 是 按 照 下 列 过 程 进 行 的:
一、 初 始 化ODBC
---- 在 这 个 过 程 中, 应 用 程 序 将 通 过 调 用SQLAlloEnv 函 数 初 始 化ODBC 接 口, 获 取ODBC 环 境 句 柄。ODBC 环 境 句 柄 是 其 它 所 有ODBC 资 源 句 柄 的 父 句 柄, 因 此 无 论 程 序 将 建 立 多 少 个O DBC 连 接, 这 个 过 程 只 需 执 行 一 次 即 可。 例 如:
---- Dim rc As Integer 'ODBC 函 数 的 返 回 码
---- Dim henv As Long 'ODBC 环 境 句 柄
---- rc = SQLAllocEnv(henv) ' 获 取ODBC 环 境 句 柄
二、 与ODBC 数 据 源 建 立 连 接
---- 这 个 过 程 由 下 列 两 个 步 骤 组 成:
---- 1、 调 用SQLAllocConnect 函 数 获 取 连 接 句 柄。 例 如:
---- Dim hdbc As Long ' 连 接 句 柄
---- rc = SQLAllocConnect(henv, hdbc) ' 获 取 连 接 句 柄
---- 2、 建 立 连 接。 这 个 步 骤 可 以 通 过 多 种 方 法 实 现, 最 简 单 直 观 的 方 法 是 调 用SQLConnect 函 数。 例 如:
---- Dim DSN As String, UID As String, PWD As String
---- DSN = "DataSourceName" 'ODBC 数 据 源 名 称
---- UID = "UserID" ' 用 户 帐 号
---- PWD = "Password" ' 用 户 口 令
---- rc = SQLConnect(hdbc, DSN, Len(DSN), UID, Len(UID), PWD, Len(PWD) ) ' 建 立 连 接
三、 存 取 数 据
---- 用 户 对ODBC 数 据 源 的 存 取 操 作, 都 是 通 过SQL 语 句 实 现 的。 在 这 个 过 程 中, 应 用 程 序 将 通 过 连 接 向ODBC 数 据 库 提 交SQL 语 句, 以 完 成 用 户 请 求 的 操 作。 具 体 步 骤 如 下:
---- 1、 调 用SQLAllocStmt 函 数 获 取 语 句 句 柄。 例 如:
---- Dim hstmt As Long
---- rc = SQLAllocStmt(hdbc, hstmt)
---- 2、 执 行SQL 语 句。 执 行SQL 语 句 的 方 法 比 较 多, 最 简 单 明 了 的 方 法 是 调 用SQLAllocStmt 函 数, 例 如:
---- Dim SQLstmt As String
---- SQLstmt = "SELECT * FROM authors"
---- rc = SQLExecDirect(hstmt, SQLstmt, Len(SQLstmt))
四、 检 索 结 果 集
---- 如 果SQL 语 句 被 顺 利 提 交 并 正 确 执 行, 那 么 就 会 产 生 一 个 结 果 集。 检 索 结 果 集 的 方 法 有 很 多, 最 简 单 最 直 接 的 方 法 是 调 用SQLFetch 和SQLGetData 函 数。SQLFetch 函 数 的 功 能 是 将 结 果 集 的 当 前 记 录 指 针 移 至 下 一 个 记 录,SQLGetData 函 数 的 功 能 是 提 取 结 果 集 中 当 前 记 录 的 某 个 字 段 值。 通 常 可 以 采 用 一 个 循 环 以 提 取 结 果 集 中 所 有 记 录 的 所 有 字 段 值, 该 循 环 重 复 执 行SQLFetch 和SQLGetData 函 数, 直 至SQLFetc h 函 数 返 回SQL_NO_DATA_FOUND, 这 表 示 已 经 到 达 结 果 集 的 末 尾 。
---- Dim ColVal As String * 225
---- ColVal = String(255, 0)
---- Do Until SQLFetch(hstmt) = SQL_NO_DATA_FOUND
---- rc = SQLGetData(hstmt, i, SQL_C_CHAR, ColVal, Len(ColVal), SQL_NU LL_DATA)
---- Loop
五、 结 束 应 用 程 序
---- 在 应 用 程 序 完 成 数 据 库 操 作, 退 出 运 行 之 前, 必 须 释 放 程 序 中 使 用 的 系 统 资 源。 这 些 系 统 资 源 包 括: 语 句 句 柄、 连 接 句 柄 和ODBC 环 境 句 柄。 完 成 这 个 过 程 的 步 骤 如 下 :
---- 1、 调 用SQLFreeStmt 函 数 释 放 语 句 句 柄 及 其 相 关 的 系 统 资 源。 例 如:
---- rc = SQLFreeStmt(hstmt, SQL_DROP)
---- 2、 调 用SQLDisconnect 函 数 关 闭 连 接。 例 如:
---- rc = SQLDisconnect(hdbc)
---- 3、 调 用SQLFreeConnect 函 数 释 放 连 接 句 柄 及 其 相 关 的 系 统 资 源。 例 如:
---- rc = SQLFreeConnect(hdbc)
---- 4、 调 用SQLFreeEnv 函 数 释 放 环 境 句 柄 及 其 相 关 的 系 统 资 源, 停 止ODBC 操 作。 例 如:
---- rc = SQLFreeEnv(henv)
---- 此 外, 在 编 制 程 序 时 还 有 一 个 需 要 重 点 考 虑 的 问 题, 这 就 是 错 误 处 理。 所 有ODBC API 函 数, 若 在 执 行 期 间 发 生 错 误, 都 将 返 回 一 个 标 准 错 误 代 码SQL_ERROR。 一 般 来 讲, 在 每 次 调 用ODBC API 函 数 之 后, 都 应 该 检 查 该 函 数 返 回 值, 确 定 该 函 数 是 否 成 功 地 执 行, 再 决 定 是 否 继 续 后 续 过 程 。 而 详 细 的 错 误 信 息, 可 以 调 用SQLError 函 数 获 得。SQLError 函 数 将 返 回 下 列 信 息:
标 准 的ODBC 错 误 状 态 码
ODBC 数 据 源 提 供 的 内 部 错 误 编 码
错 误 信 息 串
简 单 应 用 实 例 ---- 本 实 例 将 编 制 一 个 客 户 机 端VB 应 用 程 序, 通 过Windows NT 局 域 网 查 询 服 务 器 端MS SQL Server 6.5 样 板 数 据 库PUBS 中 的AUTHORS 数 据 表, 并 在 一 个Grid 控 件 中 显 示 查 询 结 果。 首 先, 使 用Windows 控 制 面 板 中 的ODBC 驱 动 管 理 器 新 建 一 个ODBC 数 据 源, 定 义 数 据 源 名 称 为ODBC_API_DEMO, 定 义 登 录 数 据 库 为PUBS, 其 它 信 息 应 根 据 用 户 的 环 境 正 确 设 置。 然 后, 启 动VB, 新 建 一 个 项 目Project1, 在 缺 省 窗 体Form1 中 加 入 一 个Grid 控 件Grid1、 两 个CommandButton 控 件cmdQuery 和cm dClose, 在Project1 中 插 入 一 个 模 块Module1, 将 前 面 列 举 的 声 明 语 句 加 入 其 中。 程 序 代 码 如 下:
Private Sub Form_Load()
Dim rc As Integer
rc = SQLAllocEnv(henv)
If rc <> 0 Then
MsgBox " 无 法 初 始 化ODBC"
End
End If
rc = SQLAllocConnect(henv, hdbc)
If rc <> 0 Then
MsgBox " 无 法 获 得 连 接 句 柄"
rc = SQLFreeEnv(henv)
End
End If
Dim DSN As String, UID As String, PWD As String
DSN = "ODBC_API_DEMO"
UID = "guest"
PWD = ""
rc = SQLConnect(hdbc, DSN, Len(DSN), UID, Len(UID), PWD, Len(UID))
If rc = SQL_ERROR Then
MsgBox " 无 法 建 立 与ODBC 数 据 源 的 连 接"
End
End If
End Sub
Private Sub cmdQuery_Click()
Dim hstmt As Long
Dim SQLstmt As String
Dim RSCols As Integer, RSRows As Long
Dim rc As Integer, i As Integer, j As Integer
Dim ColVal As String * 1024
Dim ColValLen As Long, ColLabLen As Integer, larg As Long
rc = SQLAllocStmt(hdbc, hstmt)
If rc <> SQL_SUCCESS Then
MsgBox " 无 法 获 得SQL 语 句 句 柄"
Exit Sub
End If
SQLstmt = "SELECT * FROM authors"
rc = SQLExecDirect(hstmt, SQLstmt, Len(SQLstmt))
If rc <> SQL_SUCCESS Then
MsgBox "SQL 语 句 执 行 失 败"
Exit Sub
End If
rc = SQLNumResultCols(hstmt, RSCols)
If RSCols > 1 Then
Grid1.Cols = RSCols
Grid1.Rows = 10
Grid1.Row = 0
Else
Exit Sub
End If
For i = 1 To RSCols
rc = SQLColAttributesString(hstmt, i, SQL_COLUMN_LABEL,
ColVal, 255, ColLabLen, larg)
Grid1.Col = i - 1
Grid1.Text = Left(ColVal, ColLabLen)
Next i
Do Until SQLFetch(hstmt) = SQL_NO_DATA_FOUND
ColVal = String$(1024, 0)
If Grid1.Row + 1 >= Grid1.Rows Then
Grid1.Rows = Grid1.Rows + 1
End If
Grid1.Row = Grid1.Row + 1
For i = 1 To RSCols
rc = SQLGetData(hstmt, i, SQL_C_CHAR, ColVal,
Len(ColVal), ColValLen)
Grid1.Col = i - 1
Grid1.Text = Left$(ColVal, ColValLen)
Next i
Loop
rc = SQLFreeStmt(hstmt, SQL_DROP)
End Sub
Private Sub cmdClose_Click()
Dim rc As Integer
If hdbc <> 0 Then
rc = SQLDisconnect(hdbc)
End If
rc = SQLFreeConnect(hdbc)
If henv <> 0 Then
rc = SQLFreeEnv(henv)
End If
End
End Sub
---- 实 例 程 序 是 使 用Visual Basic 4.0 在Windows 95 环 境 下 开 发 的。
usdollarA 推荐
c 编译VB程序时不要自动使用快速代码优化
如果你第一次使用 VB 的本地代码优化选项,你可能会立即尝试选择“优化 代码选项”。可是,你知道吗?这样做并不一定保证使你的程序得到最佳性能。
除非你拥有大量内存,不然程序的性能优化一般不会运行很快。因为这将导 致程序装载速度缓慢,在内存不足的机器上特别明显,这样“优化代码选项”就 可能让你的用户觉得好象比“优化大小选项”还慢。
基于以上原因,你可以考虑用 P 代码编译你的程序,特别是大型的、UI 和 数据库加强的程序。本地“优化代码选项”所获得的性能并不一定可以弥补程序 增长大小后带来的问题。
要决定你到底适合那种编译方式,请使用 VB 企业版上的 Application Per formance Explorer (APE) 。
hencefuty 推荐
=============================================
VB问答
问题部分:
回答部分:
=============================================
其它
主页goodvbhome.yeah.net巳更新,新增了VB网址集锦的第四页,过去发表的VB邮 件巳全部放在主页上了。
====================================================================
欢迎订阅VB免费邮件:
订阅地址 http://server.com/WebApps/mail-list-subscribe.cgi?id=16852
====================================================================
如果您觉得这个邮件列表好的话,请告诉您的朋友。
====================================================================
欢迎投稿 [email protected]
====================================================================
网易上的主页地址:http://www4.netease.com/~aaaaaaaaa
本网站主页镜像地址:goodvbhome.yeah.net
====================================================================
-- 欢迎访问主页:goodvbhonme.yeah.net
或:http://www4.netease.com/~aaaaaaaaa
http://personal.gz168.gnet.gd.cn/vbok/
※ 来源:.月光软件站 http://www.moon-soft.com.[FROM: 202.103.47.178]
|
|