VB编程俱乐部
问:如何从定长(97字节)的记录中提取数据:有一个记录文件,保存着大量的定长记录,每个记录包含多个域(字段),这些字段有汉字、有英文、有数字,怎样读入这些记录并分解到内存变量中?
答:这是一个VB程序员经常遇到的问题,由于微软对VB进行的改造,使得VB的字符串函数以UniCode为处理对象,因此给我们的编程带来了一些困扰。
在VB中,Len(″中国ABC″)等于5,而我们希望是7;Mid(″中ABC国″,1,2)等于″中A″,而我们希望等于″中″。针对上述问题,特提供函数:
Public Function MidC(bytSource() As Byte,ByVal posStart As Long,Optional ByVal lenOfBytes As Long = 0) As String
Dim B() As Byte
If lenOfBytes = 0 Then lenOfBytes = 10000
B = MidB(bytSource,posStart,lenOfBytes)
MidC = StrConv(B,vbUnicode)
End Function
Public Function LenC(ByVal SourceString As String) As Integer
Dim byts() As Byte
byts = SourceString
LenC = LenB(StrConv(byts,vbFromUnicode))
End Function
然后,如果需要从 String 类型的变量中按字节边界提取子串,请使用以下方法:
Dim MyBytes() As Byte
MyBytes = StrConv(MyString,vbFromUnicode)
MySubString = MidC(MyBytes,起始位置,终止位置)
如果需要得到字符串的“传统”意义上的长度,可以
LengthOfYourString = LenC(YourString)
综上所述,你的问题可以如下解决:
Dim myStr(97) As Byte ′改变类型
Dim Char As Byte
Dim varString As String
Dim S As String
FileNum2 = FreeFile
Open ″E:\TEMP\07-11.dat″ For Binary As #FileNum2
i = 0
Do While Not EOF(FileNum2)
varString = String(97,″ ″): i = i + 1
VSFlexGrid2.AddItem i
For j = 1 To 97
Get #FileNum2,,Char
myStr(j) = Char
VSFlexGrid2.TextMatrix(i,j) = Chr(Char)
Next J ′上述语句其实可以直接读入 Byte 数组(97bytes/次)
S = StrConv(myStr,vbUnicode) ′ 将读入的 Bytes 转换为字符串
Loop
Close #FileNum2
End Sub
问:请教使用 DAO 访问Access数据库保存、显示照片的几个关键点。
答:程序如下:
Option Explicit
Dim BytFile() As Byte
Dim StrFileName As String
Dim LngFileLen As Long
Dim LngFileH As Long
Private Sub Command1_Click()
′保存照片文件到数据库中
LngFileH = FreeFile
Open StrFileName For Binary Access Read As LngFileH
LngFileLen = LOF(LngFileH)
If LngFileLen > 0 Then
ReDim BytFile(LngFileLen)
Get LngFileH,,BytFile
Data1.Recordset.Edit
Data1.Recordset.Fields(″照片″).AppendChunk (BytFile)
Data1.Recordset.Update
ReDim BytFile(0)
End If
Close LngFileH
End Sub
Private Sub Command2_Click()
′ 自数据库中读取照片数据,存为临时文件,然后显示之
StrFileName = App.Path & ″\temp.bmp″
LngFileLen = Data1.Recordset.Fields(″照片″).FieldSize
If LngFileLen > 0 Then
ReDim BytFile(LngFileLen)
BytFile = Data1.Recordset.Fields(″照片″).GetChunk(0,LngFileLen)
LngFileH = FreeFile
Open StrFileName For Binary Access Write As LngFileH
Put LngFileH,,BytFile()
Close LngFileH
End If
Set Image2.Picture = LoadPicture(StrFileName)
End Sub
Private Sub Command3_Click()
′Command3 Load From Picture
CommonDialog1.ShowOpen
StrFileName = CommonDialog1.filename
Set Image1.Picture = LoadPicture(StrFileName)
End Sub
Private Sub Form_Load()
CommonDialog1.InitDir = App.Path
End Sub
问:1.在VB6中能否用代码在已经存在的窗体中添加控件?(有没有这样的例子?)
2.怎样获取机器中Windows操作系统的子目录名字(例如:Windows、Win97或者是Win98等等)。
答:1.使用Load语句可以建立控件数组的新成员,如Form上已经存在 TextBox1 数组,则使用 Load TextBox1 可以获得一个新的数组元素;
2.使用 Windows API 函数可以很容易的得到 Windows 的系统目录名称:
首先声明:
Declare Function GetWindowsDirectory Lib ″kernel32″ Alias ″GetWindowsDirectoryA″ (ByVal lpBuffer As String,ByVal nSize As Long) As Long
然后调用即可:
Dim Buff as String
Buff = Space(128)
GetWindowsDirectory(Buff,128)
Buff = Left(Buff,Instr(Buff,Chr(0))-1)′ 去除尾部空白
最后,Buff中的即是Windows系统目录。