VB程式設計經驗點滴

ljm0211發表於2012-06-28
---- 欣 喜 看 到VB 編 程 人 和 愛 好 者 的 陣 營 越 來 越 大 了, 而 現 在VB6 也 已 經 橫 空 出 世 了, 在 這 裡 獻 上 自 己 的 一 點VB5 編 程 的 小 經 驗, 權 當 和 廣 大 朋 友 交 流 交 流, 不 妥 之 處 多 多 指 教。

---- 1. 在 打 開 對 話 框 中 同 時 顯 示 多 種 類 型 的 文 件

---- 在 打 開 文 件 時, 我 們 往 往 會 用 到 打 開 對 話 框CommonDialog, 要 把 文 件 類 型 限 制 在 一 定 的 範 圍 內 得 用CommonDialog 的Filter 屬 性, 比 如 將Filter 屬 性 設 置 為"*.TXT|*.TXT" 那 麼 打 開 對 話 框 只 顯 示 文 本 文 件。 如 果 要 同 時 顯 示 幾 種 類 型 的 文 件, 比 如 要 顯 示 所 有 的 圖 形 文 件, 其 設 置 方 法 為 將Filter 屬 性 設 置 為" 圖 片 文 件|*.bmp;*.jpg;*.gif", 這 樣 打 開 對 話 框 便 能 同 時 顯 示bmp 文 件,jpg 文 件,gif 文 件。 這 個 問 題 似 乎 很 簡 單, 可 筆 者 曾 經 為 這 個 問 題 查 閱 了 大 量 關 於VB 的 書 籍, 但 是 都 未 找 到。

---- 2. 注 意 最 後 編 譯 的 問 題

---- 如 果 編 程 中 用 到 數 據 庫 控 件, 在 最 後 編 譯 時, 一 定 要 注 意 數 據 庫 控 件 的Datebase 屬 性, 否 則 會 在 制 作 安 裝 盤, 裝 到 其 它 機 子 上 時 遇 到 問 題。 原 因 是Datebase 屬 性 中 存 在 的 路 徑 問 題。 編 譯 前 得 將 其 路 徑 設 置 為 當 前 路 徑。 如 果 用 的 是ACCESS 數 據 庫, 將Datebase 屬 性 中 的 路 徑 信 息 去 掉 便 可 以 了, 比 如, 原 先 為"C:\money\money.mdb", 則 改 為"money.mdb"。 如 果 是FOXPRO 數 據, 將Datebase 屬 性 改 為"." 便 可 以 了,"." 就 代 表 當 前 目 錄。 比 如, 原 先 為"C:\money", 改 為"." 便 可 以 了。 用 其 它 數 據 庫 的 數 據 的 方 法 差 不 多。 當 然 制 作 安 裝 盤 時 得 把 用 到 的 數 據 文 件 添 加 進 去, 這 裡 不 在 詳 敘。

---- 3. 在 程 序 中 調 用 其 它 程 序

---- 在DOS 下 大 家 知 道 可 以 用system() 函 數 來 調 用 其 它 的 可 執 行 文 件, 那 麼 在WINDOWS 下 怎 麼 去 調 用 其 它 的 軟 件 呢? 其 實 在WINDOWS 的API 中 就 有 這 樣 的 函 數。 函 數 說 明 如 下:

UINT WinExec(
LPCSTR lpszCmdLine,    // 命令列地址
UINT fuCmdShow     //剛開啟時的視窗型別
);

---- 在 使 用 時 要 加 如 下 聲 明:

Private Declare Function WinExec Lib "kernel32"
(ByVal lpCmdLine As String,
ByVal nCmdShow As Long) As Long

---- 如 果 想 在 程 序 中 調 用Windows 中 自 帶 的 計 算 器, 用 下 面 的 代 碼 即 可 實 現:

WinExec "c:/windows/calc.exe", 10

