用VB實現象Windows記事本的一些功能
發表于:2007-07-14來源:作者:點擊數:
標簽:
作者:土人 內容:討論如何在用 VB 編寫的記事中實現 自動將日志添加到文檔尾部、判斷保存還是另存為、確認文件是否需要保存 等功能。 Windows 自帶的記事本即Notepad有一些功能還是頗具吸引力的,比如自動在特定的文檔尾部加入計算機時鐘的時間和日期,截取
作者:土人
內容:討論如何在用
VB編寫的記事中實現 自動將日志添加到文檔尾部、判斷保存還是另存為、確認文件是否需要保存 等功能。
Windows自帶的記事本即Notepad有一些功能還是頗具吸引力的,比如自動在特定的文檔尾部加入計算機時鐘的時間和日期,截取已經打開或者保存了的純文檔名[見記事本的標題欄]以及搜索等,給用戶帶來許多方便。本文就TextBox控件討論如何實現這些功能。
一、將日志添加到文檔
在Windows中,如果文檔的第一行最左邊有".LOG"字樣,那么每次用記事本打開此文時,記事本會自動在文檔尾部加入時間日期。
".LOG"共占四個字節,又置于文檔第一行頂格處,因此可以用VB的Left函數來讀取這個字符串,如有,則用CStr函數來自動添加時間和日期。
我們可以在打開文件的程序加入以下代碼:
Dim a As String
a = Left(Text1.Text, 4) '取得頭4個字節
If a = ".LOG" Then '若有則:
Text1.SelStart = Len(Text1.Text) '光標移到文件尾
Text1.SelText =
vbCrLf & CStr(Now) '加入換行和時間
Else '若無,退出過程
Exit Sub
End If
這樣,我們用VB編寫的記事本就和Windows的Notepad一樣具有自動將日志添加到文檔的功能了。
二、截取FileName中的純文檔名
如若我們用Notepad打開文件D:\VBFILE\NEW\Textbox控件用法舉例.txt,Notepad的標題欄的Caption變為:TextBox控件用法舉例 - 記事本。這個,我們用VB來完成還是比較容易的。
為了方便在程序的各處使用,我們不妨編寫一個截取字符串的函數:
'截取純文欄名函數
Function GetFileTitle(OldStr As String) As String
On Error Resume Next
Dim n As Integer, m As Integer '聲明字符串變量
Dim i As String, r As String
Dim p As Integer
i = "\" '要查找的指定字符
For n = 1 To Len(OldStr) '用Len函數計算已知字符串的字節數
m = InStrRev(OldStr, i, -1) '"\"所在的位置(其中的-1是默認的)
Next n '找下去!
'截取最后一個"\"后面的字符串
r = Right(OldStr, Len(OldStr) - m) '獲取Title
p = InStrRev(r, ".", -1) '"."所在位置
GetFileTitle = Left(r, p - 1) '去掉后綴
End Function
現在我們來調用這個函數以獲取純文檔名:
Dim MyStr As String, Result As String
MyStr = "d:\games\6do\oldtucom\heart\Story001.TXT"
Result = GetFileTitle(MyStr)
Me.Caption = Result & " - 記事本"
執行之,則窗體的標題變為:Story001 - 記事本,與NotePad的效果無異!
三、判斷保存還是另存為
通常,我們通過使用CommonDialog控件來保存文件,不過,VB的公共對話框提供的ShowSave其實只是Save As,如不作處理則在運行程序中每次保存文件都會跳出另存為對話框,為避免這種不便,我們可以聲明一個窗體級或模塊級的文件名變量[類型:String],并在每一次相關操作中給此變量賦值且保存于內存之中,然后在保存文件時給予識別,如變量不為空則直接保存文件,否則調出另存為對話框,讓用戶輸入文件名。
試看:
Dim SaveFileName As String '窗體或模塊級變量
'在打開文件事件加入:
SaveFileName = CommonDialog1.FileName
'保存文件
If SaveFileName <> "" Then
Open SaveFileName For Input As #1
Print #1, Text1.Text
Close #1
Else
'此處寫上用公共對話框保存文件的代碼
End If
這樣,我們的記事本變得象Notepad一樣聰明了:那令人討厭的另存為對話框不會總是彈出來了!
四、從“我的電腦”拖動文件并打開
當從“我的電腦”拖動文件到Notepad編輯界面,文件格式正確的話則自動打開。在VB中,我們可以這樣處理:
1.在Form_Load事件中加入:
Text1.OLEDropMode = 1 '令Text1成為可接受文件拖放的OLE容器
2.采用OLE技術實現拖放并打開功能:
'當文件拖到文本框
Private Sub Text1_OLEDragOver(data As DataObject, effect As Long, _
Button As Integer, Shift As Integer, X As Single, Y As Single, _
State As Integer)
If data.GetFormat(vbCFFiles) Then '如是文件則顯示可放下圖標
effect = vbDropEffectCopy And effect
Else '否則顯示不可放下圖標
effect = vbDropEffectNone
End If
End Sub
'當文件被放下
Private Sub Text1_OLEDragDrop(data As DataObject, effect As Long, _
Button As Integer, Shift As Integer, X As Single, Y As Single)
Dim sFileName$ As String '放下的文件名變量
'檢查放下的東西是不是文件名
If data.GetFormat(vbCFFiles) = True Then '如是則 sFileName = data.Files(1) '只讀取第一個文件信息
On Error Resume Next '出錯處理:不予理睬
'在TextBox中打開文件
Open sFileName For Input As #1
If mnuComb(0).Checked Then Text1.Text = Text1.Text & StrConv(InputB$ _
(LOF(1), 1), vbUnicode): MyLen = Len(Text1.Text)
If mnuComb(1).Checked Then Text1.Text = StrConv(InputB$(LOF(1), 1), _
vbUnicode): MyLen = Len(Text1.Text)
Close #1
End If
End Sub
注意:可要記得寫出錯處理代碼,否則……你知道的。
五、確認文件是否需要保存
從當前狀態退出程序或轉移到其它狀態如新建文件、打開文件等,如若當前文件已經改變而用戶又沒有保存,應該提醒用戶要不要保存已做的改變。這一點Notepad是有的,在VB中該怎么辦呢?
我們可以聲明一個布爾變量,用來記錄文本框是否有了改變,并利用TextBox控件的Change事件來監視文本框的狀態,若有變化,則改變變量值。
1.模塊或窗體級聲明:
Dim Ask As Boolean
2.在Form_Load中:
Ask = False '初值
3.在Text1_Change中加入:
Ask = True
4.退出程序或轉移到新的狀態時:
If Ask = True then
Dim Flag As Integer,MsgStr As String
MsgStr = "文件已經改變,是否要存盤?" '提示語
Flag = MsgBox(MsgStr, vbYesNoCancel, "提示") '給予提示
If Flag = vbYes Then SaveIt '選擇了確定則保存之:這里假定已有了一個保存文件的子過程SaveIt
If Flag = vbCancel Then Exit Sub
If Flag = vbNo Then Cancel = False
End If
'...... 這里寫上其它主要處理事件代碼
Ask = False '操作結束令其為假,以免老提示
六、搜索功能
Notepad提供了查找和繼續查找字符串的功能。VB中,控件TextBox并不象RichTextBox控件那樣提供了Find方法。這樣我們只好求助于VB的一些內部函數了。以下是筆者自行編寫的一個專用于TextBox控件中查找字符串的函數,函數中用上了VB的InStr等內部函數,這里就不多作解釋了。
'查找字符串函數[可置于模塊或窗體級中]
Function FindMyStr(MyName As TextBox, SearchStr As String) As Integer
Dim Where '獲取需要查找的字符串變量
Dim Start As Integer
MyName.SetFocus '文本框獲得焦點,以顯示所找到的內容
Start = MyName.SelStart + MyName.SelLength + 1
Where = InStr(Start, MyName.Text, SearchStr) '在文本中查找字符串
If Where Then
'若找到則設置選定的起始位置并使找到的字符串高亮
'FindStr = Where - 1
MyName.SelStart = Where - 1
MyName.SelLength = Len(SearchStr)
'否則給出提示
Else: MsgBox "未找到所要查找的字符串。", vbInformation, "提示"
End If
End Function
有了這個函數,我們可以這樣查找和繼續查找字符串:
1.在窗體級聲明:
Dim Search As String '聲明要查找的變量
2.第一次查找:
Dim sFind As String
'若光標不在開頭處則令其回到開頭
If Text1.SelStart <> 0 Then Text1.SelStart = 0
Search = InputBox("請輸入要查找的字詞:")
sFind = FindMyStr(Text1, Search)
3.繼續查找[就簡單了]:
Dim sFind As String
sFind = FindMyStr(Text1, Search)
這樣,搜索功能就基本具備了,如再提供向上查找功能,則更令人滿意。
以上是筆者在學習、探索中的一些體會,在PWin98、VB中文企業版6.0下調試成功。如有不妥當之處,敬請各位高手斧正!
原文轉自:http://www.anti-gravitydesign.com