----欣喜看到VB編程人和愛好者的陣營越來越大了,而現在VB6也已經橫空出世了,在這裡獻上自己的一點VB5編程的小經驗,權當和廣大朋友交流交流,不妥之處多多指教。
----1.在打開對話框中同時顯示多種類型的文件
----在打開文件時,我們往往會用到打開對話框CommonDialog,要把文件類型限制在一定的范圍內得用CommonDialog的Filter屬性,比如將Filter屬性設置為"*.TXT|*.TXT"那麼打開對話框只顯示文本文件。如果要同時顯示幾種類型的文件,比如要顯示所有的圖形文件,其設置方法為將Filter屬性設置為"圖片文件|*.bmp;*.jpg;*.gif",這樣打開對話框便能同時顯示bmp文件,jpg文件,gif文件。這個問題似乎很簡單,可筆者曾經為這個問題查閱了大量關於VB的書籍,但是都未找到。
----2.注意最後編譯的問題
----如果編程中用到數據庫控件,在最後編譯時,一定要注意數據庫控件的Datebase屬性,否則會在制作安裝盤,裝到其它機子上時遇到問題。原因是Datebase屬性中存在的路徑問題。編譯前得將其路徑設置為當前路徑。如果用的是ACCESS數據庫,將Datebase屬性中的路徑信息去掉便可以了,比如,原先為"C:moneymoney.mdb",則改為"money.mdb"。如果是FOXPRO數據,將Datebase屬性改為"."便可以了,"."就代表當前目錄。比如,原先為"C:money",改為"."便可以了。用其它數據庫的數據的方法差不多。當然制作安裝盤時得把用到的數據文件添加進去,這裡不在詳敘。
----3.在程序中調用其它程序
----在DOS下大家知道可以用system()函數來調用其它的可執行文件,那麼在WINDOWS下怎麼去調用其它的軟件呢?其實在WINDOWS的API中就有這樣的函數。函數說明如下:
UINTWinExec(
LPCSTRlpszCmdLine,//命令行地址
UINTfuCmdShow//剛打開時的窗口類型
);
----在使用時要加如下聲明:
PrivateDeclareFunctionWinExecLib"kernel32"(ByVallpCmdLineAsString,ByValnCmdShowAsLong)AsLong
----如果想在程序中調用Windows中自帶的計算器,用下面的代碼即可實現:
WinExec"c:/windows/calc.exe",10
----參數10使啟動的窗口處於缺省狀態,若使用3使啟動的窗口最大化,若使用6使啟動的窗口最小化。實際上許多商用軟件的計算器都是這樣直接調用Windows自帶的計算器的。
----4.輸入數據的合法性檢測
----一個軟件經常需要用戶輸入一些數據,而這些數據往往需要一定格式,比如輸入的是一個整形,或是一個日期等,這樣作為軟件的設計者必須想到用戶出錯的可能性,在用戶出錯時給予提示和糾正。只有這樣你的程序才是一個好程序。在VB編程中數據的合法性檢測有很多的方法,比如你可以利用一些函數來檢測數據的合法性,IsDate就可以用於檢測日期型的數據。筆者發現只要巧妙地應用VB中的錯誤陷阱技術和VB的不同類型數據間的自動轉換功能就能很好地實現數據的合法性檢測,編程簡單而且效果很好,能檢測各種類型的數據。
----通常輸入的如果是字符串就不需要檢測,但如果要求輸入的是整形或貨幣形等就必須進行一定的檢測。下面就先講一下整形的檢測。比如現有一文本框(Text1),要求輸入的是一個整數,我們可以在它的LostFocus事件中進行檢測,代碼如下:
PrivateSubText1_LostFocus()
DimiAsInteger'定義一個整形i
OnErrorGoToERROR1
'設置錯誤陷阱,如果Text1.Text不是整數跳到ERROR1
i=Text1.Text
'這裡可以做其它處理
ExitSub
ERROR1:
MsgBox("請輸入一個整數")
Text1.SetFocus
EndSub
----這樣就可以實現合法性檢測了,如果要的是浮點就將i定義成浮點就可以了,即:
PrivateSubText1_LostFocus()
DimiAsSingle
OnErrorGoToERROR1
i=Text1.Text
ExitSub
ERROR1:
MsgBox("請輸入一個單精度浮點數")
Text1.SetFocus
EndSub
----同理,如果要的是日期就將i定義成日期就可以了,就是說,要什麼樣的數據就將i定義成什麼樣的數據類型就可以了。
----當然你不一定要在LostFocus事件中對數據的合法性進行檢測,如果是制作數據庫應用程序完全可以在數據被添加到數據庫之前再對數據進行檢測,這樣對用戶將更加方便。
----5.窗體以外光標位置的探測和設置
----用VB編程時想獲得窗體上的光標位置很容易,用MouseMove事件的參數就可得到光標在窗體上的位置。然而,如果想得到窗體以外的光標位置或想在程序中設置光標位置,那麼則只好求助於API了,還好,這幾個API函數非常簡單,即使剛接觸編程的朋友也能學會使用。這裡筆者做一個簡單的介紹,希望和大家共享使用API的樂趣。
----先介紹一下有關的API的結構和函數,首先看一下獲得光標位置的這個函數,其聲明如下:
BOOLGetCursorPos(
LPPOINTlpPoint
//指向POINT結構的指針,其中包含所獲的光標的位置信息
);
再來看一下POINT的結構:
typedefstructtagPOINT{//pt
LONGx;
LONGy;
}POINT;
真是非常簡單,最後看一下設置光標位置的函數:
BOOLSetCursorPos(
intX,//要設置位置在屏幕上的橫坐標
intY//要設置位置在屏幕上的縱坐標
);
----在VB中使用API就需要一定的說明了,還好VB提供了一個"API文本查看器",你只要將所要用的API的聲明復制一下就可以用了。我們來做一個簡單的例子來試一試。先建立一個項目,往窗體(Form1)上放置兩個TextBox控件(Text1和Text2),一個CommandButton控件(Command1)和一個Timer控件(Timer1)。將Timer1的Interval屬性改為1000。這個例子的功能是每隔一秒鐘在Text1和Text2中顯示光標的位置坐標,按Command1按鈕光標將按一定的規律在屏幕上漂移。所有的代碼如下:
PrivateTypePOINTAPI
xAsLong
yAsLong
EndType
PrivateDeclareFunctionGetCursorPosLib"user32"(lpPointAsPOINTAPI)AsLong
PrivateDeclareFunctionSetCursorPosLib"user32"(ByValxAsLong,ByValyAsLong)AsLong
'以上為API及數據結構的聲明
PrivateSubCommand1_Click()
DimiAsInteger
DimjAsInteger
Fori=0ToScreen.Width
SetCursorPosi,100'設置光標位置
Forj=0To1000'循環延時
Nextj
Nexti
EndSub
PrivateSubTimer1_Timer()
Dimpoint1AsPOINTAPI
GetCursorPospoint1'獲得光標位置
Text1.Text=point1.x'顯示光標位置X
Text2.Text=point1.y'顯示光標位置Y
EndSub
----輸入完畢後存盤運行就行了,可以發現在VB中是很容易實現的。
----6.Windows各種路徑的獲得
----在WINDOWS下編程經常需要在程序中獲得各種路徑,比如當前的工作路徑,系統的路徑,等各種路徑。在WINDOWS的API中提供了齊全的API函數供我們調用。
----先來看一下這幾個API函數的說明:
----(1).DWORDGetCurrentDirectory(
DWORDnBufferLength,//接收目錄的字符串的長度
LPTSTRlpBuffer//接收目錄的字符串的地址
);
----通過調用這個函數將獲得當前的目錄,如果調用失敗此函數將返回零。調用這個函數時應將nBufferLength參數設足夠大,接收目錄的字符串當然也要有這麼長。詳細用法請看例子。另外用SetCurrentDirectory()函數可以設置當前目錄。
----(2).UINTGetSystemDirectory(
LPTSTRlpBuffer,//接收目錄的字符串的地址
UINTuSize//接收目錄的字符串的長度
);
----通過調用這個函數可獲得系統的目錄,如果調用失敗此函數將返回零。
----3.UINTGetWindowsDirectory(
LPTSTRlpBuffer,//接收目錄的字符串的地址
UINTuSize//接收目錄的字符串的長度
);
----通過調用這個函數可獲得WINDOWS目錄,如果調用失敗將返回零。關於這個函數和第二個函數的區別,通過下面的例子你一定會非常清楚。
----下面用VB來實現。首先當然要先把API的聲明加到代碼中,開始一個新項目,在窗體(Form1)上放上三個按鈕(Command1,Command2,Command3)。這個例子的功能是單擊按鈕用MSGBOX顯示得到的路徑。
----筆者發現不能簡單地復制VB5的API文本查看器中關於上面幾個API的聲明,要做一定的修改,要在每個函數名後加一個"A",所有代碼如下。
PrivateDeclareFunctionGetCurrentDirectoryALib"kernel32"(ByValnBufferLengthAsLong,ByVallpBufferAsString)AsLong
PrivateDeclareFunctionGetWindowsDirectoryALib"kernel32"(ByVallpBufferAsString,ByValnSizeAsLong)AsLong
PrivateDeclareFunctionGetSystemDirectoryALib"kernel32"(ByVallpBufferAsString,ByValnSizeAsLong)AsLong
PrivateSubCommand1_Click()
DimPathAsString*255
GetCurrentDirectoryA(Len(Path),Path)'獲取當前路徑
MsgBox(Path)
EndSub
PrivateSubCommand2_Click()
DimPathAsString*255
GetWindowsDirectoryA(Path,Len(Path))'獲取WINDOWS路徑
MsgBox(Path)
EndSub
PrivateSubCommand3_Click()
DimPathAsString*255
GetSystemDirectoryA(Path,Len(Path))'獲取SYSTEM路徑
MsgBox(Path)
EndSub
----7.錯誤陷阱中要注意的問題
----筆者發現在循環中應用錯誤陷阱技術有一定的問題。比如下面這一段程序:
PrivateSubCommand1_Click()
DimIAsInteger
DimJAsInteger
OnErrorGoToJERROR
ForI=0To3
MsgBox(I)
J=10000*10000'讓J發生溢出錯誤
JERROR:
NextI
EndSub
----按通常的分析,這段程序在運行時應該是不會出現錯誤的,但實際運行一下可以發現,當I等於1時發生溢出錯誤。這就是說錯誤陷阱只在循環的第一次有效。這個問題很值得注意,否則會給程序留下一個很大的臭蟲。->