程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> Visual Basic語言 >> VB6 >> VB中自動提示保存修改後的文件

VB中自動提示保存修改後的文件

編輯:VB6

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控件進行保存操作時,如果文件具有只讀屬性,則保存操作會失敗。因此在保存前,應先判斷文件的屬性,並采取相應的措施,以保證操作的正確。

保存修改後的文件是許多編輯軟件最基本的功能,其過程看似簡單,實際上具有一定的難度。初學者通過本例,可以學到一些編程的基本技巧,在實踐中加以運用和發揮,達到觸類旁通、舉一反三的效果。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved