关于VB的问题
输入信息后,单机添加按钮,将学生的信息写入d:\fact.dat 中输入学号,单机显示按钮,将学生信息显示出来,并计算总分
为什么每次显示学生信息后,不管之前command1事件存入的是男还是女都显示女,当我用a.stu易做图 as integer ,if option1.value =true then a.stu易做图 =1 else a.stu易做图= 2 就能正常显示
追问:我还提了两个关于VB的问题,能不能也去帮忙解决一下
输入信息后,单机添加按钮,将学生的信息写入d:\fact.dat 中输入学号,单机显示按钮,将学生信息显示出来,并计算总分
为什么每次显示学生信息后,不管之前command1事件存入的是男还是女都显示女,当我用a.stu易做图 as integer ,if option1.value =true then a.stu易做图 =1 else a.stu易做图= 2 就能正常显示
追问:我还提了两个关于VB的问题,能不能也去帮忙解决一下
答案:因为a.stu易做图="男"永远不可能成立
你定义的是stu易做图 As String*10
此时初始化时会自动填入10个空字 (每个字为十六进制的 0x20 0x00)
一个Unicode字符占16位二进制
简单做个试验:
Private Sub Form_Load()
Dim a As String*10
a = "啊"
If a = "啊" Then MsgBox "相同" Else MsgBox "不同"
End Sub
像这样就会输出:不同
原因是你已经定义了String的长度,String作为一个十个字的缓冲区无法和你的字符串"男"比较
再看如下示例:
Private Sub Form_Click()
Dim a As String * 10
a = "啊" '一个Unicode字符长度为16bit
GetWordHex (a) '调用下面函数
End Sub
Function GetWordHex(a() As Byte)'一个Byte长8bit
'函数获取了String字串的信息并转化成了Byte类型
Dim i As Integer
For i = 0 To 19 '读取20byte共10word
Print a(i); '在船体上显示信息
If i Mod 2 = 1 Then Print '每输出2个Byte就换行
Next
End Function
看输出:
74 85
32 0
32 0
32 0…
这样就知道了,在定义时候VB就把字符缓冲区用连续的32 0来填充,据此,继续看下面的例子:
Private Sub Form_Click()
Dim a As String * 2
Dim b As String * 2
Dim c As String
a = "啊"
c = Convert_Two_Bytes_To_UnicodeString(32, 10) '注*1
b = "啊" + c
If a = b Then MsgBox "相同" Else MsgBox "不同"
End Sub
Function Convert_Two_Bytes_To_UnicodeString(a1 As Byte, a2 As Byte) As Byte() '转换Byte为String
Dim b(2) As Byte
b(0) = a1
b(1) = a2
Convert_Two_Bytes_To_UnicodeString = b
End Function
这个例子中就看出上面写的b和a是等同的
当你把注1处两个数字修改掉,那么答案会是"不同"
最后,说了那么一大堆,关于这个问题的解决方法就可以是
第一种:If RTrim(a.stu易做图) = "男" Then ..这么样除去字串右端空字符就行了
第二种:If Left(a.stu易做图,1) = "男" Then ..这么就是取10字符缓冲区中左边第一个字符对比
第三种:自己写字串对比的函数,按照自己的需求忽略缓冲区的填充字符程序在WIN7下调试通过,未发现你所说的问题,推测一下吧。
If a.stu易做图 = "男" Then,此处未作trim处理,这可能是判断失败的原因,读取的字串带着一堆空格就去比较了
另一个问题就是,该程序每次启动,只要你新加记录,必定从记录文件第一个记录开始覆盖写入,所以,你要在写入前,先找到最后记录位置,赋值给m
还有就是写入前需要做学号相同检查等等了。