发信人: chenjz(不再哭傲江湖)
整理人: cobe(2001-01-19 09:20:28), 站内信件
|
走近编程通过实例学VB(三)
在上面一章中向大家介绍了建立程序的菜单以及实现实现文本编辑器的两个基本的功能:打开文件和新建文件,在这一章内,将实现文件菜单中的其它项,包括保存、另存为、打印。
首先要来考虑的是保存和另存的问题,在上一章内我们已经为每一个编辑窗体添加了一个OpenFile属性来保存编辑窗口所打开文件的文件名,对于保存,如果OpenFile属性为空,则要打开保存对话框让用户输入保存文件名,然后使用该文件名作为编辑窗体的OpenFile属性并执行保存操作。对于另存为,无论编辑窗体的OpenFile属性是否为空,都要打开保存对话框让用户输入保存文件名,然后使用该文件名作为编辑窗体的OpenFile属性并执行保存操作。基于这种思路,我们需要在Form1中添加两个子过程分别实现编辑窗体的保存和保存为功能。
首先打开Form1的代码窗口,然后在“通用”区域添加如下代码:
Sub SaveFile()
If Me.OpenFile<>"" Then
Me.RichTextBox1.SaveFile Me.OpenFile,rtfText
Else
With MDIForm1.CommonDialog1
.Filter="所有文件(*.*)|*.*"
设置标志为当文件已经存在时提示是否覆盖
.Flags=cdlOFNOverwritePrompt
.ShowSave
If .FileName<>"" Then 用户输入了正确的文件名并按确定键
Me.RichTextBox1.SaveFile .FileName,rtfText
Me.OpenFile=.FileName
Me.Caption=.FileName
End If
End With
End If
End Sub
Sub SaveFileAs()
With MDIForm1.CommonDialog1
.FileName=Me.OpenFile
.Flags=cdlOFNOverwritePrompt
.Filter="所有文件(*.*)|*.*"
.ShowSave
If .FileName<>"" Then
Me.RichTextBox1.SaveFile .FileName,rtfText
Me.OpenFile=.FileName
Me.Caption=.FileName
End If
End With
End Sub
然后再打开MDIForm1的代码窗口,在菜单项mFileSave的Click事件中加入以下代码: Me.ActiveForm.SaveFile
在菜单项mFileSaveAs的Click事件中添加如下代码:
Me.ActiveForm.SaveFileAs
运行程序,尝试打开或者新建两个编辑窗口,然后再点击菜单中的保存或者另存项,看一下程序的运行效果。效果如图1所示。
通过分析上面的两个子过程可以看到Form1中的保存和另存子过程都使用了MDIForm1中的通用对话框控件的ShowSave方法显示保存文件对话框。在使用ShowSave方法之前,首先要设置控件的Flags属性为cdlOFNOverwritePrompt,做这个设置是为了使在保存时如果文件已经存在发出提示。通用对话框控件的Flags属性的作用是设置对话框的一些属性,这个属性的选项很多,大家可以参考VB的帮助。
接下来需要实现的是文档的打印问题,在本程序中我们将通过通用对话框控件首先显示打印对话框让用户选择打印的份数,打印的页码数。然后当用户选择打印时再将RTF控件中的文本输出到打印机。
下面首先来看程序,打开MDIForm1窗体,点击窗体菜单中的“文件|打印”项,然后在代码窗口的mFilePrint的Click事件中添加如下代码:
On Error GoTo lPrintErr
With CommonDialog1
.CancelError=True
.Flags=cdlPDReturnDC+cdlPDNoPageNums
If Me.ActiveForm.RichTextBox1.SelLength=0 Then
.Flags=.Flags+cdlPDAllPages
Else
.Flags=.Flags+cdlPDSelection
End If
.ShowPrinter
End With
将活动编辑窗口的内容发送到打印机
Me.ActiveForm.RichTextBox1.SelPrint CommonDialog1.hDC
Exit Sub
如果用户在打印对话框中选择了Cancel就会引发错误,而错误在这里处理
lPrintErr:
If Err.Number = 32755 Then
Exit Sub
End If
运行程序,点击菜单中的“文件|打印”项,程序将会弹出打印对话框,如图2所示。点击“打印”按钮将启动打印机打印当前编辑窗口中的文档。
现在再分析以下上面的程序段。由于在缺省设置下,无论用户在打印对话框中选择“打印”还是“取消”按钮,程序都无法感知。不过在通用对话框中有一个CancelError属性,如果将其设置为True,那么当用户选择 “取消”按钮后会引发一个错误,错误号码为32755(无论是在打开文件、保存还是打印对话框中都如此)。那么就需要自己在程序中添加错误处理代码来处理错误。所以在程序的第一句就是On Error GoTo lPrintErr ,各语句的意思是:如果发生错误,则将跳转到标记lPrintErr处,而错误处理处理语句在程序段的最后,首先访问Err对象的Number属性,如果值为32755,则错误是由用户选择了“取消”按钮引发的。那么调用Exit Sub语句退出程序段。Err对象是VB中的错误处理对象,当每一次发生VB错误时,通过访问该对象就可以获得错误号以及错误描述。在这里将不做介绍。读者可以参考VB帮助文件参考详细说明。
在上面的程序中将控件Cancel设置为True捕捉用户点击取消按钮,然后设置控件的Flags属性来定义打印机对话框的显示属性,其中的cdlPDAllPages等常量在VB帮助中有说明,大家可以参考帮助文件。接下来调用通用对话框控件的ShowPrinter方法显示打印对话框,如果用户在对话框中选择点击“取消”按钮,就会引起错误,程序就会转移到错误处理段退出子程序。如果选择“确定”按钮则执行当前编辑窗口的RTF控件的SelPrint方法将被高亮选中的文档输出到一个打印设备句柄进行打印。如果没有内容被选中,则将文档的全部发送到打印设备句柄。对于象打印机、屏幕这样的输出设备,Windows为这些设备提供了一个句柄。这样程序可以直接通过句柄访问这些设备、输出文本或图像,而程序员只需要关心输出大小、效果等东西,而不用理会设备型号、版本的东西。在上面的程序中,CommonDialog1控件中的hDC属性就包含了用户在打印对话框中选择的打印设备的句柄。另外象PictureBox控件、窗口等也具有hDC属性,可以通过Windows API函数来进行更复杂的操作,在以后如果有机会我会向大家详细的介绍关于Windows图形输出方面的论题。
技巧与提示:保持源程序的整洁和可读性
好的VB源程序不仅实现某种功能就可以了,还需要保持源程序的整洁而不是乱七八糟的一行一行的,下面是两个技巧:
1.使用缩进
一般来说,每一个子程序段中的语句都需要缩进一个单位(按Tab键,一般一个单位缩进4个字符位置)。而象If...End If、For...Next这样的段落中的语句也需要缩进一个单位,象上面的语句格式就是这样设置的;
2、使用 _符号连接长语句
有时候,一个语句会十分长,大家知道Basic不可以象C那样简单的回车将语句分成几行。不过我们可以使用 _符号将一个长语句分为若干行。
本章功课:掌握Err对象并了解On Error Goto、Resume Next等错误处理语句。在以后的程序中我们还将涉及错误处理方面的内容。
(未完待续) (长沙 陈锐)
---- 我能翻译善写作熟电脑会说话可是为什么没工作?
|
|