內容:討論如何在用VB編寫的記事中實現自動將日志添加到文檔尾部、判斷保存還是另存為、確認文件是否需要保存等功能。
Windows自帶的記事本即Notepad有一些功能還是頗具吸引力的,比如自動在特定的文檔尾部加入計算機時鐘的時間和日期,截取已經打開或者保存了的純文檔名[見記事本的標題欄]以及搜索等,給用戶帶來許多方便。本文就TextBox控件討論如何實現這些功能。
一、將日志添加到文檔
在Windows中,如果文檔的第一行最左邊有".LOG"字樣,那麼每次用記事本打開此文時,記事本會自動在文檔尾部加入時間日期。
".LOG"共占四個字節,又置於文檔第一行頂格處,因此可以用VB的Left函數來讀取這個字符串,如有,則用CStr函數來自動添加時間和日期。
我們可以在打開文件的程序加入以下代碼:
DimaAsString
a=Left(Text1.Text,4)'取得頭4個字節
Ifa=".LOG"Then'若有則:
Text1.SelStart=Len(Text1.Text)'光標移到文件尾
Text1.SelText=vbCrLf&CStr(Now)'加入換行和時間
Else'若無,退出過程
ExitSub
EndIf
這樣,我們用VB編寫的記事本就和Windows的Notepad一樣具有自動將日志添加到文檔的功能了。
二、截取FileName中的純文檔名
如若我們用Notepad打開文件D:VBFILENEWTextbox控件用法舉例.txt,Notepad的標題欄的Caption變為:TextBox控件用法舉例-記事本。這個,我們用VB來完成還是比較容易的。
為了方便在程序的各處使用,我們不妨編寫一個截取字符串的函數:
'截取純文欄名函數
FunctionGetFileTitle(OldStrAsString)AsString
OnErrorResumeNext
DimnAsInteger,mAsInteger'聲明字符串變量
DimiAsString,rAsString
DimpAsInteger
i=""'要查找的指定字符
Forn=1ToLen(OldStr)'用Len函數計算已知字符串的字節數
m=InStrRev(OldStr,i,-1)'""所在的位置(其中的-1是默認的)
Nextn'找下去!
'截取最後一個""後面的字符串
r=Right(OldStr,Len(OldStr)-m)'獲取Title
p=InStrRev(r,".",-1)'"."所在位置
GetFileTitle=Left(r,p-1)'去掉後綴
EndFunction
現在我們來調用這個函數以獲取純文檔名:
DimMyStrAsString,ResultAsString
MyStr="d:games6dooldtucomheartStory001.TXT"
Result=GetFileTitle(MyStr)
Me.Caption=Result&"-記事本"
執行之,則窗體的標題變為:Story001-記事本,與NotePad的效果無異!
三、判斷保存還是另存為
通常,我們通過使用CommonDialog控件來保存文件,不過,VB的公共對話框提供的ShowSave其實只是SaveAs,如不作處理則在運行程序中每次保存文件都會跳出另存為對話框,為避免這種不便,我們可以聲明一個窗體級或模塊級的文件名變量[類型:String],並在每一次相關操作中給此變量賦值且保存於內存之中,然後在保存文件時給予識別,如變量不為空則直接保存文件,否則調出另存為對話框,讓用戶輸入文件名。
試看:
DimSaveFileNameAsString'窗體或模塊級變量
'在打開文件事件加入:
SaveFileName=CommonDialog1.FileName
'保存文件
IfSaveFileName<>""Then
OpenSaveFileNameForInputAs#1
Print#1,Text1.Text
Close#1
Else
'此處寫上用公共對話框保存文件的代碼
EndIf
這樣,我們的記事本變得象Notepad一樣聰明了:那令人討厭的另存為對話框不會總是彈出來了!
四、從“我的電腦”拖動文件並打開
當從“我的電腦”拖動文件到Notepad編輯界面,文件格式正確的話則自動打開。在VB中,我們可以這樣處理:
1.在Form_Load事件中加入:
Text1.OLEDropMode=1'令Text1成為可接受文件拖放的OLE容器
2.采用OLE技術實現拖放並打開功能:
'當文件拖到文本框
PrivateSubText1_OLEDragOver(dataAsDataObject,effectAsLong,_
ButtonAsInteger,ShiftAsInteger,XAsSingle,YAsSingle,_
StateAsInteger)
Ifdata.GetFormat(vbCFFiles)Then'如是文件則顯示可放下圖標
effect=vbDropEffectCopyAndeffect
Else'否則顯示不可放下圖標
effect=vbDropEffectNone
EndIf
EndSub
'當文件被放下
PrivateSubText1_OLEDragDrop(dataAsDataObject,effectAsLong,_
ButtonAsInteger,ShiftAsInteger,XAsSingle,YAsSingle)
DimsFileName$AsString'放下的文件名變量
'檢查放下的東西是不是文件名
Ifdata.GetFormat(vbCFFiles)=TrueThen'如是則sFileName=data.Files(1)'只讀取第一個文件信息
OnErrorResumeNext'出錯處理:不予理睬
'在TextBox中打開文件
OpensFileNameForInputAs#1
IfmnuComb(0).CheckedThenText1.Text=Text1.Text&StrConv(InputB$_
(LOF(1),1),vbUnicode):MyLen=Len(Text1.Text)
IfmnuComb(1).CheckedThenText1.Text=StrConv(InputB$(LOF(1),1),_
vbUnicode):MyLen=Len(Text1.Text)
Close#1
EndIf
EndSub
注意:可要記得寫出錯處理代碼,否則……你知道的。
五、確認文件是否需要保存
從當前狀態退出程序或轉移到其它狀態如新建文件、打開文件等,如若當前文件已經改變而用戶又沒有保存,應該提醒用戶要不要保存已做的改變。這一點Notepad是有的,在VB中該怎麼辦呢?
我們可以聲明一個布爾變量,用來記錄文本框是否有了改變,並利用TextBox控件的Change事件來監視文本框的狀態,若有變化,則改變變量值。
1.模塊或窗體級聲明:
DimAskAsBoolean
2.在Form_Load中:
Ask=False'初值
3.在Text1_Change中加入:
Ask=True
4.退出程序或轉移到新的狀態時:
IfAsk=Truethen
DimFlagAsInteger,MsgStrAsString
MsgStr="文件已經改變,是否要存盤?"'提示語
Flag=MsgBox(MsgStr,vbYesNoCancel,"提示")'給予提示
IfFlag=vbYesThenSaveIt'選擇了確定則保存之:這裡假定已有了一個保存文件的子過程SaveIt
IfFlag=vbCancelThenExitSub
IfFlag=vbNoThenCancel=False
EndIf
'......這裡寫上其它主要處理事件代碼
Ask=False'操作結束令其為假,以免老提示
六、搜索功能
Notepad提供了查找和繼續查找字符串的功能。VB中,控件TextBox並不象RichTextBox控件那樣提供了Find方法。這樣我們只好求助於VB的一些內部函數了。以下是筆者自行編寫的一個專用於TextBox控件中查找字符串的函數,函數中用上了VB的InStr等內部函數,這裡就不多作解釋了。
'查找字符串函數[可置於模塊或窗體級中]
FunctionFindMyStr(MyNameAsTextBox,SearchStrAsString)AsInteger
DimWhere'獲取需要查找的字符串變量
DimStartAsInteger
MyName.SetFocus'文本框獲得焦點,以顯示所找到的內容
Start=MyName.SelStart MyName.SelLength 1
Where=InStr(Start,MyName.Text,SearchStr)'在文本中查找字符串
IfWhereThen
'若找到則設置選定的起始位置並使找到的字符串高亮
'FindStr=Where-1
MyName.SelStart=Where-1
MyName.SelLength=Len(SearchStr)
'否則給出提示
Else:MsgBox"未找到所要查找的字符串。",vbInformation,"提示"
EndIf
EndFunction
有了這個函數,我們可以這樣查找和繼續查找字符串:
1.在窗體級聲明:
DimSearchAsString'聲明要查找的變量
2.第一次查找:
DimsFindAsString
'若光標不在開頭處則令其回到開頭
IfText1.SelStart<>0ThenText1.SelStart=0
Search=InputBox("請輸入要查找的字詞:")
sFind=FindMyStr(Text1,Search)
3.繼續查找[就簡單了]:
DimsFindAsString
sFind=FindMyStr(Text1,Search)
這樣,搜索功能就基本具備了,如再提供向上查找功能,則更令人滿意。
以上是筆者在學習、探索中的一些體會,在PWin98、VB中文企業版6.0下調試成功。如有不妥當之處,敬請各位高手斧正!->