內容:討論如何在用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:/VBFILE/NEW/Textbox控制項用法舉例.txt,Notepad的標題列的Caption變為:TextBox控制項用法舉例-記事本。這個,我們用VB來完成還是比較容易的。
為了方便在程式的各處使用,我們不妨編寫一個截取字串的函數:
'截取純文欄名函數
FunctionGetFileTitle(OldStrAsString)AsString
OnErrorResumeNext
DimnAsInteger,mAsInteger'聲明字串變數
DimiAsString,rAsString
DimpAsInteger
i="/"'要尋找的指定字元
Forn=1ToLen(OldStr)'用LenFunction Compute已知字串的位元組數
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:/games/6do/oldtucom/heart/Story001.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下調試成功。如有不妥當之處,敬請各位高手斧正!->