二级VB辅导:VB中自动提示保存修改后的文件
来源:优易学  2011-12-10 19:59:48   【优易学:中国教育考试门户网】   资料下载   IT书店

  RichTextBox控件支持文本文件和RTF格式文件,在VB中经常用来显示文件内容。当用来编辑文件时,我们希望程序对文件的修改做出反应,提醒用户是否保存这些修改。
  1 任务与要求
  如图1所示,一个窗体内有一个文件列表(File1)和一个文本显示控件(RichTextBox1)。当单击文件列表(File1)内的文件时,其内容显示在下方的文本显示控件(RichTextBox1)内。如果用户对文本内容进行了改动,则在转向其它文件时(单击文件列表内的其它文件或单击右上角的“关闭”按钮),要求程序给出提示,询问用户是否保存更改,如图2所示。如果用户回答“是”,由保存更改,否则保持原文件不变。

  
  图 1 文件显示
  
  图 2 保存文件提示

  另外,要求在用户做出选择并完成操作后,文本显示控件(RichTextBox1)内显示的内容应为用户刚才想要看的新内容。也就是说,保存文件的过程不影响最近命令的执行,这样比较符合人们的操作习惯。
  要想实现上述功能,就是要解决以下问题。
  (1)如何判断文件是否改动过?
  (2)如何同时实现新文件的显示与旧文件的保存?
  (3)如何判断修改的开始与结束?
  2 过程分析
  2.1 文件被改动的充分条件
  文件被改动时,典型的特征是引起该控件(RichTextBox1)的Change事件发生;但是,这一特征不具有唯一性。当单击File1中的其它文件时,RichTextBox1会显示相应的文件内容,同时也会引起该控件的Change事件发生。为了区分开Change事件发生到底由谁引起,需要增加额外的判断条件GotForcus。
  如果文本显示控件(RichTextBox1)没有获得焦点就直接发生了Change事件,则一定是由于转换文件所引起的。如果该控件在GotForcus事件发生之后才发生Change事件,则一定是由于对文件进行编辑所引起的。由此可以确定文件被改动的充分条件是:文本显示控件RichTextBox1首先获得焦点,然后发生Change事件(Change事件可以发生一次,也可以发生多次),这样,我们就可以借助文本显示控件的两个事件,来判断文件是否被改动。
  2.2 新文件的显示与修改后的文件的保存
  新文件的显示需要占用文本显示控件RichTextBox1,改动过但未保存的旧文件必须有一个临时存放容器,最好的办法是使用另一个文本显示控件RichTextBox2,此控件没有必要显示在前台,设为隐藏属性即可。
  2.3修改的开始与结束
  文本显示控件(RichTextBox1)获得焦点,引起该控件的GotForcus事件发生,可作为修改的开始。此时应记下文件的相关信息,如文件名、文件的绝对路径等,以备保存时使用。
  RichTextBox1控件发生了获得焦点事件之后,又发生了的Change事件,则表明该文件已经被修改。
  当点击其他控件(假如有的话)时,文本显示控件RichTextBox1将失去焦点,引起该控件的LostFocus事件发生。结合之前发生的获得焦点事件、Change事件,该LostFocus事件可作为文件修改结束的标志。此时应给出提示:是否保存修改过的文件。
  3 程序设计
  3.1 窗体设计
  建一个窗体Form1,上面放置文件列表控件File1、文件显示控件RichTextBox1和临时文件存放控件RichTextBox2,各控件的属性如表1所示。
  表1 各控件的属性

 控件名称

  主要属性

  Form1

  Caption = “提示保存修改”

  File1

  手动调节至合适尺寸;Pattern = ”*.txt”

  RichTextBox1

  手动调节至合适尺寸;Scrollbars = “2 – rtfvertical”

  RichTextBox2

  Visible = False

  3.2 过程设计
  新建一标准模块Module1,定义4个全局变量:Mark1、Mark2、Cmnpath2和Name2。其中Mark1用来标记RichTextBox1是否发生获得焦点事件、Mark2用来标记文本内容是否被修改、Cmnpath2用来存放改变文件的绝对路径,Name2用来存放改变文件的文件名。在公共模块里建立一通用过程RTBA_LF00,用来完成保存文件的过程。如图3所示。  


  图 3 通用过程RTBA_LF00

  过程变量K用来存放用户返回值。如果返回值K = 6,则用户选择了“是”,此时对文件进行保存。如果返回值K = 7,则用户选择了“否”,此时不进行任何操作,直接退出子过程。图4为窗体启动过程,只有一项任务:加载File1的路径。

  
  图 4 窗体启动过程Form1_Load

  图5为单击File1过程:单击文本文件时,在RichTextBox1里显示其内容。

  
  图 5 单击File1过程File1_Click

  图6为RichTextBox1获得焦点过程:此时应做出标记(mark1),并记下该文件的全路径以及文件名,以供保存修改时使用。  


  图 6 文本显示控件获得焦点过程RichTextBox1_GorFocus

  图7为RichTextBox1发生变化的过程:如果刚才发生了获得焦点的事件(Mark1=1),则做出“文件已被修改”的判断(Mark2=1)。  


  图 7 文本显示控件变化过程RichTextBox1_Change

  图8为RichTextBox1失去焦点的过程:如果文本已被修改(Mark2=1),则进行以下3项工作:
  (1)将被修改的旧文件内容转移到RichTextBox2控件内备用;
  (2)将新文件的内容显示在RichTextBox1控件内;
  (3)询问是否保存修改旧文件(Call RTBA_LF00);
  无论是否保存修改,之后都需要将标记清除(Mark1=0,Mark2=0),以便一切从头开始。  


  图 8 文本显示控件失去焦点过程RichTextBox1_LostFocus

  特殊情况下,如果文件改动后直接关闭主窗口,将会造成修改不被保存的情况。此时应加入判断,如果有文件被修改(Mark2=1),则先将修改过的文件临时保存,再询问用户是否需要保存(Call RTBA_LF00),最后再关闭程序。过程代码如图9所示。

  
  图 9 关闭主程序过程Form1_Unload

  4 问题与结论
  为了节省篇幅,突出重点,以上只是简单介绍了程序的基本功能。如果达到实用的程度,还需要加入更多的代码。例如,当窗体有多个可执行控件时(本例只选了一个File1),单击任何一个控件都会引起RichTextBox1控件LostFocus事件的发生。由于失去焦点事件发生在先,因此最后一次点击时,窗体可能不会出现预期的变化,不符合传统的操作习惯。如果要求窗体对最后一次点击做出反应,则应当在RichTextBox1的LostFocus过程中加入更多的代码,判断最后一次点击的是哪一个控件(如C = Me.ActiveControl.Name),并编写代码,引发相应的动作。另外,当使用RichTextBox控件进行保存操作时,如果文件具有只读属性,则保存操作会失败。因此在保存前,应先判断文件的属性,并采取相应的措施,以保证操作的正确。
  保存修改后的文件是许多编辑软件最基本的功能,其过程看似简单,实际上具有一定的难度。初学者通过本例,可以学到一些编程的基本技巧,在实践中加以运用和发挥,达到触类旁通、举一反三的效果。

责任编辑:小草

文章搜索:
 相关文章
热点资讯
资讯快报
热门课程培训