程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> Visual Basic語言 >> VB綜合教程 >> 用VB實現象Windows記事本的一些功能

用VB實現象Windows記事本的一些功能

編輯:VB綜合教程
內容:討論如何在用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下調試成功。如有不妥當之處,敬請各位高手斧正!->

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