前言-----本人也是刚刚接触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
解决了这些总体的问题之后,就可以开始写宇宙级的学生信息管理系统了。