微信公众号 
图码生活

每天发布有五花八门的文章,各种有趣的知识等,期待您的订阅与参与
电脑报 1992-2001 十年文章全集
电脑报 1992-2001 十年文章全集
包含从 1992 年 - 2001 年间,两万余篇期刊文章,查询最少输入两个字符
随便看看
读取中
读取中
标题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系统目录。