主窗体功能:可以让卡号上下机,并记录其上机时间,及上机后的余额。
步骤:
1,主窗体加载时
首先判断登录到该系统的用户级别,并对菜单进行相应的设置(若为操作用户则,管理员的菜单不可见,若为一般用户,则操作员和管理员的菜单都不可见)
然后将该值班老师的信息添加到正在值班教师表中。(在这里我将写表的过程独立了出来,在窗体加载时直接调用)
2,对卡进行操作:
首先判断该卡是否注册。若没有注册或已经注销,则提示信息,并显示最近一次正在上机的卡号信息;若没有正在上机的卡,则显示最近一次下机的卡号信息。(最近一次的上机卡的信息我独立了出来)
其次判断上下机:
1、刷卡上下机。判断该卡的上机状态(若为上机状态则下机,若为下机状态则上机)。
2、手动上下机。单击上机按钮:若该卡已经处于上机状态,则再次单击上机按钮不进行操作;若该卡是下机状态,则单击上机按钮上机;同理当单击下机按钮:若该卡处于上机状态则下机,若该卡已经处于下机状态,则不进行操作。
下机后对余额进行计算:
1,通过调用基本数据的单位费用来计算,因为费用是通过分钟来计算的,所以我先用DateDiff函数求出了两个时间差(分钟差),然后相乘即可。
If TimeDiff < 5 Then ’上机时间少于五分钟不计费
mrss.Fields(7) = 0
Else
mrss.Fields(7) = ((Val(TimeDiff) - 1) / 30 + 1) * Fee
End If2,消费时间的显示,由于在分钟转换为小时的时候可能会出现很多位小数,避免这种情况我用了Round函数只保留了两位小数。(当结果小于1时,Round函数不显示整数部分,所以对此情况又进行了字符串连接,这个仅仅是外观问题)
3,计算好消费金额,余额后,将该卡号修改后的信息替代原来上机记录表中该卡号的信息,并对最新余额表中的余额进行更新。
4,关闭主窗体时要对操作员记录表进行添加,并删除该用户在正在值班教师中的信息。(操作员记录表是通过正在值班表进行写入的)
5,在写入正在值班表时需要用到机器名(即本机的计算机名),在这里我用到了GetComputerName函数。(在这里要注意建表时该字段的长度设置,要尽量大一些)
下面是我在做该窗体时遇到的问题:
1.子窗体的显示问题:因为要在主窗体(MDI窗体)上添加控件,所以用了一个容器控件PictureBox,可是它的子窗体却被PictureBox盖住了。
在该窗体中遇到的问题:
我的解决方法是:使用SetParent(API函数),将要显示的子窗体强制转换为PictureBox的子窗体,这样它就可以在PictureBox控件上显示出来了。
2.上下机的判断:当一个卡号上机后,要用一个状态来记录它的上机状态,当该号再一次单击上机时没有操作,若该号单击下机时,计算它的余额,修改它的上机状态;若下机后在对该卡号单击下机则提示。在一个卡号上机后允许其他用户随意上下机。
在这里遇到的问题:
3,更换用户后的显示问题(若这个用户不能上机,则显示上一条正在上机的用户信息,或下机用户的信息)。
4,余额的更新问题:余额一定要是最新的,所以需要用一个表专门存储余额信息,一旦当余额发生变化,它就进行更新,然后用刀余额的地方都从该表中调用余额。
5,更新一致问题:主窗体一共用到了两个表:学生信息表和上机记录表,所以如果卡号发生变化,两个表的显示情况都要发生变化,不能只变一个地方;且每次变化显示上机人数都要进行更新。
6,消费金额的计算:首先要用DateDiff函数求得时间(分钟)差,然后根据基本数据表中的单位费用进行计算,当余额不足时不能上机;用Round函数将分钟转换为小时。
7.调用问题:在一个窗体中不能直接调用另一个窗体的文本框的内容或者事件等(因为他们不是全局变量)
可以事前将要调用的文本等转换为全局变量。
8.避免代码重复:若在一个窗体中有很多重复的代码,我们就可以把这些重复的代码独立出来写成一个过程,用的时候进行调用即可。
9.登录到主窗体时添加正在值班教师表(根据登录用户的不同级别对菜单显示进行相应的隐藏;如一般用户登录时只能看到一般用户和帮助的菜单),卸载主窗体时添加操作员工作记录表,其中用GetComputerName(API函数)获得计算机名。
10.刷卡回车事件:回车事件主要是根据该卡的上机状态来调用上下机事件。