VB编程俱乐部

大家好,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系统目录。