写在前面
机房也是一场持久战,中途遇到自考的事,然后被自己孤立了一段时间,不过这也恰恰说明一个问题,自己的时间管理做的不好,看来自己以后努力的方向是找到了。在入手敲机房的时候,按照师哥说的那样,尽量避开之前师哥师姐使用的现成的代码,对功能的实现要自己去想,这样也是有很大的好处的,就是自己的思路很清楚,不像照着敲学生那样有种晕头转向的感觉,至少自己掌握了很大的主动权。当然,不太好的地方是,自己写的代码没有技术含量,虽然很简单,但是很繁琐,不过这都过去了,至少明确自己哪里可以做的更好。
技术学习
数据库
- 附加数据库
看完视频之后,自己不甘心用给的数据库,于是参照着之前的数据库,自己动手建了一个数据库,这样也发现了很多问题。数据库附加的时候会有这样的提醒:
报错:5120,即为权限的问题,我们找到我们要附加的mdf文件,右键属性–安全,在下图中将完全控制勾上,就可以附加了:
这样数据库附加的问题就可以解决了。
- 标识列
数据库中用到了标识列,我就查了查,百度是这么解释的:标识列,是SQL Server中的标识列又称标识符列,习惯上又叫自增列。标识列的创建与修改,通常在企业管理器和用Transact-SQL语句都可实现。
那么问题来了,如何设置呢,其实很简单,右键单击你要设计的表,在右侧标识列,添加你让哪列成为标识列,就可以了!
- 修改数据库
有的时候数据库中的内容不允许我们修改,敲学生的时候我放弃了,师姐的话说的很对,出来混总是要还的,这时候,你想着可以省点事,之后你就摊上大事了,其实挺简单的。在数据库中单击工具–选项–打开如下图所示,去掉框中的对勾,即可完成对表的修改。
控件部分
- Msflexgrid
例如下面这个图中,要实现对选中的内容删除,这里的删除有两部分,第一:删除数据库中的内容,第二:删除grid中的内容,当删除grid中的内容是不能将第一行删掉。
以下是代码的分析
‘找到选中的内容:
With MSFlexGrid1
If .RowSel > .Row Then
startRow = .Row
endRow = .RowSel
Else
startRow = .RowSel
endRow = .Row
End If
‘ 删除数据库中的内容
For i = startRow To endRow
If mRc.RecordCount <> 0 Then
mRc.MoveFirst
While mRc.EOF = False
If Trim(mRc.Fields(0)) = .TextMatrix(i, 0) Then
A(i)=i
mRc.Delete
End If
mRc.MoveNext
Wend
End If
Next i
‘删除grid表中的内容,有两个办法,一种是重新将数据库中的内容,传给grid,另一种就是利用一个循环,将grid中选中的内容删除,我用的就是第二种办法:
If startRow = 0 Then
For i = 1 To endRow
.RemoveItem A(i)
Next i
Else
For i = startRow To endRow
.RemoveItem A(i)
Next i
End If
- DTPicker 控件
如果我们要让用户常常来手动输入日期的话,费事是一回事,日期输入不对的时候老是提醒,就不好了,这是多麻烦的事。于是这时候date time 控件的作用就显现出来了。这里不得不说的一个一个属性是Format属性。
属性 | 格式 |
---|---|
0-dtpLongDate | yyyy-mm-dd hh:mm:ss |
1-dtpShortDate | yyyy-mm-dd |
2-dtpTime | hh:mm:ss |
3-dtpCustom | 依据customeFormat而定 |
运行时的效果是这样的:是不是感觉对vb的认识又更近了一步呢!
当然如果用到这个控件的话,必不可少的一个内容,就是判断当前日期了:
‘判断选择日期是否大于当前日期,大于的话,则置为当前日期
If DTP1.Value > Date Then
MsgBox "所选的日期不能大于当前日期!"
DTP1.Value = Date
Exit Sub
End If
导出excel
这一部分的核心内容就是excel和vb的一个联系及一个循环的使用,将grid表中的内容,从行到列添加到execel表格中的每一个单元格。当然,使用之前,要引用上 Microsoft office xx Object Library .下面我们来分析代码:
Public Function GridToExcel(flex As MSFlexGrid, g_CommonDialog As CommonDialog)
On Error GoTo ErrHandler
Dim xlApp As object ‘定义一个excel对象
Dim xlBook As object ‘定义一个工作簿
Dim Rows As Integer, Cols As Integer
Dim iRow As Integer, hCol As Integer, iCol As Integer
Dim New_Col As Boolean
Dim New_Column As Boolean
g_CommonDialog.CancelError = True
‘On Error GoTo ErrHandler
‘ 设置标志
g_CommonDialog.Flags = cdlOFNHideReadOnly
‘ 设置过滤器
g_CommonDialog.Filter = "All Files (*.*)|*.*|Excel Files" & _
"(*.xls)|*.xls|Batch Files (*.bat)|*.bat"
‘ 指定缺省的过滤器
g_CommonDialog.FilterIndex = 2
‘ 显示“打开”对话框
g_CommonDialog.ShowSave
‘没有内容的话,跳出过程
If flex.Rows <= 1 Then
MsgBox "没有数据!", vbInformation, g_Msgtitle
Exit Function
End If
Set xlApp = CreateObject("Excel.Application") ‘新建一个excel
Set xlBook = xlApp.Workbooks.Add ‘添加工作簿
xlApp.Visible = False
With flex
Rows = .Rows
Cols = .Cols
iRow = 0
iCol = 1
‘下面添加内容用两个循环来完成的,值得注意的就是,对于grid表来说,第一个单元格坐标是(0,0)对于excel来说,是(1,1)别的应该都没有问题了。
‘外循环,遍及每一列的
For iCol = 1 To Cols
‘内循环,遍及每一行的
For iRow = 1 To Rows
‘将gri表中的内容,加给excel
xlApp.Cells(iRow, iCol).Value = .TextMatrix(iRow - 1, iCol - 1)
Next iRow
Next iCol
End With
‘设置excel的属性
With xlApp
.Rows(1).Font.Bold = True
.Cells.Select
.Columns.AutoFit
.Cells(1, 1).Select
.Application.Visible = True
End With
‘选择保存的路径
xlBook.SaveAs (g_CommonDialog.FileName)
xlApp.Application.Visible = True
xlApp.DisplayAlerts = False
xlApp.Quit
Set xlApp = Nothing ‘"交还控制给Excel
Set xlBook = Nothing
flex.SetFocus
MsgBox "数据已经导出到Excel中。", vbInformation, "成功"
Exit Function
‘ErrHandler:
‘ 用户按了“取消”按钮
‘If Err.Number <> 32755 Then
‘ MsgBox "数据导出失败!", vbCritical, "警告"
‘End If
End Function
其他内容
- 实例话的问题
之前我一直不太清楚,这种先dim 然后set 的用法,后来分析了一下,dim就是用之前声明,set就好比用的时候,具体的说一下,具体。
Dim Cnn As ADODB.Connection ‘声明
Set Cnn = New ADODB.Connection ’实例化
相当于:dim cnn as new adodb.connection
- 函数
- Instr函数
InStr([start,]string1,string2[,compare])
解释:InStr([起始,] 接受搜索的字符串,被搜索的字符串[,匹配模式])
加个例子,会清楚很多,我们是这样利用的:
If InStr("INSERT,DELETE,UPDATE", UCase$(sTokens(0))) Then
‘如果有这几个字符则
Cnn.Execute SQL ‘执行查询语句 SQL
MsgString = sTokens(0) & "query successful"
End if
- Replace 函数
replace(str1,str2,[str3])
解释:用str3替换,str1中str2的字符,一般str3可以省略,即为空格
举个例子:
Replace(“TT好人”,“TT”) return “好人”
这里在实现一个换行功能的时候,我用到了,这个函数,运行的效果如下:
代码是这样写的(只展示部分),很简单:
str = "充值卡号:" & Trim(chargeMrc.Fields(2)) & "、" & "上次卡内余额:"
str = Replace(str, "、", Chr(13) & Chr(10))
- Split函数
变量 = Split(原字符串变量, 切割标志)
这个函数在模块中也有用到,用以将数据库中的内容划分成数组的形式。
- 优化
有一种定义字符串的方法来限制字符串,感觉效果挺好用的。
Dim TT As String
‘这样可以随意添加自己想要加入的字符
TT = "#$%^&‘%@*!"
If InStr(1, TT, Chr(KeyAscii)) <> 0 Then KeyAscii = 0
还有case语句也挺简单的,举一个限制数据数字的例子:
Select Case str(KeyAscii)
Case str(48) To str(57)
Case str(8)
Case Else
KeyAscii = 0
Beep
End Select
思想进步
- 流程图
最开始的时候,自己特别懒,就是不想画流程图,不想全部的部分过一遍,这样的结果就是开始敲的时候,有点乱有的关系自己没有弄清楚,有一种敲不动的感觉。事实证明什么,偷懒还是不行的,于是后来自己在敲的时候,都是先过一遍流程,然后再敲,这样的感觉就比较好了,思路清晰,走起来就会少许多的迷茫。
- 注释
我写注释的三个时期,说起来我都很想笑。第一阶段:看不懂啊,这些注释都是什么意思?但是还是乖乖的把注释敲上了。第二阶段:这些注释,不都是这么回事么?有必要都写一下么,我自己懂不就好了么?第三阶段:主动写注释,而且是先写注释,我想要实现什么功能,我想按什么样的步骤来学习,把自己心里想的先用注意的形式标注出来,然后再填代码,最后功能实现,发现这个过程很轻松的。最后总结一下,为什么要写注释呢?方便自己,方便他人,实现双赢。
- 责任心
敲完代码,就觉得万事大吉了,是么?不是的,拉着师傅过来看了看我的系统,师傅,点了点就发现了很多问题,米老师说的不将就,我怎么就变得这么能将就,不站在用户的角度思考问题,常常以自己写代码方便为主,开始连个时间控件都不想加一下,常常是限制用户,给用户提要求,才能会使用我的系统,我想我或许就是猪了。我们忙活半天,结果就是为了别人用起来的时候很方便,这样的目的,我是不是时刻铭记于心,才能先成为一名合格的编程员。
- 畏难心理
不得不说,很多时候,我们常常问别人,这样做可以实现吗?别人告诉你可以,你就可以做到,同样的事,别人告诉你不知道,你在完成的路上会都一些犹豫和坎坷,别人告诉你不可以,你就放弃了。周围有很多这样的人,你做的事都需要别人来肯定,何必这样为难自己,如果你想让自己变得优秀的话,那就把一切顾虑放开,相信自己可以做的到,无论别人是否能够胜任。
- 站在巨人的肩膀上
开始着手机房的时候,没有参考别人的代码,也提醒自己不到万不得已的时候不要参考师哥师姐的博客。不过最后总结的时候,倒是学到他们不少的东西。我们身边有很多值得我们学习的榜样,我们应该看得见,哪怕是看到差距也是好的。
调用数据库的内容,我从头开始都是用的,select 语句,先把内容找到,然后进行,对它们的修改,删除,添加,更新。不过,之前的数据库视频,看到东西,自己一点都没有印象了么,我之前明明学过的啊,比如从师姐的博客中拾起的东西:
‘我们删除用户的时候可以这么写,之前在模块中已经定义过了
txtSQL = "delect User_Info where "
Call ExecuteSQL(txtSQL, msgText)
‘添加一个新用户时
txtSQL = "insert into User_Info values(‘" & txtUser.Text & "‘,‘" & txtPWD.Text & "‘,‘" & comboUserLevel.Text & "‘,‘" & txtName.Text & "‘,‘" & Head & "‘)"
Call ExecuteSQL(txtSQL, msgText)
‘更新某个用户信息
txtSQL = "update User_Info set UserID =‘ ‘ where "
Call Executesql(txtSQL, msgText)
这足以反映一个问题,平常的视频学习,自己要认真对待,做好总结,该动手的时候就不要偷懒,毕竟自己真的没有那么好的脑子,多总结,多总结,多总结。
还有一块的内容,也是从师姐那里学来的,在我们清空文本框的时候,可以使用遍历控件的一种方法:
‘声明一个控件
Dim txt As Control
‘遍历每一个控件
For Each txt In Me.Controls
‘如果控件的类型是 textbox
If TypeOf txt Is TextBox Then
txt.Text = ""
End If
Next
这个不仅可以实现textbox控件,别的类型也是一样的,这样做的好处就是不容易出错,同时也很是方便的,多像别人学习,在自己还是个菜鸟的时候。
结束语
多了解一点,让自己多一些常识,总是没有坏处的,说不定那一天就可以帮助自己,久而久之,就会一通百通的,期待自己的成长,相信自己可以做的很好,给自己一个优秀的机会。