摘要 本文討論了Visual Basic應(yīng)用程序訪問(wèn)SQL Server數(shù)據(jù)的幾中常用的方法,分別說(shuō)明了每種方法的內(nèi)部機(jī)理 并給出了每種方法的一個(gè)簡(jiǎn)單的實(shí)例,最后比較了每種方法的性能和優(yōu)缺點(diǎn)。 引言 Microsoft Visual Basic(簡(jiǎn)稱VB)作為一種面向?qū)ο蟮目梢暬幊坦ぞ?,具有?jiǎn)單易學(xué)的,靈活方便和易于 擴(kuò)充的特點(diǎn)。而且Microsoft為其提供了與SQL Server通信的API函數(shù)集及工具集。因此它越來(lái)越多地用作大型公 司數(shù)據(jù)和客戶機(jī)—服務(wù)器應(yīng)用程序的前端。與后端的 Microsoft SQL Server相結(jié)合,VB能夠提供一個(gè)魯棒的、高性能的客戶機(jī)—服務(wù)器方案。 使用Visual Basic作為前端開發(fā)語(yǔ)言,與SQL Server接口有三種常用的方法,即: *數(shù)據(jù)訪問(wèn)對(duì)象/Jet *為ODBC API編程 *使用SQL Server的Visual Basic庫(kù)(VBSQL)為DB庫(kù)API編程 本文將討論這三種VB應(yīng)用程序管理SQL Server數(shù)據(jù)的方法,并比較每種方法的性能和優(yōu)缺點(diǎn)。 方法1.數(shù)據(jù)訪問(wèn)對(duì)象/Jet Visual Basic支持Data Access Objects(DAOs)的子集。DAO的方法雖然不是性能最好的管理客戶機(jī)—服務(wù)器 之間的對(duì)話方式,但它確有許多優(yōu)點(diǎn)。使用DAOs訪問(wèn)SQL Server的過(guò)程如下:應(yīng)用程序準(zhǔn)備好語(yǔ)句并送至Jet, Jet引擎(MASJT200.DLL)優(yōu)化查詢,載入驅(qū)動(dòng)程序管理器并與之通訊,驅(qū)動(dòng)程序管理器(ODBC.DLL)通地調(diào)用驅(qū)動(dòng) 器(SQLSRVR.DLL)的函數(shù),實(shí)現(xiàn)連接到數(shù)據(jù)源,翻譯并向SQL Server提交SQL語(yǔ)句且返回結(jié)果。下面是一個(gè)用DAOs 訪問(wèn)SQL Server的VB實(shí)例。 ‘form Declarations Dim mydb As Database Dim mydynaset As Dynaset Private Sub form_Load() Set mydb=OpenDatabase("",Fa|se,Fa|se,"ODBC;DSN=Myserver;WSID=LCL;DATABASE=sa|es") Set mydynaset=mydb CreateDynaset("Select*from Customers") End Sub 上述例子是以非獨(dú)占、非只讀方式打開sales數(shù)據(jù)庫(kù),并檢索Customers表中的所有字段。OpenDatabase函數(shù) 的最后一個(gè)參數(shù)是ODBC連接字符串參數(shù),它指明了Microsoft Access連接到SQL Server所需要知道的一些內(nèi)容。 其中“DSN”為數(shù)據(jù)源名,“WSID”為工作站名,“DATABASE”為所要訪問(wèn)的數(shù)據(jù)庫(kù)名。 方法2.用ODBC API編程 ODBC(Open Database Connectivity)的思想是訪問(wèn)異種數(shù)據(jù)庫(kù)的一種可移植的方式。與數(shù)據(jù)資源對(duì)話的公用 函數(shù)組裝在一個(gè)稱為驅(qū)動(dòng)程序管理器(ODBC.DLL)的動(dòng)態(tài)連接中。應(yīng)用程序調(diào)用驅(qū)動(dòng)程序管理器中的函數(shù),而驅(qū)動(dòng) 程序管理器反過(guò)來(lái)通過(guò)驅(qū)動(dòng)器反過(guò)來(lái)通來(lái)驅(qū)動(dòng)器(SQLSRVR.DLL)把它們送到服務(wù)器中。 用ODBC API編程,一般要用到以下一些函數(shù)。下面列出了常用的函數(shù)以及它們的功能。 函數(shù) 功能 SQLALLocEnv 初始化ODBC環(huán)境,返回環(huán)境句柄 SQLALLocConnect 為連接句柄分配內(nèi)存并返回連接句柄 SQLConnect 連接一個(gè)SQL數(shù)據(jù)資源 SQLDriverConnect 連接一個(gè)SQL數(shù)據(jù)資源,允許驅(qū)動(dòng)器向用戶詢問(wèn)信息 SQLALLocStmt 為語(yǔ)句句柄分配內(nèi)存并返回語(yǔ)句句柄 SQLExecDirect 把SQL語(yǔ)句送到服務(wù)器 SQLFetchAdvances 到結(jié)果集的下一行(或第一行) SQLGetData 從結(jié)果集的特定的一列取回?cái)?shù)據(jù) SQLFreeStmt 釋放與語(yǔ)句句柄相關(guān)的資源 SQLDisconnect 切斷連接 SQLFreeConnect 釋放與連接句柄相關(guān)的資源 SQLFreeEnv 釋放與環(huán)境句柄相關(guān)的資源 下面的代碼使用上面一些函數(shù)先登錄到一個(gè)服務(wù)器數(shù)據(jù)庫(kù),并為隨后的工作設(shè)置了 語(yǔ)句句柄。 G|oba| giHEnv As Long G|oba| giHDB As Long G|oba| giHStmt As Long Dim myResult As integer Dim myConnection As Srting Dim myBuff As String*256 Dim myBufflen As Integer If SQLA||ocEnv(giHEnv)<>SQL_SUCCESS Then MsgBox"A||ocation couldn‘t happen!" End if if SQL||ocConnect(giHEnv,giHDB)<>SQL_SUCCESS Then MsgBox "SQL Server couldn‘t connect!" End if myConnection="DSN=myServer;UID=|c|;PWD=;APP=ODBCTest;WS|D=LCL;DATABASE=sales" myResult=SQLDriverConnect(giHDB,Test,form1.hWnd,myConnection.len(myConnection), myBuff,256,myBufflen,SQL_DRIVER_COMPLETE_REQUIED) myResult=SQLA||ocStmt(giHDS,giHStmt) myResult=SQLFreeStmt(giHStmt,SQL_COLSE) rsSQL="Select*from Customers Where City="Wuhan"" myResult=SQLExecDirect(giHStmt,rsSQL,Len(rsSQL)) 方法3.使用VBSQL對(duì)DB庫(kù)API編程 DB庫(kù)是SQL Server的本地API,SQL Server的Visual Basic庫(kù)(VBSQL)為Visual Basic程序員提供API。 從一定意義上說(shuō),VBSQL是連接Visual Basic程序到SQL Server的性能最好最直接的方式。VBSQL包含以下 三個(gè)文件: VBSQL.VBX 包含庫(kù)函數(shù),具有訪問(wèn)重要的消息和處理錯(cuò)誤的能力 VBSQL.BI 包括所有的常量和變量說(shuō)明 VBSQL.HLP Windows幫助文件,使用VBSQL的指南 使用VBSQL時(shí),必需將VBSQL.BI加入到Visual Basic工程文件中,并確保VB程序運(yùn)行時(shí)有VBSQL.VBX文件。 一個(gè)典型的VBSQL對(duì)話中,一般要用到以下這些函數(shù)。 函數(shù) 功能 Sq||nit 在客戶機(jī)上裝載DB庫(kù) Sq|OpenConnection 打開服務(wù)器連接,返回連接句柄 Sq|Cmd 在客戶機(jī)上建立批處理命令 Sq|Exec 向服務(wù)器提交批處理命令 Sq|rexu|ts 把客戶機(jī)定位在第一條(或下一條)結(jié)果集的開端 Sq|NextRow 驅(qū)動(dòng)每個(gè)結(jié)果集的行之間的循環(huán) Sq|Data 訪問(wèn)一個(gè)特定列的數(shù)據(jù) Sq|C|ose 切斷特定的連接 Sq|Exit 切斷所有找開的連接 Sq|WinExit 卸下DB庫(kù) 一般的DB庫(kù)API編程的過(guò)程是這樣的:先通過(guò)調(diào)用SqlInit對(duì)DB庫(kù)進(jìn)行初始化,再調(diào)用SqlConnection打開 一個(gè)連接,然后就可做一些工作。下面的代碼是一個(gè)初始化DB庫(kù)并登錄到服務(wù)器的通用例程。 Private Sub |nitia|izeApp|ication() DBL|B-VERS|ON●=Sq||nit●() |f DBL|B_VERS|ON●=""Then MsgBox"Could not initia|ize DBL|B!Exit app|ication.",MB_|CONEXCLAMAT|ON End End if End Sub Private Function LoginToServer() As integer loginToServer=SUCCEED Status%=Sq|SetloginTime%(loginTimeOut) |f giSq|Conn<>0 Then Sq|C|ose(giSq|Conn) ‘關(guān)閉已打開的連接 giSq|Conn=Sq|OpenConnection(gsServerName,gsLogin|D,gsPassword,ProgramName●,ProgramName●) |f giSq|Conn<>o Then |iresu|t=Sq|Use(giSq|Conn,"Sales") Else LogintoServer=FA|L End |f End Function 性能比較 以上三種訪問(wèn)SQL Server的方法各有各的特點(diǎn)。DAOs方法是基于對(duì)象的,因而便于使用,但是它從Visual Basic 到SQL Server的最慢的方式。ODBC API和VBSQL方法從本質(zhì)上講是基于程序的。ODBC API方法通用性好,允許最強(qiáng)的 互操作性,編程簡(jiǎn)單,但速度慢于VBSQL方法。VBSQL方法通過(guò)VBSQL控件,提供了重要的SQL Server前端應(yīng)用程序所 需的靈活性、強(qiáng)大功能和良好性能。它具有真正的事件驅(qū)動(dòng)及錯(cuò)誤處理能力,完全支持異步處理、游標(biāo)和計(jì)算列等。 這些都是VBSQL方法超出其它方法的優(yōu)勢(shì),但其編程稍復(fù)雜。至于實(shí)際使用哪一種接口方式,在很大程度上依賴于用 戶的應(yīng)用程序的具體情況而定。 王生 推薦 二.鎖住計(jì)算機(jī)直到輸入正確的密碼。 作者:juhalepola ‘這是一個(gè)十五歲的芬蘭少年提供的程序(He is from Finland.). Option Explicit Dim ter As Boolean Private Sub Command1_Click() ter = False DisableCtrlAltDelete (False) Unload form1 End Sub Private Sub form_KeyPress(KeyAscii As Integer) If KeyAscii = 13 Then Timer1.Enabled = False Timer2.Enabled = True Text1.Enabled = True End If End Sub Private Sub form_Load() DisableCtrlAltDelete (True) ter = True End Sub Private Sub form_LostFocus() form1.SetFocus End Sub Private Sub form_Unload(Cancel As Integer) If ter = True Then Cancel = 5 Else End If End Sub Private Sub Timer1_Timer() form1.SetFocus Label2.Caption = 5 End Sub Private Sub Timer2_Timer() Label2.Caption = Val(Label2.Caption) - 1 & " Seconds time to write a password." Text1.SetFocus If Text1.Text = "mouse" Then ter = False Timer2.Enabled = False Timer1.Enabled = False Label2.Caption = "5" MsgBox "Password accepted, you can close this programm now." Text1.Enabled = False Command1.Enabled = True End If If Val(Label2.Caption) = 0 Then Timer1.Enabled = True Timer2.Enabled = False Text1.Text = "" Text1.Enabled = False Command1.Enabled = False End If End Sub ‘ MyModule has the following functions/subs ‘ Subs: ‘ OpenApp(FileName as string) ‘ * Opens an application with the filename specified ‘ * Use: OpenApp(FileName) ‘ DisableCtrlAltDelete(bDisabled As Boolean) ‘ * Disables Control Alt Delete Breaking as well as Ctrl-Escape ‘ * Use: Call DisableCtrlAltDelete(Boolean) ‘ Center(formName as form) ‘ * Centers the specified form ‘ * Use: Center(formName) ‘ AlwaysOnTop(formName as form, bOnTop as boolean) ‘ * Sets the named form as always on top ‘ * Use: Call AlwaysOnTop(True) ‘ ExitWindows(Mode) ‘ * Shutdown or reboots windows ‘ * Use: ExitWindows(shutdown) ‘ * ExitWindows(reboot) ‘ Used for DisableCtrlAltDelete Private Declare Function SystemParametersInfo Lib _ "user32" Alias "SystemParametersInfoA" (ByVal uAction _ As Long, ByVal uParam As Long, ByVal lpvParam As Any, _ ByVal fuWinIni As Long) As Long ‘------------------------------------------- ‘ Used for ExitWindows Const EWX_LOGOFF = 0 Const EWX_SHUTDOWN = 1 Const EWX_REBOOT = 2 Const EWX_FORCE = 4 Private Declare Function ExitWindowsEx Lib "user32" _ (ByVal uFlags As Long, ByVal dwReserved _ As Long) As Long ‘ --------------------- ‘ Used for AlwaysOnTop Const FLAGS = 3 Const HWND_TOPMOST = -1 Const HWND_NOTOPMOST = -2 Public SetTop As Boolean Private Declare Function SetWindowPos Lib "user32" (ByVal h%, ByVal hb%, ByVal X%, ByVal Y%, ByVal cx%, ByVal cy%, ByVal f%) As Integer ‘------------------------------------------- Sub ExitWindows(ExitMode As String) Select Case ExitMode Case Is = "shutdown" t& = ExitWindowsEx(EWX_SHUTDOWN, 0) Case Is = "reboot" t& = ExitWindowsEx(EWX_REBOOT Or EXW_FORCE, 0) Case Else MsgBox ("Error in ExitWindows call") End Select End Sub Sub AlwaysOnTop(formName As form, bOnTop As Boolean) ‘Sets a form as always on top Dim Success As Integer If bOnTop = False Then Success% = SetWindowPos(formName.hWnd, HWND_TOPMOST, 0, 0, 0, 0, FLAGS) Else Success% = SetWindowPos(formName.hWnd, HWND_NOTOPMOST, 0, 0, 0, 0, FLAGS) End If End Sub Sub Center(formName As form) ‘ Center forms... ‘Move (Screen.Width - formName.Width) \ 2, (Screen.Height - formName.Height) \ 2 End Sub Sub DisableCtrlAltDelete(bDisabled As Boolean) ‘ Disables Control Alt Delete Breaking as well as Ctrl-Escape Dim X As Long X = SystemParametersInfo(97, bDisabled, CStr(1), 0) End Sub Sub OpenApp(File As String) ‘Shells to another application X = Shell(File) End Sub 返回 三. VB應(yīng)用程序編制實(shí)例 VB自問(wèn)世以來(lái),已從1.0版步入到功能十分強(qiáng)大的5.0版。VB以其開發(fā)軟件周期短、操作簡(jiǎn)單、可視化程度高的優(yōu)點(diǎn)倍受編程人員的青睞。近幾年來(lái),許多Windows程序員應(yīng)用VB作為編程語(yǔ)言,開發(fā)了大量的應(yīng)用軟件。本文通過(guò)幾個(gè)實(shí)例說(shuō)明了VB的強(qiáng)大功能。 (一)、工具棒的建立方法 Windows應(yīng)用程序的操作界面都含有大量的圖標(biāo),這些圖標(biāo)集中放在某一個(gè)區(qū)域形成工具棒(Toolbars), 工具棒中的圖標(biāo)用圖示的方法表示某一種功能,可以加速操作,在某些Windows應(yīng)用程序中還把這些工具棒直接稱為加速棒(Speedbars)。下面介紹編制工具棒的方法。 在窗體上畫一個(gè)足夠大的圖片框,使用這個(gè)圖片框可以存放圖標(biāo)。設(shè)置圖片框的Align屬性,使圖片框列在窗口的頂部,即[窗體名][控件名]Align=1 在圖片框中增加影像控件(Image Control)數(shù)組或者三維命令控制按鈕數(shù)組(3D Command Button Control)。改變控件的Picture屬性,輸入圖形,圖形的格式為:*.BMP,*.DIB,*.WMF,*.ICO。 下面的實(shí)例介紹了工具棒的建立方法,具體步驟為: 1.建立一個(gè)圖片框,取名為Demo(即Name屬性為Demo),設(shè)置Align屬性,即 Demo.Align=1 2.在圖片框上增加三維命令按鈕,設(shè)置Name屬性為Tool,設(shè)置Index的屬性為0(第一個(gè)控件),改變 Picture 屬性,輸入圖示化的圖形(文件)。改變提示信息,設(shè)置Caption取值為空。 3.增加三維命令按鈕控件,設(shè)置Name屬性為Tool,注意使Index屬性分別為1,2,……。 4.建立窗體Paint事件過(guò)程 Sub formPaint() Demo.ScaleHeight = Tool(0).Height ‘設(shè)置工具棒的高度 iw% = Tool(0).Width ‘獲取第一個(gè)圖標(biāo)的寬度,用于設(shè)置其他的圖標(biāo)寬度 For i% = 0 To 3 Tool(i%).Height = Demo.Scaleheiht Tool(i%).Width = iw% Tool(i%).AutoSize = 1 ‘設(shè)置圖標(biāo)中的圖形充滿整個(gè)圖形框 Tool(i%).Move iw% * i%, 0 ‘重新排列所有圖標(biāo)的位置 Next i% End Sub 5.建立圖標(biāo)事件過(guò)程 為工具棒中的每一個(gè)圖標(biāo)增加一個(gè)過(guò)程,執(zhí)行相應(yīng)的命令: Sub Tool_Click(index As Integer) If index = 0 Then Tool (0). Picture = Load(″animal.bmp″) ‘更換第一個(gè)圖標(biāo)中圖像 ElseIf index = 1 Then j% = Shell(″calc.exe″, 1) ‘執(zhí)行WINDOWS95計(jì)算重新CALC.EXE ElseIf index = 2 Then End ‘中止程序的執(zhí)行 End If End Sub 在實(shí)際應(yīng)用中,程序員可以發(fā)揮自己的想象力,從而完善工具棒的功能。 (二)、Windows演示程序的編程方法 Windows應(yīng)用軟件系統(tǒng)中教學(xué)演示程序,在整個(gè)系統(tǒng)中占有十分重要的地位,它從一個(gè)側(cè)面反映了應(yīng)用軟件的功能和用戶界面。下面介紹了使用VB編制演示軟件的語(yǔ)言基礎(chǔ),并列舉實(shí)例說(shuō)明。 (三)、演示軟件激活語(yǔ)言軟件的方法 應(yīng)用軟件可以通過(guò)演示程序激活,無(wú)論該應(yīng)用程序是否是用戶自己編制的程序。例如,用戶可以通過(guò)演示激活字處理軟件Word for Windows。應(yīng)用軟件的激活可以依照應(yīng)用軟件所處狀態(tài)使用Shell函數(shù)或AppActivate命令激活。 1.Shell函數(shù)的使用 Shell函數(shù)可以運(yùn)行一個(gè)執(zhí)行程序(即應(yīng)用程序),類似在“文件管理器”的“文件”菜單中運(yùn)行一個(gè)程序,Shell函數(shù)的使用語(yǔ)法是: Shell(commandstr$,winstyle%) 其中,commandstr$是一個(gè)包含有路徑的可執(zhí)行文件字符串,winstyle%是決定運(yùn)行窗口類型的參數(shù)。例如 j%=Shell(″c:\win\write.exe″,1) 該句啟動(dòng)Windows中“Write”應(yīng)用軟件,窗口類型為具有輸入焦點(diǎn)的正常窗口,它的返回值在VB中不使用。 2.AppActivate命令的使用 AppActivate命令可以把Windows的焦點(diǎn)移向指定的應(yīng)用程序,若該應(yīng)用程序沒(méi)有啟動(dòng),AppActivate也不能啟動(dòng),且此時(shí)會(huì)出現(xiàn)運(yùn)行錯(cuò)誤,使用AppActivate的語(yǔ)法是: AppActivate titletext$ titletext$是應(yīng)用出現(xiàn)的標(biāo)題(窗口頂部的第一行文字),對(duì)大小寫不敏感。例如: AppActivate“calculator”or AppActivate“CALCULATOR” 這兩句都能夠把Windows的焦點(diǎn)移向“計(jì)算器(Calculator)”,即把計(jì)算器從后臺(tái)調(diào)入前臺(tái)。對(duì)于中文版Windows應(yīng)使用下面的命令: AppActivate“計(jì)算器” 3.模擬輸入控制應(yīng)用程序 演示程序的關(guān)鍵是能使用代碼模擬手工輸入,控制應(yīng)用程序的運(yùn)行過(guò)程。使用Sendkey命令可以模擬鍵盤輸入,使用方法為: Senekey keyin$,Wait% 其中, keyin$為模擬輸入的控制字符串。Wait%為真(非零)時(shí),說(shuō)明其它程序運(yùn)行模擬輸入完畢后,VB才繼續(xù)運(yùn)行;Wait%為假時(shí),說(shuō)明VB命令一執(zhí)行( Send Keys),馬上繼續(xù)運(yùn)行自己本身。Wait%可省略,缺省值為0。下面為兩實(shí)例: SendKeys“%{F4}”,1 該句說(shuō)明向應(yīng)用程序輸入<ALT>+<F4>,相當(dāng)于通過(guò)鍵盤鍵入了退出應(yīng)用程序的操作。 SendKeys“(Hello){Enter}”,1 相當(dāng)于通過(guò)鍵盤鍵入“Hello”,然后按回車鍵換行。 sleet 推薦 四.VB中APP對(duì)象及其應(yīng)用 作者 韓潮涌 (四川) 初學(xué)VB編程,很快就能編出些實(shí)用的程序了。我便將它們制成安裝盤送給朋友,但很快就發(fā)現(xiàn)一個(gè)問(wèn)題,程序總是按編程時(shí)固定好的路徑讀寫文件,但文件路徑改變,程序就找不到路徑了,因此不能正常寫文件。例如編程時(shí)設(shè)定:picture1.picture=Load Picture("c:\HVB\HAN.BMP")但若安裝使用時(shí),工作目錄變?yōu)镋:\HVB\HAN.BMP或其它路徑,程序就會(huì)出錯(cuò),并提示:找不到文件路徑。這個(gè)問(wèn)題看起來(lái)很復(fù)雜,但實(shí)際上很好解決,這只需用VB的App對(duì)象。 App對(duì)象有兩種重要屬性:(1)App.Path,它在VB編程狀態(tài)下返回你的.MAK文件所在目錄;在以.EXE文件運(yùn)行時(shí),則返回你的.EXE文件所在目錄。(2)App.EXE Name它返回你的程序名。下面舉一個(gè)簡(jiǎn)單的例子,假如你有一個(gè)程序?yàn)镈DC,其目錄為C:\HVB\DDC4(包括DDC.EXE)在VB編程環(huán)境下,在Debug窗口運(yùn)行:Print App.Path,顯示結(jié)果:C:HVB\DDC4,再運(yùn)行Print App.EXEName顯示結(jié)果:DDC。知道了以上兩種屬性,前面所述問(wèn)題就很好解決了,可以將其修改為:Dim Apath ,Dim FilePath Apath=App.Path FilePath=Apath+"\HAN.BMP" Picture1.Picture=LoadPicture(FilePath) 這樣,這程序的工作目錄無(wú)論改為什么,都能正常工作了。 (注:文件目錄為根目錄時(shí),以上情況略有不同,App對(duì)象在VB2.0以上版本中均存在。) 點(diǎn)評(píng):推薦給大家的也是軟件實(shí)用化的一個(gè)小小改進(jìn)。本文所討論的問(wèn)題可能對(duì)于有數(shù)據(jù)庫(kù)操作的軟件尤具實(shí)際意義,看了本文你是否可以不必再為你的軟件指定固定的目錄了呢? 五.VB中實(shí)現(xiàn)窗口自由分割 作者:許振華 大家可能注意到,目前Windows下的應(yīng)用軟件許多都具有窗口自由分割的功能,本文給出在VB中實(shí)現(xiàn)的方法。 要實(shí)現(xiàn)窗口自由分割功能,需要用一個(gè)圖片框(Picture box)作為分割條,在程序運(yùn)行時(shí),將其放在兩個(gè)窗口之間,兩個(gè)窗口自動(dòng)調(diào)整大小緊靠圖片框。當(dāng)用戶拉動(dòng)分割條時(shí),窗口自動(dòng)調(diào)整大小,一直緊靠分割條,這樣似乎是一個(gè)窗口被分割條分開。下面是一個(gè)例子。 在窗體中放入兩個(gè)列表框,一個(gè)圖片框,名字分別為list1、list2、pic1,對(duì)pic1的屬性設(shè)定如下:將mousepointer屬性設(shè)定為99(用戶自定義),將mouseicon設(shè)定為中間帶分割線的雙箭頭鼠標(biāo)形式,具體做法是單擊mouseicon后的(無(wú)),將會(huì)出現(xiàn)三個(gè)點(diǎn),單擊這三個(gè)點(diǎn)將會(huì)打開文件對(duì)話框,一般來(lái)說(shuō),鼠標(biāo)樣式文件放在vb5\graphics\cursors文件夾中,找到Ve-sizeb,選中它即可。這是當(dāng)用戶將鼠標(biāo)移到分割條上或拉動(dòng)分割條時(shí)鼠標(biāo)的形狀。窗體中這三個(gè)控件的位置可隨意放,因?yàn)樵诔绦蜻\(yùn)行時(shí)自動(dòng)設(shè)定它們的位置和大小。然后寫如下代碼: Option Explicit Private Const P_ECART=3 Private y1 As Integer Private y2 As Integer Private x1 As Integer Private x2 As Integer Private width1 As Integer Private width2 As Integer Private height1 As Integer Private height2 As Integer Private glbfrmInSizeX As Long Private Sub pic1_MouseMove(Button As Integer, Shift As Integer, x As Single, y As Single) If glbfrmInSizeX <> &H7FFFFFFF Then If CLng(x) <> glbfrmInSizeX Then pic1.Move pic1.Left+x, y1,P_ECART,ScaleHeight-2 glbfrmInSizeX = CLng(x) End If End If End Sub Private Sub pic1_MouseUp(Button As Integer, Shift As Integer, x As Single, y As Single) If glbfrmInSizeX <> &H7FFFFFFF Then If CLng(x) <> glbfrmInSizeX Then pic1.Move pic1.Left+x,y1,P_ECART, ScaleHeight-2 End If glbfrmInSizeX = &H7FFFFFFF pic1.BackColor = &H8000000F If pic1.Left > 60 And pic1.Left < (ScaleWidth - 60) Then list1.Width=pic1.Left-list1.Left ElseIf pic1.Left < 60 Then list1.Width=60 Else list1.Width=ScaleWidth-60 End If form_Resize End If End Sub Private Sub pic1_MouseDown(Button As Integer, Shift As Integer, x As Single,y As Single) If Button=vbLeftButton Then pic1.BackColor=&H808080 glbfrmInSizeX=CLng(x) Else If glbfrmInSizeX <>&H7FFFFFFF Then pic1_MouseUp Button,Shift,x,y End If glbfrmInSizeX=&H7FFFFFFF End If End Sub Private Sub form_Resize() Const B_ECART=1 On Error Resume Next y1=B_ECART height1=ScaleHeight-B_ECART*2 x1=B_ECART width1=list1.Width x2=x1+list1.Width+P_ECART-1 width2=ScaleWidth-x2-B_ECART list1.Move x1-1, y1, width1, height1 list2.Move x2,y1,width2+1,height1 pic1.Move x1+list1.Width-1, y1,P_ECART, height1 End Sub Private Sub form_Load() glbfrmInSizeX=&H7FFFFFFF form_Resize End Sub 程序運(yùn)行環(huán)境:VB 5.0中文版、中文WIN9X,VB 4.0/5.0/6.0 。 |
|
來(lái)自: 加菲 > 《電腦技術(shù)》