Private Sub cmdinsert_Click() Dim n As Integer
Dim i As Integer, j As Integer
Call ExitEdit
n = MSFstudent.row
MSFstudent.col = 0 MSFstudent.row = 0
If n = 0 Then
MSFstudent.AddItem 1 n = 1 Else
MSFstudent.AddItem n End If
num = num + 1
ReDim Preserve student(num) MSFstudent.Rows = num + 1
For i = num To n + 1 Step -1 student(i) = student(i - 1)
MSFstudent.TextMatrix(i, 0) = Str(i) For j = 1 To 9
MSFstudent.TextMatrix(i, j) = MSFstudent.TextMatrix(i - 1, j) Next Next
For i = 1 To 9
MSFstudent.TextMatrix(n, i) = \ Next
student(n).Birth = #12:00:00 AM# student(n).faculty = 0 student(n).subject = 0 student(n).Name = \ student(n).Nation = 0 student(n).number = \ student(n).Province = 0 student(n).Score = 0 student(n).Sex = False
MSFstudent.TextMatrix(num, 0) = Str(num) MSFstudent.row = n Modified = True
20
Call GetNew EditMode = True End Sub
Private Sub cmdsave_Click() MSFstudent.col = 0 MSFstudent.row = 0 Call SaveData End Sub
2.4窗体模块frmquery
该窗体由一个含有9个成员的复选框控件数组排列在窗体的最左边,4个文本框控件,4个下拉式组合框,2个DTPicker控件,一组单选框,2个命令按钮组成。 1. 加载事件过程中,对显示民族,院系,专业,省份信息的列表框添加相应的条目。
2. 编写复选框的Enabled事件,实现对该查询条件是否可以编辑的设定 3. 编辑确定按钮,即对条件进行详细编辑,实现查询功能 4. 编辑取消按钮
Private Sub chknumber_Click()
If chknumber.Value = 1 Then txtnumber.Enabled = True Else txtnumber.Enabled = False End Sub
Private Sub txtscore1_KeyPress(KeyAscii As Integer) If KeyAscii < 48 Or KeyAscii > 57 Then KeyAscii = 0 End If End Sub
If chknumber.Value = 1 Then For i = 1 To num
If InStr(student(i).number, txtnumber.Text) = 0 Then a(i) = False Next End If
21
三、设计过程遇到的主要问题及解决方法
3.1题目要求启动时程序未在当前目录中找到data.dat文件,则显示没有数据行的空表,那么在写程序时怎么样才可以表示有没有data.dat的文件存在呢?书上没有找到,后来在网上查找了以下,运用dir函数可以实现这个要求。Dir函数返回一个String型的结果,用以表示一个文件名,目录名或文件夹名,利用
它的结果是否为空字符串,可以实现要求。 ~ 3.2在参数设置的模块中,我当时在其load的事件中编完了列表框的
ADDItem的方法,也检查代码,没有任何问题,但是该窗体就是无法显示出列表框的条目来。后来把把原先的frmstudent_load改成了form_load情况当即就解决了。因为对于窗体来说,无论其对象名是什么,其事件过程名总是”form_事件名”。但是对于各种控件来说,实践过程名格式是“对象名_事件名”。这是因为一个窗体模块中只能有一个窗体,却可以有大量的控件,必须以对象名加以区分。
3.3读入数据时,有一个学生人数的统计,否则不知道数组的上限,而data.dat文件却不好打开,不知道有多少学生,这个问题我自己没有想到可行的办法,请教了编程学的好的学长怎么处理这样的问题,他的经验是运用字符串函数LOF得到文件的总长度用len得到一条记录的长度,两个做比值得到学生数,虽然目前我不知道还有没有更好的方法,但是我认为这个方法很不错。
3.4一开始,对于MSFlexGrid这个表格控件不太会用,后来通过仔细阅读课程设计和在网上找大量资料,终于学会了这个控件的用法。
四、设计中尚存的不足分析
4.1如图可见,这一段本可使用控件数组大大简化这后面过程。一开始我也确实是如此设计。后来放弃了这一想法,采用了一般的步骤而变得更为费时费力,可以看到查询统计模块下的代码特别冗长。
Private Sub chkbirth_Click() If chkbirth.Value = 1 Then DTPbirth1.Enabled = True DTPbirth2.Enabled = True Else
DTPbirth1.Enabled = False DTPbirth2.Enabled = False End If End Sub
22
Private Sub chkfaculty_Click()
If chkfaculty.Value = 1 Then cbofaculty.Enabled = True Else cbofaculty.Enabled = False
End Sub
Private Sub chkname_Click()
If chkname.Value = 1 Then txtname.Enabled = True Else txtname.Enabled = False
End Sub
Private Sub chknation_Click()
If chknation.Value = 1 Then cbonation.Enabled = True cbonation.Enabled = False
End Sub
Private Sub chknumber_Click()
If chknumber.Value = 1 Then txtnumber.Enabled = True txtnumber.Enabled = False
End Sub
Private Sub chksubject_Click()
If chksubject.Value = 1 Then cbosubject.Enabled = True cbosubject.Enabled = False
End Sub
Private Sub chkprovince_Click()
If chkprovince.Value = 1 Then cboprovince.Enabled = True cboprovince.Enabled = False
End Sub
Private Sub chksex_Click() If chksex.Value = 1 Then optboy.Enabled = True optgirl.Enabled = True Else
23
Else Else Else Else optboy.Enabled = False optgirl.Enabled = False End If End Sub
Private Sub chkscore_Click() If chkscore.Value = 1 Then txtscore1.Enabled = True txtscore2.Enabled = True Else
txtscore1.Enabled = False txtscore2.Enabled = False End If End Sub
4.2作为编程者的角度看,需要的是考虑用户的感受。当我调试程序后,遇到过当输入的数据类型与设置的变量类型不统一时,会出现许多错误,为避免如此,必须添加显式转换语句避免错误,由于我对现实转换这一内容不太熟悉,导致程序出现以下错误,如图所示:
24