当前位置:编程学习 > VB >>

关于VB的问题

输入信息后,单机添加按钮,将学生的信息写入d:\fact.dat 中

输入学号,单机显示按钮,将学生信息显示出来,并计算总分

为什么每次显示学生信息后,不管之前command1事件存入的是男还是女都显示女,当我用a.stusex as integer ,if option1.value =true then a.stusex =1 else a.stusex= 2 就能正常显示

追问:我还提了两个关于VB的问题,能不能也去帮忙解决一下
答案:因为a.stusex="男"永远不可能成立
你定义的是stusex 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.stusex) = "男" Then ..这么样除去字串右端空字符就行了
第二种:If Left(a.stusex,1) = "男" Then ..这么就是取10字符缓冲区中左边第一个字符对比
第三种:自己写字串对比的函数,按照自己的需求忽略缓冲区的填充字符程序在WIN7下调试通过,未发现你所说的问题,推测一下吧。
If a.stusex = "男" Then,此处未作trim处理,这可能是判断失败的原因,读取的字串带着一堆空格就去比较了


另一个问题就是,该程序每次启动,只要你新加记录,必定从记录文件第一个记录开始覆盖写入,所以,你要在写入前,先找到最后记录位置,赋值给m


还有就是写入前需要做学号相同检查等等了。

上一个:VB检测数据库路径
下一个:vb高手来啊

CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,