配色: 字号:
《Visual Basic 2005 程序设计》第7章 My命名空间
2023-05-25 | 阅:  转:  |  分享 
  
第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)所示。
献花(0)
+1
(本文系大高老师原创)