---- 參 數10 使 啟 動 的 窗 口 處 於 缺 省 狀 態, 若 使 用3 使 啟 動 的 窗 口 最 大 化, 若 使 用6 使 啟 動 的 窗 口 最 小 化。 實 際 上 許 多 商 用 軟 件 的 計 算 器 都 是 這 樣 直 接 調 用Windows 自 帶 的 計 算 器 的。

---- 4. 輸 入 數 據 的 合 法 性 檢 測

---- 一 個 軟 件 經 常 需 要 用 戶 輸 入 一 些 數 據, 而 這 些 數 據 往 往 需 要 一 定 格 式, 比 如 輸 入 的 是 一 個 整 形, 或 是 一 個 日 期 等, 這 樣 作 為 軟 件 的 設 計 者 必 須 想 到 用 戶 出 錯 的 可 能 性, 在 用 戶 出 錯 時 給 予 提 示 和 糾 正。 只 有 這 樣 你 的 程 序 才 是 一 個 好 程 序。 在VB 編 程 中 數 據 的 合 法 性 檢 測 有 很 多 的 方 法, 比 如 你 可 以 利 用 一 些 函 數 來 檢 測 數 據 的 合 法 性,IsDate 就 可 以 用 於 檢 測 日 期 型 的 數 據。 筆 者 發 現 只 要 巧 妙 地 應 用VB 中 的 錯 誤 陷 阱 技 術 和VB 的 不 同 類 型 數 據 間 的 自 動 轉 換 功 能 就 能 很 好 地 實 現 數 據 的 合 法 性 檢 測, 編 程 簡 單 而 且 效 果 很 好, 能 檢 測 各 種 類 型 的 數 據。

---- 通 常 輸 入 的 如 果 是 字 符 串 就 不 需 要 檢 測, 但 如 果 要 求 輸 入 的 是 整 形 或 貨 幣 形 等 就 必 須 進 行 一 定 的 檢 測。 下 面 就 先 講 一 下 整 形 的 檢 測。 比 如 現 有 一 文 本 框(Text1), 要 求 輸 入 的 是 一 個 整 數, 我 們 可 以 在 它 的LostFocus 事 件 中 進 行 檢 測, 代 碼 如 下:

Private Sub Text1_LostFocus()
Dim i As Integer '定義一個整形i
On Error GoTo ERROR1
'設定錯誤陷阱,如果Text1.Text不是整數跳到ERROR1
i = Text1.Text
'這裡可以做其它處理
Exit Sub
ERROR1:
MsgBox ("請輸入一個整數")
Text1.SetFocus
End Sub

---- 這 樣 就 可 以 實 現 合 法 性 檢 測 了, 如 果 要 的 是 浮 點 就 將i 定 義 成 浮 點 就 可 以 了, 即:

Private Sub Text1_LostFocus()
Dim i As Single
On Error GoTo ERROR1
i = Text1.Text
Exit Sub
ERROR1:
MsgBox ("請輸入一個單精度浮點數")
Text1.SetFocus
End Sub

---- 同 理, 如 果 要 的 是 日 期 就 將i 定 義 成 日 期 就 可 以 了, 就 是 說, 要 什 麼 樣 的 數 據 就 將i 定 義 成 什 麼 樣 的 數 據 類 型 就 可 以 了。

---- 當 然 你 不 一 定 要 在LostFocus 事 件 中 對 數 據 的 合 法 性 進 行 檢 測, 如 果 是 制 作 數 據 庫 應 用 程 序 完 全 可 以 在 數 據 被 添 加 到 數 據 庫 之 前 再 對 數 據 進 行 檢 測, 這 樣 對 用 戶 將 更 加 方 便。

---- 5. 窗 體 以 外 光 標 位 置 的 探 測 和 設 置

