第7章 My命名空间本章主要内容:My命名空间结构。Tabcontrol选项卡控件。文件操作。OpenFileDialog控件,SaveFi leDialog控件和SaveAsFiledialog控件使用。目录操作、FolderBrowserDialog控件。键盘操作。网 络操作。应用程序启动退出事件操作。窗体实例间互相访问。Visual Basic 2005 提供的My命名空间提供了一系列对象,程序 设计人员通过这些对象可以方便地访问和控制计算机的相关内容(如文件、目录操作,剪贴板操作等)、应用程序和窗体等。My命名空间对象之间 的关系如图7-1所示。例7.1构建选项卡窗体,演示My命名空间中的相关功能。具体操作过程:⑴ 新建项目,选择“Windows应用程 序”,项目名称为“MyComputer命名空间演示”。⑵ 在解决方案资源管理器中把“Form1.vb”文件名改为“MyComput er命名空间演示.vb”。⑶ 打开窗体设计视图,选择窗体,在属性框中修改窗体的属性:Name为“frmMyNameSpaceDem o”;StartPosition为“CenterScreen”;Text为“My.Computer命名空间演示”。⑷ 为窗体添加选 项卡TabControl控件,Name为“myPages”。TabControl控件中的选项卡由空间的TabPages集合管理,在 属性框中单击TabPages属性中的按钮,Visual Basic 2005 将打开TabPage集合编辑器,如图7-2所示。可以 向集合中添加成员,选中成员后,还可以修改成员的属性,如Name和Text等。在本例中,在TabPage集合中共创建5个选项成员,其 中的属性修改如表7-1所示。表7-1 My命名空间演示中选项成员及其属性⑸ 为窗体添加TextBox控件,Name为“txtOut put”,Multiline为True,ScrollBars为Vertical。⑹ 在“Public Class frmMyNam eSpaceDemo”后添加过程showText,用于通过txtOutput文本框显示输出内容: ''定义通过输出文本框输出内容过程 Private Sub ShowText(ByVal txt As String, Optional ByVal clea r As Boolean = False) If clear Then txtOutput.T ext = "" ''清除输出框内容 End If txtOutput.Text = txtOutpu t.Text & txt End Sub注意:ShowText中的clear为可选参数,如果为True,则消除输出内容,否则 只是在输出框追加内容。⑺ 在代码编辑窗口中,在类名下拉列表中选择“myPages”,在方法名称下拉列表中选择“SelectedIn dexChanged”,添加TabControll控件中被选中选项变化事件的响应代码:Private Sub myPages_Se lectedIndexChanged(ByVal sender As Object, _ ByVal e As System.EventArgs) Handles myPages.SelectedIndexChanged''输出选择 的选项卡的名称ShowText("您选择的是:" & myPages.SelectedTab.Text() & vbCrLf, T rue) End Sub提示:Tabcontrol控件可以根据功能需要,对屏幕上显示的控件进行分类,每次只显示相关的控件,因此在 程序设计中经常使用。Tabcontrol控件的每个选项卡都是一个容器,因此向指定的选项卡中添加控制之前,必须先选中相应的选项卡。可 以通过单击控件中的某一选项卡来更改当前的选项卡,也可以使用TabControl 的属性,以编程的方式更改当前的选项卡:myPage s.SelectedIndex = x 表示编号为x的选项卡被选中;x = myPages.SelectedIndex 返回选中的 选项卡的编号。myPages.SelectedTab = tmpTab 表示选项卡对象tmpTab被选中;tmpTab = myP ages. SelectedTab 返回选中的选项卡对象。myPages.DeselectTab(x)表示编号为x的选项卡取消选中 ,其后继选项卡被选中。当不同选项进行切换时,触发的事件有:SelectedIndexChanged:选项卡发生改变发生。Desel ecting:在取消选择某个选项卡之前发生,使处理程序能够取消选项卡更改。Deselected:当取消选择选项卡时发生。 Sele cting:在选择某个选项卡之前发生,使处理程序能够选择选项卡更改。Selected:当选择某个选项卡时发生。运行程序,结果如图7 -3所示。7.1 文件操作Visual Basic 2005 提供了丰富的文件操作方式,如StreamReader和StreamW riter类等。不过使用My.Computer.FileSystem更方便简洁。7.1.1 OpenFileDialog例7.2 通过OpenFileDialog类创建选择文件对话框,提示用户选择文件。在例7.1中,选择TabControl控件中文件操作演示选 项,添加:⑴ Label控件,Text为“文件名:”。⑵ TextBox控件,Name为“txtFilename”。⑶ Butto n控件,Name为“btnBrowseFile”,Text为“浏览”。⑷ OpenFileDialog控件,Name为“objOp enFile”。注意:OpenFileDialog为不可见控件,因此只在设计窗口的底部显示OpenFileDialog控件的名字信 息。⑸ 双击“浏览”按钮,在代码编辑器中添加Click事件响应的代码: Private Sub btnBrowseFile_ Click(ByVal sender As System.Object, _ ByVal e As S ystem.EventArgs) Handles btnBrowseFile.Click ''设置选择文件对话框属性 objOpenFile.FileName = "" objOpenFile.Filter = "CSV格式文件(. csv)|.csv|文本文件(.txt)|.txt|所有文件(.)|." objOpenFile.De faultExt = "txt" objOpenFile.Title = "选择一个文本文件" ''如果选择文件时单击 “确定” If objOpenFile.ShowDialog() = Windows.Forms.DialogRes ult.OK Then txtFilename.Text = objOpenFile.FileName ''记录、显示文件名字 End IfEnd Sub运行程序,单击浏览按钮,弹出如图7-4所示对话框,单击“打开 ”,选择文件,如图7-5所示。提示:OpenFileDialog类常用的属性有:InitialDirectory :获取或设置文件 对话框显示的初始目录。例如:objOpenFile.InitialDirectory = "c:\" 表示指定初始目录为c:\。 Filter :获取或设置当前文件名筛选器字符串。例如:objOpenFile.Filter = "CSV格式文件(.csv)| .csv|文本文件(.txt)| .txt|所有文件(.)|." 表示对话框只显示扩展名为txt、csv的文件,或所 有文件,则选择文件时文件的类型选项下拉列表如图7-6所示。DefaultExt : 获取或设置默认文件扩展名。例如: obj OpenFile.DefaultExt = "txt"表示默认的文件扩展名为txt。Multiselect:获取或设置一个值,该值 指示对话框是否允许选择多个文件。例如: objOpenFile.Multiselect = True 表示允许选择多个文件。 当需要选择多个文件时,按住Ctrl键,单击文件名进行选择。Title:获取或设置文件对话框标题。例如: objOpenFil e.Title = “选择一个文本文件”,则选择文件对话框的标题显示“请选择一个文本文件”,而不是默认的“打开”。FileName :获取或设置一个包含在文件对话框中选定的文件名的字符串。FileNames:当Multiselect为True时,获取对话框中所有 选定文件的文件名,返回的文件以String数组的形式保存。例如:Dim file, files() As Stringfiles = objOpenFile.FileNamesFor Each file In files 依次获取文件名,对文件file进行 操作Next 7.1.2 整体读取文件内容对文件的内容按整体进行读取的方式有两种:⑴ 使用ReadAllText方法整体读取文本文 件,例如:Dim value As String = My.Computer.FileSystem.ReadAllText(fil e ,encoding)file为文件名;encoding为文件的编码方式,如果省略,文件的编码方式默认为utf8。⑵ 使用Rea dAllBytes 方法整体读取二进制文件,将以字节数组的形式返回该文件的内容。例如:Dim value As Byte() = My.Computer.FileSystem.ReadAllBytes (file)file为文件名。例7.3 使用My.Comp uter.FileSystem.ReadAllText整体读取文本文件内容。在例7.1中,选择TabControl控件中文件操作演 示选项,继续上一节的操作添加:⑴ Button控件,Name为“btnReadAll”,Text为“整体读取”。⑵ 在ShowTe xt过程后再添加过程FileName(),返回选择的文件名: Private Function FileName() As Str ing If String.IsNullOrEmpty(txtFilename.Text) Then ''如果 没有选择文件名 MessageBox.Show("请先选择一个文件名!", "提示") ''显示提示信息 Return Nothing ''返回空 Else Ret urn txtFilename.Text ''返回选择的文件名 End If End Function⑶ 双击 “整体读取”按钮,在代码编辑器中添加Click事件响应的代码: Private Sub btnReadAll_Click(B yVal sender As System.Object, _ ByVal e As System. EventArgs) Handles btnReadAll.Click Dim strFileName As Str ing = FileName() ''读取选择的文件名 If strFileName Is Nothing The n ''如果文件名为空 Exit Sub ''退出过程 Else ''否则整体读取 文本文件内容 Try ShowText(My.Computer.FileSys tem.ReadAllText(strFileName, _ Syste m.Text.Encoding.GetEncoding("gb2312"))) Catch ex As Ex ception MessageBox.Show("读取文件错误: " & ex.Message, " 提示") End Try End IfEnd Sub提示:System.Text.Enco ding.GetEncoding("gb2312")返回编码名为gb2312的编码编号。My.Computer.FileSyste m.ReadAllText(strFileName,System.Text.Encoding.GetEncoding("gb231 2"))中,读取文件strFileName的内容时,内容的编码按gb2312的编码形式读取。gb2312是我国汉字的编码形式之一。 运行程序,先选择文件,然后单击“整体读取”按钮,结果如图7-7所示。7.1.3 按行读取文件内容按行读取文件的操作流程为:⑴ 创建 StreamReader流读取文件内容对象:Dim fileReader As System.IO.StreamReader⑵ 打 开通过StreamReader对象读取的文件:fileReader = My.Computer.FileSystem.OpenTe xtFileReader(file ,encoding)⑶ 逐行读取文件内容:Dim str As String = fileRe ader.ReadLine()例7.4 按行读取文本文件内容。在例7.1中,选择TabControl控件中文件操作演示选项,继续上 一节的操作添加:⑴ Button控件,Name为“btnReadLine”,Text为“按行读取”。⑵ 双击“按行读取”按钮,在代 码编辑器中添加Click事件响应的代码: Private Sub btnReadLine_Click(ByVal sender A s System.Object, _ ByVal e As System.EventArgs) Han dles btnReadLine.Click ''读取选择的文件名Dim strFileName As String = FileName() If strFileName Is Nothing Then '' 如果文件名为空 Exit Sub ''退出过程 Else ''否则按行读取文本文件内容 ''声明StreamReader对象 Dim fileReader As System.IO.S treamReader Try fileReader = My.Computer.FileSyst em.OpenTextFileReader(strFileName, _ System.Text.Encoding.GetEncoding("gb2312")) ''打开文件 Dim stringReader As String Dim intLine As Intege r = 0 ShowText("", True) Do While N ot fileReader.EndOfStream() ''一直读到文件末尾 str ingReader = fileReader.ReadLine() ''读取一行 intLine += 1 ShowText("第" & CStr(intLine) & " 行: " & s tringReader & vbCrLf) Loop Catch ex As Exception ''捕获读取文件操作时的异常 MessageBox.Show("读取文件错误: " & ex.Message, "提示") End Try End IfEnd Sub提示: fileReader.EndOfStream():按流读取文件内容时,如果到达文件末尾,返回True,否则返回False。file Reader.ReadLine():从当前流中读取一行字符并将数据作为字符串返回。运行程序,先选择文件,然后单击按行读取按钮,结果 如图7-8所示。7.1.4 读取结构化文件内容Visual Basic 2005 中的TextFieldParser 对象提供了一 种可以轻松而高效地分析结构化文本文件(如日志文件等)的方法,可以读取的结构化文件(包括使用特定字符分隔内容的文件)和具有固定宽度文 本字段的文件。读取结构化文件的操作流程为:⑴ 创建 TextFieldParser对象,并指明读取的文件名及其编码方式: Di m MyReader As New FileIO.TextFieldParser(file,encoding)⑵ 定义读取结构化文 件的方式:使用分隔符分隔内容,例如使用“,”分隔:MyReader.TextFieldType = FileIO.FieldTyp e.DelimitedMyReader.SetDelimiters(",") 使用固定宽度文本字段,例如第一列的宽度为 5 个字符,第二列的宽度为 10 个字符,第三列的宽度为 11 个字符,第四列的宽度可变:MyReader.TextFieldTyp e = FileIO.FieldType.FixedWidthMyReader.SetFieldWidths(5, 10, 11, -1)⑶ 每次按结构读取文件中的一行,每个字段内容保存到数组中,例如:Dim currentRow As String() = MyReader.ReadFields()例7.5 按结构化的方式读取文本文件内容。在例7.1中,选择TabControl控件中文 件操作演示选项,继续上一节的操作添加:⑴ Button控件,Name为“btnReadStructure”,Text为“结构化读取 ”。⑵ 双击“结构化读取”按钮,在代码编辑器中添加Click事件响应的代码: Private Sub btnReadStructu re_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles btnReadStructure.Click Dim st rFileName As String = FileName() ''读取选择的文件名 If strFileNam e Is Nothing Then ''如果文件名为空 Exit Sub ''退出过程 Else ''否则按行读取文本文件内容 ''声明结构化读取文件内容的流对象对象 D im reader As New FileIO.TextFieldParser(strFileName, _ System.Text.Encoding.GetEncoding("gb2312")) ''读取的内容的字段 被分隔 reader.TextFieldType = FileIO.FieldType.Delimited ''文本内容字段被分隔字符为"," reader.SetDelimiters(",") Dim currentRow As String() ''声明一维数组,保存读取的内容 ShowText("", True) ''读取文件内容 Do While Not reader.EndOf Data() Try currentRow = reader. ReadFields() ''读取一行 Dim currentField As Str ing For Each currentField In currentRow ''读取一行 中的每个字段 ShowText(String.Format("{0,-15}", c urrentField)) ''输出每个字段 Next ShowText(vbCrLf) ''输出内容换行 Catch ex As Exception MessageBox.Show("读取文件错误: " & ex.Message, "提示") End Try Loop End IfEnd Sub提示:Str ing.Format("{0,-15}", currentField):表示对字符串currentField内容输出时进行格式化处 理,宽度为15个字符,负号表示按左对齐。运行程序,先选择文件,然后单击结构化读取按钮,结果如图7-9所示。7.1.5 SaveFi leDialog通过SaveFileDialog类创建保存文件对话框,提示用户输入/选择保存的文件名。例7.6选择保存文件的文件名 。在例7.1中,继续上一节的操作添加获取保存文件名过程,添加:⑴ SaveFileDialog控件,Name为“objSaveFi le”。⑵ 添加过程: Private Function GetDestFilename() As String '' 设置保存文件对话框属性 ''指定初始目录 objSaveFile.InitialDirectory = M y.Computer.FileSystem.SpecialDirectories.MyDocuments ''指定默认文 件名 objSaveFile.FileName = My.Computer.FileSystem.GetName(Fi leName()) ''修改对话框标题 objSaveFile.Title = "保存输出框中的内容" ''如果单击了对话框的确定按钮 If o objSaveFile.ShowDialog() = Windows.Form s.DialogResult.OK Then Return o objSaveFile.FileName ''返回选择的文件名 Else Return Nothing ''返回空对象 End If End Function提示:SaveFileDialog类的常用属性和Op enFileDialog类相同。通过My.Computer.FileSystem.SpecialDirectories对象返回一些 常用的本地主机的目录路径名,主要有:My.Computer.FileSystem.GetName(filename)从路径file name中分析出文件名。类似的操作还有My.Computer.FileSystem.GetParentPath(filename) 从路径filename中分析出上级目录名。7.1.6 保存文件保存文件分为按整体保存和使用StreamWriter流保存两种方式: ⑴ 整体保存文件内容:整体保存文本文件,使用WriteAllText,例如:My.Computer.FileSystem.Writ eAllText(savefilename, Text, AppendYN,Encoding) savefilename为保存的文 件名;Text为保存的文本内容;AppendYN为Boolean类型,True表示在文件savefilename内容的后面追加Te xt,Flase表示使用Text覆盖文件savefilename中的内容;如果savefilename文件为新建文件,或内容为空, 则该选项不起作用。Encoding为文件的编码方式,如果省略,文件的编码方式默认为utf8。整体保存二进制文件,使用WriteAl lBytes,例如:My.Computer.FileSystem. WriteAllBytes (savefilename, Te xt, AppendYN) 参数的具体含义和WriteAllText一样。⑵ 使用StreamWriter流保存文件:创建Stre amWriter流对象:Dim filewriter As System.IO.StreamWriter打开通过StreamWri ter 流对象保存的文件:filewriter = My.Computer.FileSystem.OpenTextFileWrit er(strFileName, AppendYN, Encoding)写入文件内容:filewriter.Write(Text)将 行结束符写入文本流:filewriter.WriteLine()例7.7 把上例中文本输出框中的内容按整体保存文本文件内容。在例7 .1中,选择TabControl控件中文件操作演示选项,继续上一节的操作添加:⑴ Button控件,Name为“btnSaveFi le”,Text为“保存”。⑵ 双击“保存”按钮,在代码编辑器中添加Click事件响应的代码: Private Sub bt nSaveFile_Click(ByVal sender As System.Object, _ B yVal e As System.EventArgs) Handles btnSaveFile.Click If St ring.IsNullOrEmpty(txtOutput.Text) Then ''如果输出框没有任何内容 MessageBox.Show("没有保存的内容!", "提示") Else Dim save filename As String = GetDestFilename() ''得到保存文件的名字 If Not (savefilename Is Nothing) Then ''如果保存文件名非空 My.Computer.FileSystem.WriteAllText(savefilename, txtOutpu t.Text, False, _ System.Text.Encoding.Get Encoding("gb2312")) ''保存输出框文本内容 MessageBox.Show("文 件保存到" & savefilename, "提示") ''提示保存成功信息 End If En d IfEnd Sub运行程序,先选择文件,并读入内容,然后单击保存按钮,弹出如图7-10所示对话框,输入或选择文件名,单击“保存 ”,则完成保存文件的操作。7.1.7 删除文件通过My.Computer.FileSystem.DeleteFile实现对指定文件 的删除操作。例7.8 删除选定的文件。在例7.1中,选择TabControl控件中文件操作演示选项,继续上一节的操作添加:⑴ Bu tton控件,Name为“btnDeleteFile”,Text为“删除”。⑵ 双击“删除”按钮,在代码编辑器中添加Click事件 响应的代码: Private Sub btnDeleteFile_Click(ByVal sender As System.Obj ect, _ ByVal e As System.EventArgs) Handles btnD eleteFile.Click Dim strFileName As String = FileName() '' 读取选择的文件名 If strFileName Is Nothing Then ''如果文件名为空 Exit Sub ''退出过程 Els e ''否则进行删除文件操作 ''弹出对 话框,确认是否一定删除,如果选择“是”,则删除,否则不删除 If MessageBox.Show("确定要删 除文件:" & FileName() & " ?", "提示", _ MessageBoxButtons.YesNo, Mess ageBoxIcon.Asterisk) = _ Windows.Forms.DialogResult.Yes Then Try My.Computer.FileSystem.DeleteFi le(FileName) ''删除文件 Catch ex As Exception ''捕获删 除文件时的异常 MessageBox.Show("删除文件错误: " & ex.Messag e, "提示") End Try txtFilename.Text = "" ''清空文件名文本框内容 MessageBox.Show("已经删除文件:" & str FileName, "提示") ''提示删除成功 End If End IfEnd Sub运行程序,先 选择文件,单击删除按钮,弹出如图7-11所示对话框,如果单击“是”,则删除选择的文件。7.1.8 拷贝文件通过My.Compute r.FileSystem.CopyFile实现把指定文件拷贝到目标目录。语句格式为:My.Computer.FileSystem. CopyFile(strFileName, dstfilename, overwrite)把文件strFileName拷贝到目标d stfilename目录或文件,如果overwrite为True,且目标文件存在,则不覆盖目标文件,否则覆盖目标文件。例7.9 拷 贝选定的文件。在例7.1中,选择TabControl控件中文件操作演示选项,继续上一节的操作添加:⑴ Button控件,Name为 “btnCopyFile”,Text为“拷贝”。⑵ 双击“拷贝”按钮,在代码编辑器中添加Click事件响应的代码: Private Sub btnCopyFile_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles btnCopyFile.Click Dim strFileName As String = FileName() ''读取选择的文件名 If st rFileName Is Nothing Then ''如果文件名为空 Exit Sub ''退出过程 Else ''否则进行拷贝文件操作 Dim dstfilename As String = GetDestFilename() ''得到目标文件的名字 If Not (dstfilename I s Nothing) Then ''如果目标文件名非空 Try ''拷贝文件My.Computer.FileSystem.CopyFile(strFileName, dstf ilename, True) Catch ex As Exception MessageBox.Show("拷贝文件错误: " & ex.Message, "提示") End Try ''提示拷贝成功MessageBox.Show("已经拷贝文件" & strFi leName & " 到" & dstfilename, "提示") End If End IfEnd Sub提示:使用My.Computer.FileSystem.MoveFile实现移动文件,其操作和My.Compu ter.FileSystem.CopyFile 基本相同。移动文件是只将源文件移动到指定的目录,执行移动操作后在原目录源文件将不再 存在;拷贝文件操作是指将源文件的一个备份拷贝到指定的目录,执行拷贝操作后原目录中的源文件还存在。7.1.9 文件信息通过My.Co mputer.FileSystem.GetFileInfo获取指定文件的FileInfo对象,例如:Dim infoFile As System.IO.FileInfo = My.Computer.FileSystem.GetFileInfo(file)通过i nfoFile 对象可以对文件进行各种操作,并获取文件的一些属性。例7.10 显示选定文件的信息。在例7.1中,选择TabCont rol控件中文件操作演示选项,继续上一节的操作添加:⑴ Button控件,Name为“btnFileInfo”,Text为“文件信 息”。⑵ 双击文件信息按钮,在代码编辑器中添加Click事件响应的代码: Private Sub btnFileInfo_Clic k(ByVal sender As System.Object, _ ByVal e As Syst em.EventArgs) Handles btnFileInfo.Click Dim strFileName As S tring = FileName() ''读取选择的文件名 If strFileName Is Nothing The n ''如果文件名为空 Exit Sub ''退出过程 Else ''否则进行显示文件 信息操作 Dim infoFile As System.IO.FileInfo = My.Computer.File System.GetFileInfo(strFileName) ShowText("", True) ''清空输出框内容 ShowText("文件名:" & infoFile.Name() & vbCrLf) ShowText("路径名:" & infoFile.DirectoryName() & vbCrLf) Sh owText("长度:" & infoFile.Length.ToString() & vbCrLf) ShowTe xt("建立日期:" & infoFile.CreationTime.ToString() & vbCrLf) Sh owText("最后一次访问日期:" & infoFile.LastAccessTime.ToString() & vbCrLf) ShowText("最后一次写入日期:" & infoFile.LastWriteTime.ToString() & vbCrLf) End IfEnd Sub运行程序,先选择文件,单击文件信息按钮,显示结果如图7-12所示。7.2 目录操作在 前面介绍的文件操作中,通过My.Computer.FileSystem. GetParentPath(filename)、info File.DirectoryName()等可以获取文件所在目录的信息,下面主要介绍选择目录对话框操作和读取目录中的子目录列表、文件 列表操作。7.2.1 FolderBrowserDialog通过FolderBrowserDialog类创建选择目录对话框,提示用 户选择目录。例7.11 通过FolderBrowserDialog对话框选择目录。在例7.1中,选择TabControl控件中目录 操作演示选项,添加:⑴ Label控件,Text为“目录名:”。⑵ TextBox控件,Name为“txtDirName”。⑶ F olderBrowserDialog控件,Name为“objOpenDir。⑷ Button控件,Name为“btnBrowseD ir”,Text为“浏览”。⑸ 双击“浏览”按钮,在代码编辑器中添加Click事件响应的代码: Private Sub btnBr owseDir_Click(ByVal sender As System.Object, _ ByV al e As System.EventArgs) Handles btnBrowseDir.Click''设置打开目录对话框属性 objOpenDir.Description = "请选择一个目录"''默认的根目录为“我的文档” objOpenDi r.RootFolder = Environment.SpecialFolder.MyDocuments ob jOpenDir.ShowNewFolderButton = False ''不显示“新建目录”按钮 ''如果选择 目录时单击“确定” If objOpenDir.ShowDialog() = Windows.Forms.Dialo gResult.OK Then txtDirName.Text = objOpenDir.SelectedP ath() ''显示选择的目录名 End IfEnd Sub运行程序,选择目录操作演示选项,单击浏览按钮, 弹出如图7-13所示对话框,单击“确定”,选择目录,如图7-14所示。提示:Environment.SpecialFolder可以 指定一些常用的特殊目录,如:objOpenDir.ShowNewFolderButton = True,显示“新建文件夹”按钮,通 过该按钮可以新建文件夹;objOpenDir.ShowNewFolderButton = False则不显“新建文件夹”按钮。ob jOpenDir.SelectedPath()返回选择的目录名。7.2.2 显示子目录获取指定目录strDir中子目录列表的语句为 :My.Computer.FileSystem.GetDirectories(strDir)例7.12 列出指定目录中的子目录信息 。在例7.1中,选择TabControl控件中目录操作演示选项,添加:⑴ Button控件,Name为“btnSubDirList ”,Text为“子目录列表”。⑵ 双击“子目录列表”按钮,在代码编辑器中添加Click事件响应的代码: Private Sub b tnSubDirList_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles btnSubDirList.Click Dim strDir As String = txtDirName.Text ''读取选择的目录名 If Str ing.IsNullOrEmpty(strDir) Then MessageBox.Show("请先选择一个 目录名!", "提示") Else ShowText("", True) ''清空 输出框内容 Try For Each strD As String In My .Computer.FileSystem.GetDirectories(strDir) Sh owText(strD & vbCrLf) ''显示子目录列表 Next Ca tch ex As Exception MessageBox.Show("读取子目录列表错误: " & ex.Message, "提示") End Try End If End Sub运行 程序,选择目录操作演示选项,选择目录,单击子目录列表按钮,结果如图7-15所示。7.2.3 显示目录中文件列表获取指定目录strD ir中文件录列表的语句为:My.Computer.FileSystem. GetFiles (strDir)例7.13 列出指定目 录中的文件录信息。在例7.1中,选择TabControl控件中目录操作演示选项,添加:⑴ Button控件,Name为“btnFi lesList”,Text为“文件列表”。⑵ 双击“文件列表”按钮,在代码编辑器中添加Click事件响应的代码: Private Sub btnFilesList_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles btnFilesList.Click Dim strDir As String = txtDirName.Text ''读取选择的目录名 If S tring.IsNullOrEmpty(strDir) Then MessageBox.Show("请先选择 一个目录名!", "提示") Else ShowText("", True) '' 清空输出框内容 Try For Each strFile As String In My.Computer.FileSystem.GetFiles(strDir) Sho wText(strFile & vbCrLf) Next Catch ex A s Exception MessageBox.Show("读取文件列表错误: " & ex.Mess age, "提示") End TryEnd IfEnd Sub运行程序,选择目录操作演示选项,选择目录,单击 子目录列表按钮,结果如图7-16所示。7.3 键盘操作My.Computer.Keyboard和My.Computer.Mouse 对象提供了对系统键盘和鼠标的访问功能,如获取键盘的当前状态、发送按键、检测系统鼠标的设置信息等。7.3.1 检测按键状态通过My. Computer.Keyboard对象下例属性可以获取键盘的当前状态: 例7.14 显示键盘的当前状态。在例7.1中,选择TabC ontrol控件中键盘操作演示选项,添加:⑴ Button控件,Name为“btnKeyStatus”,Text为“按键状态”。⑵ 双击“按键状态”按钮,在代码编辑器中添加Click事件响应的代码: Private Sub btnKeyStatus_Click (ByVal sender As System.Object, _ ByVal e As System .EventArgs) Handles btnKeyStatus.Click Dim strOut As Strin g strOut = CStr(IIf(My.Computer.Keyboard.CapsLock(), "Caps Lock 已打开", "CapsLock 没有打开")) & vbCrLf strOut &= CStr(IIf( My.Computer.Keyboard.CtrlKeyDown(), "Ctrl键按下", "Ctrl键没有按下")) & vb CrLf strOut &= CStr(IIf(My.Computer.Keyboard.ShiftKeyDown( ), "Shift键按下", "Shift键没有按下")) & vbCrLf ShowText(strOut, True)E nd Sub运行程序,选择键盘操作演示选项,如果按住Shift和Ctrl键,单击按键状态按钮,则输出结果如图7-17所示。7.3. 2 发送按键通过My.Computer.Keyboard对象的SendKeys方法向活动窗口发送一个或多个击键,如同在键盘上输入一 样。其语句格式为:My.Computer.Keyboard.SendKeys(keys,wait)Keys是要发送的击键内容,wa it是 Boolean类型,用于指定是否等待击键处理完毕,然后再继续运行应用程序,默认为 True。 如果要发送组合Ctrl 键,需要在按键前加“^”;发送组合Alt键,需要在按键前加“%”;发送组合Shift键,需要在按键前加“+”。其它一些特殊按键及其 代码如表7-2所示。例7.15 通过My.Computer.Keyboard对象的SendKeys控制Notepad.exe的启动 、关闭和内容输入。在例7.1中,选择TabControl控件中键盘操作演示选项,主要操作是,先打开Notepad.exe程序,发送 一些文本内容到Notepad中,然后选择发送的内容,并通过Ctrl+C拷贝内容到系统剪切板,关闭Notepad程序,最后在输出框输 出剪切板中的内容。为此,需要添加:⑴ Button控件,Name为“btnSendKeys”,Text为“发送按键”。⑵ 双击“发 送按键”按钮,在代码编辑器中添加Click事件响应的代码: Private Sub btnSendKeys_Click(ByVal sender As System.Object, _ ByVal e As System.Even tArgs) Handles btnSendKeys.Click Dim ProcID As Integer ''启动notepad 并返回进程号 ProcID = Shell("notepad.exe", AppWi nStyle.NormalFocus) ''激活该进程 AppActivate(ProcID) ''向启动的notepad 发送按键 Dim strInput As String = "欢迎使用《Visual Basic 2005 程序设计》!" & vbCrLf For Each str As String In str Input My.Computer.Keyboard.SendKeys(str) Next M y.Computer.Keyboard.SendKeys("^a") ''发送键Ctrl+C 拷贝选择的内容到系统剪贴 板 My.Computer.Keyboard.SendKeys("^c") ''发送键Alt+F4 关闭 notepad My.Computer.Keyboard.SendKeys("%{f4}") ''发送 键n ,不保存输入的内容 My.Computer.Keyboard.SendKeys("%n") ''读 取剪贴板中的内容,通过输出文本框输出 ShowText(My.Computer.Clipboard.GetText( ), True)End Sub运行程序,选择键盘操作演示选项,单击“发送按键”按钮,则看到Notepad程序启动,同时自动输入一些 按键内容,最后Notepad程序退出,演示程序输出结果如图7-18所示,其中输出文本框中的内容是从Notepad拷贝到剪切板中,再 粘贴到输出文本框。提示:Shell("notepad.exe", AppWinStyle.NormalFocus):表示运行一个可 执行程序notepad.exe,由于该程序仍然在运行,则返回一个包含该程序的进程 ID 的整数。AppWinStyle.Norma lFocus表示notepad.exe程序窗口具有焦点,且窗口大小和位置为默认值。AppActivate(ProcID):激活进程 号为ProcID的已经运行的应用程序。My.Computer.Clipboard.GetText():读取剪切板中的文本内容。7. 4 网络操作使用Visual Basic开发具有网络功能的应用程序时,一般需要使用WinSock控件,但这个控件使用比较复杂。为此 ,Visual Basic 2005通过My.Computer.Network对象封装了一些常用的网络操作属性和方法:⑴ 检测本地 主机网络的可用情况:基本格式:My.Computer.Network.IsAvailable(),返回True表示本地主机网络可用 ,False表示不可用。⑵ 确定远程主机是否可用:基本格式:Ping(RemoteHostName或IPAddress,timeo ut),返回True表示远程主机可用,False表示不可用。其中远程主机使用域名地址(如www.snnu.edu.cn)或IP地址 (如202.117.144.2)标识,timeout连接目标的时间阈值(单位为毫秒),默认值为 500。注意:远程主机的防火墙如果 过滤ICMP协议,则有可能不能正确探测远程主机的可用情况。⑶ 从网站下载文件:基本格式:DownloadFile(address ,destinationFileName),远程文件address为URL格式,destinationFileName为保存到本地 主机的目录及文件名。⑷ 上传文件到远程网站:基本格式:UploadFile(sourceFileName,address),把本地 主机中的文件sourceFileName上传到远程网站address。例7.16 实时监控指定的远程主机是否可用。下面演示实时确定 远程主机是否可用的操作。分析:为了实时确定远程主机是否可用,需要每隔一定的时间,使用Ping探测远程主机是否可用,为此,需要使用T imer控件,Timer控件能够每隔指定的时间触发事件。在例7.1中,选择TabControl控件中网络操作演示选项,添加:⑴ L abel控件,Text为“输入目标地址:”。⑵ TextBox控件,Name为“txtDestAddress”。⑶ Timer控件 ,Name为“TimerPing”,Interval为“10000”。⑷ 双击“TimerPing”,在代码编辑器中添加Timer 控件Tick事件响应代码: Private Sub TimerPing_Tick(ByVal sender As System.O bject, _ ByVal e As System.EventArgs) Handles TimerPin g.Tick ''判断输入的目的地址是否为空 If String.IsNullOrEmpty(txtD estAddress.Text) Then ShowText("请输入目标地址!", True) En d If Dim strDest As String = txtDestAddress.Text ''读取目标地址 Dim strTime As String = My.Computer.Cloc k.LocalTime.ToString() ''获取当前时间 Try If My.Comput er.Network.Ping(strDest, 1000) Then ShowText(strTi me & " : " & strDest & " 处于活动状态!") Else ShowText(strTime & " : " & strDest & " 处于非活动状态!") End If Catch ex As Exception ShowText(strTime & " : " & strDest & " 目标不可达,或网络错误!") End Try ShowText(vbCrL f) ''输出内容换行End Sub提示:Timer控件每隔一定的时间(Interval属性的值,如本例中是10000毫秒,即 10秒钟)触发Tick事件,因此Tick事件的响应代码即为Timer每隔一定时间执行的操作。My.Computer.Clock 对 象提供了用于查找本地主机时间和 UTC 时间的属性:⑸ Button控件,Name为“btnPingRemote”,Text为“开 始检测”。⑹ 双击“开始检测”按钮,在代码编辑器中添加Click事件响应的代码: Private Sub btnPingRe mote_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles btnPingRemote.Click If Time rPing.Enabled = False Then ''如果计时器没有启动 TimerPing.St art() ''启动计时器 btnPingRemote.Text = "停止检 测" ''修改按钮的Text Else TimerPing.Stop() ''停止计时器 btnPingRemote.Text = "启动检测" ''修改按钮的Te xt End IfEnd Sub注意:通过单击btnPingRemote 按钮,可以启动或停止计时器。⑺ 当计时器启 动后,如果没有停止,则一直处于启动状态,为了不影响其它选项的操作,在本例中,当切换到其它选项时,停止计时器。为此,需要在myPag es_SelectedIndexChanged过程中添加如下代码: If TimerPing.Enabled = T rue Then ''如果计时器运行,则停止计时器 TimerPing.Stop() btnPingRemote.Text = "开始测试" End If运行程序,选择网络操作演示选项,输入camonet.or g,单击启动检测按钮,输出结果如图7-19所示。7.5 应用程序启动、退出事件通过My.Application对象的属性、方法和事 件,可以访问当前应用程序的版本信息和公司信息、语言设置、路径及日志等信息,同时还可处理应用程序启动、退出时触发的事件。在Visua l Basic 2005中,My.Application对象提供了Startup和Shutdown事件,程序设计人员通过添加这两个 事件的响应代码,可以完成应用程序启动、或退出时的一些操作。下面通过示例程序说明如何处理Startup和Shutdown事件。例7. 17演示响应Startup和Shutdown事件。具体操作过程:⑴ 新建项目,选择“Windows应用程序”,项目名称为“MyAp plication命名空间演示”。⑵ 在解决资源管理器中把“Form1.vb”文件名改为“MyApplication命名空间演示. vb”。⑶ 打开窗体设计视图,选择窗体,在属性框中修改窗体的属性:Name为“frmMyApplicationDemo”;Star tPosition为“CenterScreen”;Text为“My.Application命名空间演示”。⑷ 为窗体添加Butto n控件,Name为“btnExit”,Text为“退出”,添加Click事件的响应代码。 Private Sub btnExi t_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles btnExit.Click Close() End Sub⑸ 在解决方案资源管理器中选择项目名称,单击右键,在弹出菜单中选择属性,打开项目的属性对话框,选择“应用程序”项,单 击“查看应用程序事件”按钮,则在代码编辑器中打开ApplicationEvents.vb文件。在“常规”下拉框中选择“MyAppl ication个事件”,则在“声明”下拉框中列出My.Application的所有事件,选择“Startup”,生成Startup 事件响应的框架代码,如图7-20所示。添加Startup事件响应代码,在弹出对话框中,如果单击“是”,则程序继续执行,如果单击“否 ”,则程序的启动窗体停止初始化,应用程序结束执行: Private Sub MyApplication_Startup(B yVal sender As Object, _ ByVal e As Microsoft.V isualBasic.ApplicationServices.StartupEventArgs) _ Handles Me.Sta rtup Dim strPassword = "123" ''设定默认密码 Dim blnOK As Boolean = False For iCount As Integer = 1 To 3 ''输入密码 最多尝试3次 ''如果输入密码正确,退出尝试循环控制 If (Inpu tBox("请输入密码,然后按确定按钮", "密码验证") = strPassword) Then blnOK = True Exit For Else ''如果输入密码不正确,显示提示信息 MessageBox.Show("输入密码错误,请重 新输入", "提示信息,尝试次数:" & _ iCount,MessageBoxButtons.OK, MessageBoxIc on.Exclamation) End If Next If Not blnOK Then ''如果输入密码错误,退出应用程序初始化过程,否则继续 Mes sageBox.Show("输入密码错误,退出程序", "退出程序", _ MessageBoxButtons.OK, MessageBoxIcon.Exclamation) e.Cancel = True ''启动窗体停止初始化,退出应用程序 End IfEnd Su b提示:e为StartupEventArgs 对象,其属性Cancel为True时,启动窗体停止初始化,从而应用程序结束执行。⑹ 在“声明”下拉框中选择“Shutdown”,生成Shutdown事件响应的框架代码,添加事件响应代码: Privat e Sub MyApplication_Shutdown(ByVal sender As Object, _ ByVal e As System.EventArgs) Handles Me.Shutdown MessageBox.Show("退出应用程序,再见!", "退出") End Sub运行程序,则弹出对话框,如图7-21(a )所示,提示输入密码,如果输入密码错误,弹出如图7-21(b)所示的信息;如果输入密码正确,则启动应用程序,出现应用程序主窗体,如 图7-21(c);如果尝试输入3次密码都不正确,则退出应用程序,不会出现主窗体;如果应用程序正常启动,单击 “退出”,则弹出如图7 -21(d)所示的对话框,单击“确定”退出程序执行。7.6 窗体实例间互相访问在程序设计中,经常需要创建多个窗体,如何实现多个窗体 实例间互相访问,并确保数据的一致性,是程序设计人员必须解决的问题。在Visual Basic 2005中,My.Forms对象提供 了访问当前程序中定义的所有窗体实例的快捷方式,当在一个窗体中访问另一个窗体时,无需创建窗体实例,直接通过My.Forms对象中的窗 口类名直接访问窗口实例,这种方式又称为对象默认实例,默认实例是由运行库提供的类的实例。由于程序中的所有窗体都可以通过My.Form s对象中的窗口类名(默认实例)访问,因此程序设计人员不需要再考虑被访问窗体是否实例化的问题,而且可以保证被访问窗体的唯一性,可以很 好地确保数据的一致性。下面通过示例程序说明如何通过My.Forms实现窗体实例间互相访问。例7.18 演示通过My.Forms实现 窗体实例间互相访问。具体操作过程:⑴ 新建项目,选择“Windows应用程序”,项目名称为“MyForms命名空间演示”。⑵ 在解决方案资源管理器中把“Form1.vb”文件名改为“MyForms命名空间演示.vb”。⑶ 打开窗体设计视图,选择窗体,在属性框中修改窗体的属性:Name为“frmMyFormsDemo”;StartPosition为“CenterScreen”;Text为“My.Forms命名空间演示”。⑷ 为窗体添加Button控件,Name为“btnInput”,Text为“输入”。⑸为窗体添加TextBox控件,Name为“txtOutput”,Multiline为True,ScrollBars为Vertical。⑹ 在解决方案资源管理器中选择项目名称,单击右键,在弹出菜单中选择“添加”,在下级菜单中选择“Windows窗体”,弹出添加新项对话框,在名称后的文本框中输入InputForm.vb,单击“添加”按钮,打开InputForm窗体设计对话框。修改InputForm窗体的属性:Name为“frmInputForm”,Text为“输入内容”,StartPosition为“CenterParent”。⑺ 在InputForm窗体中添加TextBox控件,Name为“txtInput”。⑻ 在InputForm窗体中添加两个Button控件,Name分别为“btnOK”和“btnCancel”,Text分别为“确定”、“取消”。btnOK按钮的DialogResult为“OK”,btnCancel按钮的DialogResult为“Cancel”。提示:把btnOK按钮的DialogResult设置为“OK”,btnCancel按钮的DialogResult设置为“Cancel”,这样当用户单击InputForm窗体的btnOK按钮时,InputForm窗体退出并返回系统定义的枚举类型值Windows.Forms.DialogResult.OK,当用户单击InputForm窗体的btnCancel按钮时,InputForm窗体退出并返回系统定义的枚举类型值Windows.Forms.DialogResult.Cancel。⑼ 打开InputForm窗体设计对话框。在属性窗口中,选择属性Acceptbutton,在下拉列表中选择btnOK;选择属性Cancelbutton,在下拉列表中选择btnCancel。提示:Acceptbutton为窗体的“接受”属性,如果设置为btnOK,表示当用户每次按回车键时,相当于单击了btnOK按钮。同理,Cancelbutton为窗体的“取消”属性,如果设置为btnCancel,表示当用户每次按“Esc”键时,相当于单击了btnCancel按钮。⑽ 双击frmMyFormsDemo窗体的“输入”按钮,添加对其Click事件的响应代码: Private Sub btnInput_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles btnInput.Click ''如果输入窗体是按“确定”按钮返回,则把输入窗体中输入文本框中的内容显示到主窗体的输''出窗口中 If My.Forms.frmInputForm.ShowDialog() = Windows.Forms.DialogResult.OK Then If String.IsNullOrEmpty(txtOutput.Text) Then txtOutput.Text = My.Forms.frmInputForm.txtInput.Text & vbCrLf Else txtOutput.Text &= My.Forms.frmInputForm.txtInput.Text & vbCrLf End If My.Forms.frmInputForm.txtInput.Text = "" ''清除输入窗体输入文本框的内容 End If End Sub提示:My.Forms.frmInputForm.ShowDialog():将窗体My.Forms.frmInputForm显示为模式对话框,并将当前活动窗口frmMyFormsDemo设置为其所有者。运行程序,主窗体如图7-22(a)所示,单击“输入”按钮,弹出输入内容窗体,如图7-22(b)所示,在文本框中输入内容,按回车键,则输入内容窗体关闭,主窗体的输出框显示输入内容窗体中文本框输入的内容,如图7-22(c)所示。 |
|