按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!
以包括各种数据类型(字符串,整型,日期等等)的内容。当你使用随机访问的文件时,你经常要
创建一用户定义的变量,因为,该变量使你可以轻易地访问个别记录。
1。 在当前工程里插入新模块并且重命名为RandomFiles
2。 在模块上面,紧接着Option Explicit语句下面,输入下述类型定义:
Option Explicit
' define a user…defined type
Type Dictionary
en As String * 16 ' English word up to 16 characters
sp As String * 20 ' Spanish word up to 20 characters
End Type
用户定义的名为Dictionary的类型包括两个声明为String(字符串)的项目,并且有特定的大小。
成员en可以接受最多16个字符,第二个项目sp的大小不能超过20个字符。如果你将这两个成员的长
度加起来,那么记录长度将为36(16+20)。如果模块了已经有了Option Explicit语句的话,你就
148
… 页面 165…
不必再输入它了。
3。 输入下面的过程EnglishToSpanish
Sub EnglishToSpanish()
Dim d As Dictionary
Dim RecNr As Long
Dim choice As String
Dim totalRec As Long
RecNr = 1
'open the file for random access 打开文件作随机访问
Open 〃Translate。txt〃 For Random As #1 Len = Len(d)
Do
' get the English word 活动英文词语
choice = InputBox(〃Enter an English word〃; 〃ENGLISH〃)
d。en = choice
' exit the loop if cancelled 如取消则退出循环
If choice = 〃〃 Then Exit Do
choice = InputBox(〃Enter the Spanish equivalent for 〃 _
& d。en; 〃SPANISH EQUIVALENT 〃 & d。en)
If choice = 〃〃 Then Exit Do
d。sp = choice
' write to the record 写入记录
Put #1; RecNr; d
' increase record counter 增加记录计数器
recNr = recNr + 1
Loop Until choice = 〃〃 'ask for words until Cancel 询问词语直到取消
totalRec = LOF(1) / Len(d)
MsgBox 〃This file contains 〃 & totalRec & 〃 record(s)。〃
' close the file
Close #1
End Sub
过程EnglishToSpanish开始时,声明四个变量,变量d声明为用户定义的类型Dictionary。该类型
在前面就用Type语句声明了(见第二步)。在给变量RecNr赋予了初始值之后,VB打开文件
Translate。txt,并且将其作为文件编码1随机访问。指令Len(d)告诉VB每条记录的大小为36字符。
接下来VB执行Do…Until循环里面的语句,直到你取消。循环里的第一条语句提示你输入一个英语
单词,并且将其赋予变量choice,然后该值被传递给用户定义d的第一个成员(d。en)。
一旦你停止输入数据,VB就会退出Do循环,并且执行程序里的最后的语句计算和显示文件里的记录
总数。最后一条语句将文件关闭。如果你输入了英文词语并点击确定,那么下个对话框就会提示你
输入外语等同语。当然,如果你决定现在就退出的话,VB就会跳出循环并且继续剩下的语句。如果
一切正常,你输入了外语翻译,那么VB就会将它赋予变量choice并且传递给用户自定义变量d的第
二个成员(d。sp),接下来,VB使用下述语句将整条记录写入到文件里:
Put #1; recNr; d
写入第一条记录后,VB会给记录计数器增加1,然后重复循环里的语句。过程EnglishToSpanish允
许你在你的字典里输入任意多条记录。当你退出提出词语时,过程使用LOF和Len函数来计算文件里
的总记录数。VB在显示信息后关闭该文本文件(Translate。txt)。
创建随机文件仅仅是个开始,接下来,过程VocabulartDrill示范如何使用一个开启的随机文件的
记录。这里,你将学习让你快速找到你文件中适合的数据的语句。
技巧8…9 理解Type语句
Type命令允许你创建一个自定义组,包括混合的变量类型,称为“用户自定义数据类型”。Type语
句通常用于随机文件,将信息作为区域储存为固定大小的记录。我们可以将随机文件用的区域使用
Type语句集中成为一个用户自定义,而不必为每个区域都声明一个变量。例如,如下所示定义一个
149
… 页面 166…
包含三个区域的记录:
Type MyRecord
country As String * 20
city As String * 14
rank As Integer
End Type
一旦定义了类型,你必须给使用这种类型的变量名称:
Dim myInfo As MyRecord
使用变量名称后面加上句号和内部变量可以访问内部变量(country; city; rank),例如,要明确
城市,输入:
MyInfo。city = 〃Warsaw〃
4。 在过程EnglishToSpanish下面输入下面显示的过程VocabularDrill,代码的介绍在其后面。
Sub VocabularyDrill()
Dim d As Dictionary
Dim totalRec As Long
Dim recNr As Long
Dim randomNr As Long
Dim question As String
Dim answer As String
' open a random access file 打开随机访问文件
Open 〃Translate。txt〃 For Random As #1 Len = Len(d)
' print the total number of bytes in this file 打印本文件的总字节数
Debug。Print 〃There are 〃 & LOF(1) & 〃 bytes in this file。〃
' find out and print out the total number of records 找到并且打印总记录数
recNr = LOF(1) / Len(d)
Debug。Print 〃Total number of records: 〃 & recNr
Do
' get a random record number 获取随机记录数
randomNr = Int(recNr * Rnd) + 1
Debug。Print randomNr
' find the random record 找到该随机记录
Seek #1; randomNr
' read the record 读取记录
Get #1; randomNr; d
Debug。Print Trim(d。en); 〃 〃; Trim(d。sp)
' assign answer to a variable 将答案赋予变量
answer = InputBox(〃What's the Spanish equivalent?〃; d。en)
' finish if cancelled 如取消则介绍
If answer = 〃〃 Then Close #1: Exit Sub
Debug。Print answer
' check if the answer is correct 检查答案是否正确
If answer = Trim(d。sp) Then
MsgBox 〃Congratulations!〃
Else
MsgBox 〃Invalid Answer!!!〃
End If
' keep on asking questions; until Cancel is pressed 不断提问,直到按下取消
Loop While answer 〃〃
' close file 关闭文件
Close #1
150
… 页面 167…
End Sub
声明变量之后,过程VocabularyDrill打开一个随机访问文件,并且告诉VB每个记录的长度Len =
Len(d),接下来,在立即窗口里打印文件的总字节数和总记录数。字节数是由语句LOF(1)返回的。
记录数是总字节数(LOF)除以一个记录的长度——Len(d)。接下来,VB执行循环里的语句直到按
下Esc键或者取消按钮。循环里的第一条语句将函数Rnd的结果赋予变量randomNr。接下来的语句将
这个数字写入立即窗口,指令Seek #1; randomNr在开启的文件中移动光标到变量randomNr明确的
记录处,在下来的指令读取找到的记录内容。要在打开的随机访问文件中读取数据,你必须使用Get
语句。指令:
Get #1; randomNr; d
告诉VB要读取的记录号码(randomNr)以及要读取数据的变量(d)。随机文件中的第一个记录在位
置1,第二个记录在位置2,依次类推。忽略记录号码会导致VB读取下一个记录。然后,用户定义的
类型字典的两个成员都被写入了立即窗口。函数Trim(d。en)和Trim(d。sp)将读取的记录前后可能含
有的空格。接下来,VB显示信息,提示用户提供显示单词的外语等同语。该单词赋予变量answer,
如果你按下Esc而不是点击确定的话,VB就会关闭文件并且接受程序,否则,VB将打印你的答案到
立即窗口,并且通知你,你的答案是否正确。当你要退出单词训练程序,随时可以按下Esc或者点
击对话框的取消按钮。
如果你决定继续并且点击了确定按钮,程序就会产生一个新随机号码,并且会找回一个英语单词并
且问你相对应的西班牙译语。
你可以修改该过程VocabularyDrill,因此你可以将每个不正确翻译的单词写到工作表。同样,你
也许想要将文件Translate。txt里的所有记录到写到工作表里,这样你就总可以知道你的字典内容。
你