---- 用VB 編 程 時 想 獲 得 窗 體 上 的 光 標 位 置 很 容 易, 用MouseMove 事 件 的 參 數 就 可 得 到 光 標 在 窗 體 上 的 位 置。 然 而, 如 果 想 得 到 窗 體 以 外 的 光 標 位 置 或 想 在 程 序 中 設 置 光 標 位 置, 那 麼 則 只 好 求 助 於API 了, 還 好, 這 幾 個API 函 數 非 常 簡 單, 即 使 剛 接 觸 編 程 的 朋 友 也 能 學 會 使 用。 這 裡 筆 者 做 一 個 簡 單 的 介 紹, 希 望 和 大 家 共 享 使 用API 的 樂 趣。

---- 先 介 紹 一 下 有 關 的API 的 結 構 和 函 數, 首 先 看 一 下 獲 得 光 標 位 置 的 這 個 函 數, 其 聲 明 如 下:

BOOL GetCursorPos(
LPPOINT lpPoint
//指向POINT結構的指標,其中包含所獲的游標的位置資訊
);   
再來看一下POINT的結構:
typedef struct tagPOINT { // pt
LONG x;
LONG y;
} POINT;
真是非常簡單,最後看一下設定游標位置的函式:
BOOL SetCursorPos(
int X,    //要設定位置在螢幕上的橫座標
int Y     //要設定位置在螢幕上的縱座標
);

---- 在VB 中 使 用API 就 需 要 一 定 的 說 明 了, 還 好VB 提 供 了 一 個"API 文 本 查 看 器", 你 只 要 將 所 要 用 的API 的 聲 明 復 制 一 下 就 可 以 用 了。 我 們 來 做 一 個 簡 單 的 例 子 來 試 一 試。 先 建 立 一 個 項 目, 往 窗 體(Form1) 上 放 置 兩 個TextBox 控 件(Text1 和Text2), 一 個CommandButton 控 件(Command1) 和 一 個Timer 控 件(Timer1)。 將Timer1 的Interval 屬 性 改 為1000。 這 個 例 子 的 功 能 是 每 隔 一 秒 鍾 在Text1 和Text2 中 顯 示 光 標 的 位 置 坐 標, 按Command1 按 鈕 光 標 將 按 一 定 的 規 律 在 屏 幕 上 漂 移。 所 有 的 代 碼 如 下:

Private Type POINTAPI
x As Long
y As Long
End Type
Private Declare Function GetCursorPos
Lib "user32" (lpPoint As POINTAPI) As Long
Private Declare Function SetCursorPos
Lib "user32" (ByVal x As Long, ByVal y As Long) As Long
'以上為API及資料結構的宣告

Private Sub Command1_Click()
Dim i As Integer
Dim j As Integer
For i = 0 To Screen.Width
SetCursorPos i, 100 '設定游標位置
For j = 0 To 1000 '迴圈延時
Next j
Next i
End Sub

Private Sub Timer1_Timer()
Dim point1 As POINTAPI
GetCursorPos point1 '獲得游標位置
Text1.Text = point1.x '顯示游標位置X
Text2.Text = point1.y '顯示游標位置Y
End Sub

---- 輸 入 完 畢 後 存 盤 運 行 就 行 了, 可 以 發 現 在VB 中 是 很 容 易 實 現 的。

---- 6.Windows 各 種 路 徑 的 獲 得

---- 在WINDOWS 下 編 程 經 常 需 要 在 程 序 中 獲 得 各 種 路 徑, 比 如 當 前 的 工 作 路 徑, 系 統 的 路 徑, 等 各 種 路 徑。 在WINDOWS 的API 中 提 供 了 齊 全 的API 函 數 供 我 們 調 用。

---- 先 來 看 一 下 這 幾 個API 函 數 的 說 明:

---- (1). DWORD GetCurrentDirectory(

DWORD nBufferLength,    //接收目錄的字串的長度
LPTSTR lpBuffer     //接收目錄的字串的地址
);

