发信人: chenjz(不再哭傲江湖)
整理人: cobe(2001-01-19 09:20:28), 站内信件
|
直进编程通过实例学VB(二)
在上一章里我们建立了基本的编辑界面,包含一个Form窗体和一个MDI窗体。在这一章里,我们要进一步完善程序。包括添加菜单和实现文件打开、新建以及退出操作。
首先打开在上一章中保存的工程文件。双击工程列表栏中的MDIForm1项打开MDI窗体。然后再点击菜单中的 “Tools|Menu Editor…”项打开菜单编辑窗口。窗口如图1所示。
首先在Caption栏中输入“文件[&F]” ,然后在Name栏中输入“mFile”。点击“Next”按钮将菜单条目转移到下一行,点击中间4个箭头按钮中指向右方的按钮,这时在菜单栏中就会出现4个小点。这说明该菜单项为上一个菜单项的子菜单。在Caption栏中输入“新建[&N]”,在Name栏中输入“mFileNew”。再点击ShoutCut下拉框,选择“Ctrl+N”项。最后点击OK键退出菜单编辑窗口。回到MDIForm1窗体,可以看到菜单加入到窗体上的效果。
在菜单编辑窗口中,Caption为菜单的标题,为了可以通过键盘访问菜单,我们可以通过在菜单标题的某一个字母前加&符号的方式来实现。在上面,我们分别在文件菜单项中输入&F,在新建菜单项中输入&N,则在运行时字母F、N下会出现下划线。按Alt+F就打开文件菜单。Name项为菜单的名称,Index为该菜单项在同名菜单组中的索引。ShoutCut项定义该菜单项的快捷键。Checked复选框指定菜单是否被选中,如果选择该复选框,则窗口上该菜单标题前会打上一个勾。Enabled复选框指定菜单项是否可用,如果清除该复选框,则菜单项被灰度显示并不可用。Visible项指定菜单项是否显示在窗体中。WindowList项是设定显示MDI子窗口的选项,将会在下面介绍。VB支持的菜单项最多可以有6级。
在这个软件中,我们将只实现基本的文本编辑功能,建立、打开、保存文件,拷贝、复制、粘贴等,所以在菜单中只有基本的几项:文件菜单、编辑菜单、窗口菜单和察看菜单。
整个菜单完整结构见表:
在上面菜单列表中的菜单级别项中没有写出来的级别与上一个相同。另外在菜单项中为了建立分割菜单条。我们在菜单中加入了若干个标题为“-”的菜单项,该菜单项在窗口菜单中将显示为一个横向的分割条。
由于我们使用了MDI窗口方式来建立程序,我们希望在菜单中可以列出当前的MDI子窗口,这只要设定菜单的WindowList属性就可以实现这样的功能。菜单的WindowList属性确定菜单的子菜单中是否包含一个打开的 MDI子窗体列表。打开菜单编辑器,将mWindow项的WindowList复选框选中。然后运行程序,可以看到窗口菜单中增加了一个Form1项,程序运行的效果如图2所示。
基本的程序界面的设计已经完成,接下来将涉及到程序到功能实现的方面了。首先要实现的是打开、新建文件功能。在实现这个功能中,我们要考虑的有三个问题,一个是如何调用打开文件对话框来打开文件,另一个是由于我们要实现能够同时打开多个文档窗口来编辑文件,那么在打开或新建一个文件后如何建立一个新的编辑窗口,最后一个是在保存文件时如何知道每一个编辑窗体所打开的文件的文件名。对于第一个功能,只要利用通用对话框控件就可以实现。通用对话框控件是一个可以显示打开、保存文件、打印设置等标准Windows对话框的控件。而对于第二个功能,由于Form1在工程中实际上可以看做窗体变量,所以在程序中可以象定义一个其他变量那样定义一个新的Form1类窗体变量。对于第三个功能的实现,我们可以考虑,如果Form1中有一个专门的标识窗体打开的文件名的属性就好了,而实际上在VB中可以很方便的添加一个属性到窗体中,添加一个属性要利用两个语句:Property Get和Property Let。其中Property Get语句获取一个属性的值,而Property Let语句设置一个属性的值。下面通过代码来说明:
打开Form1的代码编辑窗口,在窗口的“通用”区域中添加以下代码:
Dim strFile As String
Property Get OpenFile() As String
OpenFile=strFile
End Property
Property Let OpenFile(sFile As String)
strFile=sFile
End Property
在上面的程序中,程序为Form1添加了一个OpenFile属性,当外界读取OpenFile属性时(例如Set strA=Form1.OpenFile),Property Get OpenFile()语句就会被调用,在上面的代码中,我们将语句Property Get OpenFile()返回值设定为变量strFile的值,那么外界获得的OpenFile属性值就是strFile。当外界设置OpenFile属性时(例如 Form1.OpenFile="C:\a.txt"),Property Let OpenFile(sFile As String),其中sFile变量保存的就是赋予OpenFile属性的值,在上面的程序中,将外界赋予OpenFile属性的值保存在strFile中。有这些可以看到,实际上编辑窗体打开文件的名称是保存在Form1的变量strFile中,通过建立一个OpenFile属性使得外界代码(例如MDIForm1中的代码)可以通过OpenFile属性访问strFile。
使用VB的通用对话框控件。点击VB菜单的“Project|Components”项,在Components列表中选择Microsoft Common Dialog Control 6.0项。将通用对话框控件添加到控件栏中,如图3所示。打开MDIForm1,双击控件栏上的通用对话框按钮将通用对话框控件添加到MDIForm1上。
再点击菜单区域的“文件|打开”项进入MDIForm1的代码编辑窗口中添加打开文件的代码。将以下代码添加到菜单mFileOpen的Click事件中:
Dim strOpen As String
With CommonDialog1
.Filter="文本文件(*.txt)|*.txt|所有文件(*.*)|*.*"
.DialogTitle="打开文件"
.ShowOpen
If .FileName="" Then Exit Sub
strOpen=.FileName
If Dir$(strOpen)<>"" Then
For Each frmA In Forms
If frmA.Name="Form1" Then
If frmA.OpenFile=strOpen Then
frmA.SetFocus
Exit Sub
End If
End If
Next
Dim frmNew As New Form1
frmNew.Visible=True
frmNew.Show
frmNew.OpenFile=strOpen
frmNew.RichTextBox1.LoadFile strOpen,1
frmNew.Caption=strOpen 设置新窗体标题为文件名
Else
MsgBox "文件不存在!",vbOKOnly,"打开文件"
End If
End With
在上面的程序中,我们需要利用该控件显示打开文件对话框并返回用户选择的文件。首先设定的是控件的Filter属性,该属性决定打开文件对话框的过滤器(即通过设定通配符设定只显示什么类型的文件),该属性设定的语法如下:
object.Filter [=description1|filter1|description2|filter2…]
部分 描述
object 通用对话框控件。
description 描述文件类型的字符串。
filter 是指定文件名扩展的字
符串表达式。
在程序中,设定了两个过滤器,一个显示文本文件,一个显示所有文件。可以在程序运行时通过文件类型下拉框选择。
DialogTitle属性设定对话框的标题。
ShowOpen方法调用打开文件对话框。另外控件还有ShowSave方法调用保存文件对话框,需要保存的文件名事先要在FileName属性中设定。ShowColor显示颜色选择对话框,选择的颜色值保存在Color属性中。ShowFont显示字体选择对话框,字体样式由FontName、FontBold、FontItalic、FontStrikethru、FontUnderline 属性决定,选择的字体也保存在上面的属性中。ShowPrinter方法显示打印对话框,下面的程序会详细介绍ShowPrinter方法。
当调用ShowOpen方法显示打开文件对话框后,用户选择的文件的全路径名就会保存在控件的FileName属性中,接下来再调用Dir$函数来确定文件是否存在。如果strOpen指定的文件存在的话,Dir$就会返回文件名,否则返回空字符串。Dir$也支持通配符查找,在第一次调用后,下一次只要不带参数的调用Dir
$就可以返回符合条件的下一个文件,例如下面的代码:
Dim strA$
Debug.Print Dir$("c:\*.txt")
Do
strA=Dir$
Debug.Print strA
DoEvents
Loop Until strA=""
就可以获得c:\目录下的所有后缀为txt的文件名。
在利用Dir$确认文件的存在后,首先通过For Each方法便历工程中的所有窗体(包括MDI窗体以及MDI子窗体),如果该窗体是Form1类窗体,则通过访问窗体的OpenFile属性来看用户选择的文件是否已经被某一个编辑窗体打开了,如果是,则将该窗体放置到最前面并退出打开文件过程。如果文件没有被打开过,再调用 Dim...As New 建立一个新的Form1类窗体,然后将用户选择的文件名赋予窗体的OpenFile属性。并调用RichTextBox1的LoadFile方法打开文件。LoadFile方法的第一个参数指定的是要打开的文件名,第二个参数指定文件打开方式,如果为0,则文件必须是一个合法的RTF文件,如果为1,文件将以文本方式被打开。如果文件名错误,程序将调用MsgBox函数来显示消息提示框。MsgBox函数的参数选择很多,但是并不复杂,在这里将作为复习的一部分。
保存文件功能建立成功了,那么建立新文件的方法就简单多了,将以下的代码加入到MDIForm1代码窗口中mFileNew的Click事件中就可以了:
Dim frmNew As New Form1
frmNew.Visible=True
frmNew.Show
frmNew.OpenFile=""
运行程序,点击程序菜单中的“文件|打开”项或者直接按快捷键Ctrl+O打开文件对话框,在其中选择一个文件,可以看到程序新建了一个编辑窗口并在该窗口中显示打开的文件,如图4所示。点击程序的窗口菜单,可以看到所有的MDI子窗口都在菜单中列了出来,图5所示就是前面设置mWindow菜单项的WindowList的效果。
实现退出操作的方法如下:点击MDIForm1菜单的“文件|退出”。在mFileExit的Click事件中填写下面一句代码:
Unload MDIForm1
然后在MDIForm1的UnLoad事件中添加下面一句代码:
End
为什么不直接在mFileExit中使用End退出呢?由于在后面我们需要在Form1的Unload事件中判断编辑文档的内容是否改变,而End语句强制退出而不会引发任何Unload事件,所以首先要使用Unload函数卸载MDIForm1。Unload语句是用于卸载窗体以及控件的语句。
本章功课:熟悉菜单(包括分级菜单)的建立,建立菜单的快捷方式,熟悉菜单的属性。根据上面的程序介绍以及VB帮助熟悉通用对话框控件,掌握MsgBox函数的使用。(未完待续)(长沙 陈锐)
---- 我能翻译善写作熟电脑会说话可是为什么没工作?
|
|