1、第十三课 文件操作控件教学目标:1、设计程序,用水平和垂直滚动条分别表示速度和时间。设时间的变化范围是0-100 公里/小时,时间的变化范围是 0-50 小时,当速度或时间发生变化时,分别在水平和垂直滚动条边的标签框中显示当时的时间和速度值,并在“距离(公里)下的标签框中显示相对于该速度和时间的距离值”。2、用滚动条实现一个简易的调色板程序,用三个滚动条分别表示红、绿、蓝三色的构成比例,各配有一个标签框加以说明,用文本框的背景色来体现构成的颜色。3、显示系统时间。教学重难点:教学重点:在窗体上设计一个能按 12 小时和 24 小时进行转换的数字时钟。教学难点:设计一个计时器,能够设置倒计时的时
2、间,并进行倒计时。教学准备:多媒体网络教室、教学软件。教学过程:导入:在一个应用程序中,对文件的处理是一个比较常用的操作,如打开文件、保存文件,等等。Visual Basic 提供了三个控件对磁盘文件夹与文件进行显示与操作,它们分别是:DriveListBox(磁盘列表框)控件、DirListBox(文件夹列表框)控件,以及 FileListBox(文件列表框)控件。如图一:图一一、DriveListBox(磁盘列表框)控件:在工具箱面板上,DriveListBox 控件的图标如图二:图二在窗口中创建的磁盘列表框可以自动显示电脑上或网络上的所有磁盘驱动器,另外,还可以通过语法设置运行时显示的驱
3、动器名称,这就要用到 Drive 属性。磁盘列表框名称.Drive = Drive(如 C: ,或者 D:,等等)。Drive 属性,它用来设置或返回当前驱动器的名字,但在设计阶段不能使用这个属性,必须在程序中赋值,如执行上面的的赋值语句后,把当前的驱动器改为“c: 或 d:”当用户单击列表框中某一驱动器名时,该驱动器名就成为该列表框的 drive 属性值,也就是说,drive 属性可以用来设置当前驱动器,也可以接受并返回用户选定的的驱动器名。比如,要在窗体启动时把当前磁盘改为 F 盘,那么:Private Sub Form_Load() Drive1.Drive = F:End Sub图三例
4、:在窗体上添加一个驱动器列表,一个“退出”命令按钮。当单击驱动器列表框中的某个驱动器名称时,用消息框显示所选的驱动器。用鼠标单击工具箱中的驱动器列表框图标,并用鼠标在窗体上拖出一个驱动器列表框。驱动器列表框的右端有一个下三角按钮,在程序运行时,单击此按钮可以打开一个列表,列出当前系统中所能使用的驱动器名字,列表顶部显示当前驱动器的名字,用户单击列表框中某一驱动器的名字,则顶部立即改为用户所选的驱动器的名字。当 drive 属性值发生改变时,就发生 change 事件。例如,执行上面的赋值语句后,就触发 drive1_change()事件过程,为了显示所选中的驱动器名,编写下列代码:privat
5、e sub drive1_change()msgbox “选中的驱动器是: ”& drive1.drive end sub二、DirListBox(文件夹或目录列表框)控件:在工具箱面板上,DirListBox 控件的图标如图四:图四文件夹列表框控件可以显示与设置文件夹的路径,当用户在窗口中创建DirListBox 控件时,双击其中的文件夹,不需进行编程就能自动显示下一级的文件夹,如图五:图五本控件的主要属性是 Path 属性,用来返回或设置当前文件夹的路径,只能在程序运行中使用,其语法是:文件夹列表框名称.Path = 具体的路径比如,我们要在窗体启动时把默认显示的文件夹改为 D:Mytoo
6、l ,程序可以这样写:Private Sub Form_Load() Dir1.Path = D:Mytool End Sub例 2在上例的基础上,添加一个目录列表框 dir1,当选中某个驱动器后,该驱动器的目录显示在目录列表框中。如果选中某个目录,用消息框显示被选中的目录名。从例 2 中可以看到顶部的根目录是“c:”,下面列出了“c:”下的子目录名,其中“VB98” 被点亮,表示它是系统的当前目录。列表框右侧有一个垂直滚动条,在程序运行时移动滚动条可以浏览全部目录,从例中可以看到,只有当前目录(VB98)是打开的,其他子目录全部是关闭的。双击一个目录,使其被打开,触发目录列表框的 chang
7、e 事件程序如下 private sub dir1_change()msgbox “选中的目录是: ”& dir1.path end sub到目前为止,窗体中的驱动器列表框和目录列表框相互之间尚未建立联系,也就是说,改变驱动器名时,目录列表框中内容不能随之变化。若要把驱动器列表框和目录列表框结合起来,使二者“同步”,需要编写一段程序。private sub drive1_change() dir1.path=drive1.driveend sub例如,当驱动器列表框中当前目录由“c:”改变为 “d:”时,发生了 change 事件, 执行 drive1_change 过程三、FileListB
8、ox(文件列表框)控件:跟前面两个控件一样,本控件能够自动显示符合条件的文件清单。如图六:图六文件列表框控件主要有两个属性,即 Path 属性与 FileName 属性,前者代表文件的路径,从显示路径的功能上来说,比后者更简便一些,path 的缺省值是系统的当前路径。;后者则用来返回或设置所选文件的路径与文件名,其语法是: 文件列表框名称.FileName = 路径比如,我们要在窗体启动时将 E:稿件 目录下的所有 ZIP 文件列出来,程序可以这样写:Private Sub Form_Load() File1.FileName = E:稿件*.zipEnd Sub结果如图七:图七1利用 pat
9、h 属性保持文件列表与目录的同步private sub dir1_ change() file1.path=dir1.pathend sub请注意:目录列表框和文件列表框都有 path 属性,但二者的含义不同,如果有以下两个赋值语句:dir1.path=”a:” file1.path=”a:”则在目录列表框中显示 a 盘根目录下的目录结构,而在文件列表框中则列出 a 盘根目录下的全部文件名,在这里 path 用来确定文件的路径。2 用 filename 属性设置或返回文件名文件列表框的另一属性 filename 用来在运行时设置或返回所选中的文件名。例如,我们用 msgbox 函数显示被选中的
10、文件。当用鼠标单击文件时,文件被选中, 可以通过 filename 属性得到文件名:private sub file1.click()msgbox “选中的文件是:”+file1.filename end sub如果用户单击文件列表框中一个文件名,则将此文件名送到列表框控件 filename属性,与就是说,从该控件的 filename 属性得到用户所选的文件名。3pattern 属性限制显示文件的类型文件列表框有一个 pattern 属性,用来指定在文件列表框中显示文件的类型,它的缺省值为“*.*”,即显示所有文件的名字。如将 pattern 属性设置为“*.frm”,则显示扩展名为.frm
11、的文件. pattern 属性值既可以在设计阶段从属性表中设置,也可以在运行阶段由语句实现,如:file1.pattern=”*.frm”四、三个控件的连接:(利用 path 属性)上面我们就三个控件进行了分别的学习,在程序中,它们却是互不关连的,并不是只要在窗体中创建了它们,然后对某个控件(如磁盘列表框)进行操作,其他控件就会自动显示相应的磁盘下的文件,这需要用程序进行实现。1、将磁盘列表框的操作赋值给文件夹列表框的 Path 属性,在磁盘列表框的Change 事件中输入如下代码:Private Sub Drive1_Change() Dir1.Path = Drive1.DriveEnd
12、Sub2、对文件夹列表框控件进行的操作,直接影响文件列表框所显示的内容: Private Sub Dir1_Change()File1.Path = Dir1.Path End Sub最后结果如图八:图八五、运用文件系统控件在应用程序中,常常需要对文件进行操作(如打开、复制、重命名等)。在开发这些程序时,应该提供给用户方便友好的操作界面的操作界面。例:本例介绍如何将驱动器、目录和文件列表等三个控件结合起来使用,并使其同步工作,以及怎样利用它对文件进行复制重新命名和删除的操作。1. 装载窗体在初始装载窗体时,将当前路径显示在标签框中private sub form_load() label8.c
13、aption=dirlist.path (目录列表框名称) end sub程序运行后,label8.caption 的值将会由于 dirlist_change()事件过程而发生改变。如果不在初始装载时为 label8.caption 赋值,并且不改变目录,则 label8.caption 一直为空。2. 保持各文件系统控件的同步若要使驱动器列表框、目录列表框和文件列表框保持同步,需要如下两个事件过程:private sub drivelist_change() (驱动器列表框名称) dirlist.path=drivelist.driveend subprivate sub dirlist_c
14、hange() (目录列表框名称) filelist.path=dirlist.path label8.caption=dirlist.pathend sub当用户单击驱动器列表框的某一驱动器名时,触发 drivelist_change()事件过程, 将驱动器名赋给目录列表框的path 属性,以使驱动器列表框与目录列表框“同步”由于目录列表框中的目录发生改变,触发了 dirlist_change()事件过程,该过程首先将目录列表框的 path 属性值赋给文件列表框的 path 属性。然后将目录列表框的 path 属性值赋给 label8.caption。3. 选择文件名假设我们用单击操作选定文
15、件名,所以我们设计一个对文件列表框的“单击”事件过程。Private sub filelist_click() Label4.caption=filelist.filename If right$(dirlist.path,1)=” thenChoicedfile=dirlist.path+filelist.filename Else Choicedfile=dirlist.path+”+filelist.filename End ifEnd sub先将文件列表框的 filename 属性(即选定的文件名)送给标签 4 的 caption 属性, 以便被显示出来。考虑到后面要进行复制、删除、重
16、命名等操作,应该把被选定的文件保存下来, 并在其他事件过程中对此文件进行操作。我们准备把文件名放到名为 choicedfile 的字符串变量中。但还有两个问题要处理。(1) 应在文件名前加上路径,从而得到完整的文件名,否则系统无法找到该文件(2) 如果所选择的目录是根目录,其表示方式为“c:”或者”a:”等,即路径字符串的末尾有一个“”符号。如果不是根目录,则无此“”符号,如:“c:vb”。这部分需要分别处理:对已有“”号的不再加“”号;原来无“”号的,在路径前加一“”号。如:“c:”下面的文件 a1.vbp,应表示为“c:vba1.vbp”。上面的 filelist_click 事件过程中的
17、 if 语句就是对 dirlist.path 最后一个字符进行判断,如果是“”,则 choicedfile的值是把路径字符串和文件名直接串接起来,如果无“”号,则在路径字符串之后加一“”号,然后串接文件名4. 确定文件列表框的显示内容用户还应选择文件列表框中需要显示的文件类型,用户在组合框 combo1 中选择需要显示的文件类型,所选的类型应放在列表框的 pattern 属性中,其过程如下:private sub combo1_click() filelist.pattern=combo1.text end sub5. 文件的复制private sub cmdcopy_click()dim s
18、ourfile as string 表示源文件名dim destfile as string 表示目标文件str2$=” 请 输 入 目 的 文 件 ” sourfile=choicedfile destfile=inputbox$(str2$,”复制文件”)包括目标文件的路径,若只指定文件名则目标文件将复制到 vb 缺省的文件中即vb98if destfile” ”then filecopy sourfile,destfile end ifend sub注意:为了在不同过程中使用同一个变量,应在设计阶段在窗体的“通用”区将choicedfile 定义为窗体级变量。Dim choicedfil
19、e as string,这样,在同一窗体内的两个或多个过程中所用的 choicedfile 代表同一个文件。VB 提供的几个语句格式Filecopy , 目标文件指定路径否则就在 vb 缺省目录 vb98 中Name as 新文件名也要指定路径否则就在 vb 缺省目录vb98 中Kill 6. 文件命名按钮的代码如下: private sub cmdrename_click() dim oldname as stringdim newname as string title$=”重新命名”str0$=”请再输入一遍需要修改的文件名(全路径)”str1$=choicedfile+chr$(10)
20、+chr(13)+str0$ str2$=” 请 输 入 新 文 件 名 ” oldname=inputbox(str1$,title$)msg$=”确认被更改的文件名”&oldname p=msgbox$(msg$,35,”数据检查框”)if p=6 then newname=inputbox(str2$,title$) name oldname as newnamemsgbox “你的新文件名是:”+newname end ifend sub7. 删除文件private sub cmdkill_click() dim killedfile as string killedfile =choicedfile title$=”数据检查框”msg1$=”你要删除文件:”&killedfilex=msgbox(msg1$,35,title$) if x=6 thenkill killedfile end ifend sub