---- 通 過 調 用 這 個 函 數 將 獲 得 當 前 的 目 錄, 如 果 調 用 失 敗 此 函 數 將 返 回 零。 調 用 這 個 函 數 時 應 將nBufferLength 參 數 設 足 夠 大, 接 收 目 錄 的 字 符 串 當 然 也 要 有 這 麼 長。 詳 細 用 法 請 看 例 子。 另 外 用SetCurrentDirectory() 函 數 可 以 設 置 當 前 目 錄。

---- (2). UINT GetSystemDirectory(

LPTSTR lpBuffer,    //接收目錄的字串的地址
UINT uSize     // 接收目錄的字串的長度
);

---- 通 過 調 用 這 個 函 數 可 獲 得 系 統 的 目 錄, 如 果 調 用 失 敗 此 函 數 將 返 回 零。

---- 3. UINT GetWindowsDirectory(

LPTSTR lpBuffer,    //接收目錄的字串的地址
UINT uSize     // 接收目錄的字串的長度
);

---- 通 過 調 用 這 個 函 數 可 獲 得WINDOWS 目 錄, 如 果 調 用 失 敗 將 返 回 零。 關 於 這 個 函 數 和 第 二 個 函 數 的 區 別, 通 過 下 面 的 例 子 你 一 定 會 非 常 清 楚。

---- 下 面 用VB 來 實 現。 首 先 當 然 要 先 把API 的 聲 明 加 到 代 碼 中, 開 始 一 個 新 項 目, 在 窗 體(Form1) 上 放 上 三 個 按 鈕(Command1,Command2,Command3)。 這 個 例 子 的 功 能 是 單 擊 按 鈕 用MSGBOX 顯 示 得 到 的 路 徑。

---- 筆 者 發 現 不 能 簡 單 地 復 制VB5 的API 文 本 查 看 器 中 關 於 上 面 幾 個API 的 聲 明, 要 做 一 定 的 修 改, 要 在 每 個 函 數 名 後 加 一 個"A", 所 有 代 碼 如 下。

Private Declare Function GetCurrentDirectoryA
Lib "kernel32" (ByVal nBufferLength As Long,
ByVal lpBuffer As String) As Long
Private Declare Function GetWindowsDirectoryA
Lib "kernel32" (ByVal lpBuffer As String,
ByVal nSize As Long) As Long
Private Declare Function GetSystemDirectoryA
Lib "kernel32" (ByVal lpBuffer As String,
ByVal nSize As Long) As Long

Private Sub Command1_Click()
Dim Path As String * 255
GetCurrentDirectoryA(Len(Path), Path) '獲取當前路徑
MsgBox (Path)
End Sub

Private Sub Command2_Click()
Dim Path As String * 255
GetWindowsDirectoryA(Path, Len(Path)) '獲取WINDOWS路徑
MsgBox (Path)
End Sub

Private Sub Command3_Click()
Dim Path As String * 255
GetSystemDirectoryA(Path, Len(Path)) '獲取SYSTEM路徑
MsgBox (Path)
End Sub

---- 7. 錯 誤 陷 阱 中 要 注 意 的 問 題

---- 筆 者 發 現 在 循 環 中 應 用 錯 誤 陷 阱 技 術 有 一 定 的 問 題。 比 如 下 面 這 一 段 程 序:

Private Sub Command1_Click()
Dim I As Integer
Dim J As Integer
On Error GoTo JERROR
For I = 0 To 3
MsgBox (I)
J = 10000 * 10000 '讓J發生溢位錯誤
JERROR:
Next I
End Sub

---- 按 通 常 的 分 析, 這 段 程 序 在 運 行 時 應 該 是 不 會 出 現 錯 誤 的, 但 實 際 運 行 一 下 可 以 發 現, 當I 等 於1 時 發 生 溢 出 錯 誤。 這 就 是 說 錯 誤 陷 阱 只 在 循 環 的 第 一 次 有 效。 這 個 問 題 很 值 得 注 意, 否 則 會 給 程 序 留 下 一 個 很 大 的 臭 蟲。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/11411056/viewspace-733995/,如需轉載,請註明出處,否則將追究法律責任。

相關文章