VB编程俱乐部 庞一鸣 2000年 第34期   大家好,VB编程俱乐部又和大家见面了!大家提交问题或解答问题,既可使用 VBForums@126.com 或 VBForums@bigfoot.com邮件地址,也可以通过访问网站 http://VBForums.yeah.net,在 BBS板上讨论来达到。订阅或退订VBForums请到 http://www.vbforums.net 在线操作即可。   问:如何从定长(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系统目录。