VB编程俱乐部

Author: 庞一鸣 Date: 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系统目录。