前言-----本人也是剛剛接觸VB,企業的VB代碼基本能看的懂,但是自己開發,只能呵呵。一般在剛學習一門新的語言時,很容易發生一些自己相當然的認識錯誤,so,記下並分享開發學習的過程,望指正。-----------世界因分享而精彩,安卓因開源更強大。
不知道是否有人和我一樣,看不下去那些VB的書籍,既然這樣,不如就在項目中學習,我在學習java的時候做的第一個項目就是---fuck的學生信息管理系統,屁話說了一大堆,直接開始。
首先對這個little的project進行一下分析,就很不正式的直接意淫一下大概是什么樣子的了,(一般正規的公司都要做一大堆的圖啊,表啊的什么的,一個案子的60%的時間就這么燒了)。
功能模塊划分
- 登錄注冊(IndexForm) 共分實現四個階段 :1.比對字符串,字符串層次上的實現(一個人) 。 2.比對對象,對象層次的實現(一個人)。3 數組,集合,列表層次的實現(多個人)。4.數據庫層次上的實現(多個人),連接oracle和Access數據庫。
- 顯示及增刪改查(Mainform)。顯示學生的基本信息,實現學生信息數據的基本維護。
一個基本簡單的Excel級別的管理系統就是這樣了。在開始代碼之前要解決以下一些問題。
問題一:VB代碼的文件是什么樣子的。
一般情況會有以下一些文件的產生,正常的話至少是3個。
首先.vbp .vbw .frm是必須的,其中.vbp保存的是版本版權等信息,.vbw保存的是離開工程時的一些信息,.frm中保存的窗體代碼,一般當它還沒修煉成.exe文件是,要想運行都是要運行.vbp文件的。那個黑色箭頭的.scc文件是只有外接團隊協同軟件VSS的時候才會生成。.cls是class module的產物,.bas是module的產物,其他的.pag是屬性文件的后綴,.ctl是用戶控制文件的后綴。是不是很煩,java中就只有.java和.class文件。
問題二:VB中怎么去調試程序。
老師傅在我進公司的第一天告訴我的,F8 單步執行,正常的按F8,會直接到達程序的入口。shift+F8,不會進入函數方法直接得到返回值。F5全速前進,一般配合斷點使用,直接在循環的結束位置設斷點,然后全速。
VB中好像沒有控制台輸出,我找了很久,試了很多也沒能在控制台輸出,有人知道的,賜教一下,就像就java中System.out.println和c#中的Console.WriteLine()。我的解決方案是打開''立即"窗口,?+“從代碼中復制的變量”+enter,會輸出值。
立即窗口在“視圖”下面的‘立即’,快捷鍵是ctrl+G。最low的方法就是鼠標點到變量上去。
問題三:文件夾架構是怎樣的。
在我不知道什么spring,mybits等等這些被業界吹得神乎其神的javaEE框架時,我總感覺這些框架好屌,等我真正掌握這些框架時,它給我的感覺就是文件夾和配置文件也就是XML的裝X而已,當然這是我的戲謔之言,框架還是很屌的。相比而言VB中的文件夾好像被限定死了,這讓我很不習慣。雖然有三層架構也就是模型--控制器--視圖的文件分法,但是在實際的項目中文件怎么分還是我自己說了算,但是VB中,好像變了,只有個命名權。
只能在project下面點擊添加這些東西,其中三個非常重要的就是form,module,和class module。很自然就有了問題四。
問題四:module和class module的區別以及這2者里面的標准是怎么定義的,比如javaBean是有很嚴格的格式的,包括屬性的權限,空參構造,有參構造,set/get函數等。
大概的意思就是module中定義的對象不可實例化,class module中定義的可以實例化,還有作用域的區別。還有就是module中存放的一些公用的Sub(方法)和函數(function)。而類中存放的大概就是標准的類吧!
先看2個標准的module和class module的例子,看看其中定義了一些什么,以及是怎么定義的,具體的區別我將在自己實際定義的時候,去嘗試總結。
module:
1 Public fMainForm As frmMain 2 Private IsConnect As Boolean ' 標記數據庫是否連接 3 4 Private cnn As ADODB.Connection '連接數據庫的Connection對象 5 Private rs As ADODB.Recordset '保存結果集的Recordset對象 6 Public strSQL As String '保存執行SQL語句的字符串 7 Public Conn As String '連接字符串 8 Public MyUser As New clsUser '用戶對象 9 Public CurUser As New clsUser '當前用戶對象 10 Public strDB As String '數據庫名稱 11 Public Pension_Rate As Single '養老保險交費比例 12 Public Medi_Rate As Single '醫療保險交費比例 13 Public Tax_Start As Currency '個稅起征點 14 Sub Main() 15 Dim fLogin As New frmLogin 16 strDB = "\DATA\工資.mdb" 17 Conn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & _ 18 App.Path + strDB + ";Persist Security Info=False" 19 20 fLogin.Show vbModal 21 If Not fLogin.OK Then 22 '登錄失敗,退出應用程序 23 End 24 End If 25 Unload fLogin 26 frmSplash.Show 27 frmSplash.Refresh 28 Set fMainForm = New frmMain 29 Load fMainForm 30 Unload frmSplash 31 fMainForm.Show 32 End Sub 33 34 Public Sub Connect() '連接數據庫 35 If IsConnect = True Then '如果連接標記為真,則返回。否則會出錯 36 Exit Sub 37 End If 38 Set cnn = New ADODB.Connection '關鍵New用於創建新對象cnn 39 cnn.ConnectionString = Conn '設置連接字符串ConnectionString屬性 40 cnn.Open '打開到數據庫的連接 41 42 If cnn.State <> adStateOpen Then '判斷連接的狀態 43 MsgBox "數據庫連接失敗", vbOKOnly + vbCritical, "警告" '如果連接不成功,則顯示提示信息,退出程序 44 End 45 End If 46 47 IsConnect = True '設置連接標記,表示已經連接到數據庫 48 End Sub 49 50 Public Sub Disconnect() '斷開與數據庫的連接 51 Dim rc As Long 52 If IsConnect = False Then Exit Sub '如果連接標記為假,標明已經斷開連接,則直接返回 53 cnn.Close '關閉連接 54 55 Set cnn = Nothing 56 IsConnect = False 57 End Sub 58 ' 59 'Public Sub DB_Connect() '使用Connect_Num控制數據庫連接 60 ' Connect_Num = Connect_Num + 1 61 ' Connect 62 'End Sub 63 'Public Sub DB_Disconnect() 64 ' If Connect_Num >= CONNECT_LOOP_MAX Then 65 ' Connect_Num = 0 66 ' Disconnect 67 ' End If 68 'End Sub 69 'Public Sub DB_Disconnect_Forced() '強制關閉數據庫,計數器復位 70 ' Connect_Num = 0 71 ' Disconnect 72 'End Sub 73 74 Public Sub SQLExt(ByVal strSQLstmt As String) '執行數據庫操作語句 75 Dim cmd As New ADODB.Command '創建Command對象cmd 76 Connect '連接到數據庫 77 Set cmd.ActiveConnection = cnn '設置cmd的ActiveConnection屬性,指定與其關聯的數據庫連接 78 cmd.CommandText = strSQLstmt '設置要執行的命令文本 79 cmd.Execute 80 Set cmd = Nothing 81 Disconnect 82 End Sub 83 84 Public Function QueryExt(ByVal strSQLstmt As String) As ADODB.Recordset '執行數據庫查詢語句 85 Dim rst As New ADODB.Recordset 86 Connect '連接到數據庫 87 88 Set rst.ActiveConnection = cnn '設置rst的ActiveConnection屬性,指定與其關聯的數據庫連接 89 rst.CursorType = adOpenDynamic '設置游標類型 90 rst.LockType = adLockOptimistic '設置鎖定類型 91 rst.Open strSQLstmt '打開記錄集 92 Set QueryExt = rst '返回記錄集 93 End Function 94 95 Public Function CountTax(curPay As Currency) '定義過程,用於計算所得稅 96 Dim curTemp As Currency, curTax As Currency 97 curTemp = curPay - Tax_Start 98 Select Case curTemp 99 Case Is <= 0 100 curTax = 0 101 Case 0.01 To 500 102 curTax = curTemp * 0.05 103 Case 500.01 To 2000 104 curTax = curTemp * 0.1 - 25 105 Case 2000.01 To 5000 106 curTax = curTemp * 0.15 - 125 107 Case 5000.01 To 20000 108 curTax = curTemp * 0.2 - 375 109 Case 20000.01 To 40000 110 curTax = curTemp * 0.25 - 1375 111 Case 40000.01 To 60000 112 curTax = curTemp * 0.3 - 3375 113 Case 60000.01 To 80000 114 curTax = curTemp * 0.35 - 6375 115 Case 80000.01 To 100000 116 curTax = curTemp * 0.4 - 10375 117 Case Is > 100000 118 curTax = curTemp * 0.45 - 15375 119 End Select 120 CountTax = curTax 121 End Function 122 123 Public Function MakeStr(ByVal Str As String) As String 124 MakeStr = Trim(Replace(Str, "'", "''")) 125 End Function
class module:
1 Public strName As String '用戶名 2 Public strPWD As String '密碼 3 Public iUserClass As Integer '用戶類型 4 Public Sub Init() 5 strName = "" 6 strPWD = "" 7 iUserClass = 0 8 End Sub 9 10 Public Sub DeleteUser(ByVal UserName As String) '刪除用戶數據 11 If UserName = "Admin" Then 12 Exit Sub 13 End If 14 strSQL = "DELETE FROM [User] WHERE name='" + Trim(UserName) + "'" 15 SQLExt (strSQL) 16 End Sub 17 18 Public Function GetInfo(ByVal UserName As String) As Boolean 19 Dim rs As New ADODB.Recordset 20 strName = UserName 21 strSQL = "SELECT * FROM [User] WHERE name='" + Trim(UserName) + "'" 22 Set rs = QueryExt(strSQL) 23 If rs.EOF Then 24 Init '調用該類的初始化方法 25 GetInfo = False 26 Exit Function 27 Else 28 strPWD = Trim(rs.Fields(1)) 29 iUserClass = rs.Fields(2) 30 GetInfo = True 31 End If 32 End Function 33 34 Public Function ExistUser(ByVal UserName As String) As Boolean '存在用戶 35 Dim rs As New ADODB.Recordset 36 strSQL = "SELECT * FROM [User] WHERE Name='" + Trim(UserName) + "'" 37 Set rs = QueryExt(strSQL) 38 If Not rs.EOF Then 39 ExistUser = True 40 Else 41 ExistUser = False 42 End If 43 End Function 44 45 Public Sub AddUser() '增加用戶 46 strSQL = "INSERT INTO [User] Values('" + Trim(strName) + "','" + Trim(strPWD) _ 47 + "'," + Trim(Str(iUserClass)) + ")" 48 SQLExt (strSQL) 49 End Sub 50 Public Sub UpdateUser(ByVal UserName As String) '更改用戶信息 51 strSQL = "Update [User] Set name='" + Trim(strName) _ 52 + "',PWD='" + Trim(strPWD) + "',UserClass=" + Trim(Str(iUserClass)) _ 53 + " WHERE name='" + Trim(UserName) + "'" 54 SQLExt (strSQL) 55 End Sub 56 57 Public Sub UpdatePassword(ByVal UserName As String) '更改用戶密碼 58 strSQL = "Update mima Set PWD='" + Trim(strPWD) _ 59 + "' WHERE name='" + Trim(UserName) + "'" 60 SQLExt (strSQL) 61 End Sub
解決了這些總體的問題之后,就可以開始寫宇宙級的學生信息管理系統了。