• <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>
    • 軟件測試技術
    • 軟件測試博客
    • 軟件測試視頻
    • 開源軟件測試技術
    • 軟件測試論壇
    • 軟件測試沙龍
    • 軟件測試資料下載
    • 軟件測試雜志
    • 軟件測試人才招聘
      暫時沒有公告

    字號: | 推薦給好友 上一篇 | 下一篇

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

    發布: 2007-7-14 20:28 | 作者: 佚名    | 來源: 網絡轉載     | 查看: 40次 | 進入軟件測試論壇討論

    領測軟件測試網 作者:土人
    內容:討論如何在用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.kjueaiud.com/


    關于領測軟件測試網 | 領測軟件測試網合作伙伴 | 廣告服務 | 投稿指南 | 聯系我們 | 網站地圖 | 友情鏈接
    版權所有(C) 2003-2010 TestAge(領測軟件測試網)|領測國際科技(北京)有限公司|軟件測試工程師培訓網 All Rights Reserved
    北京市海淀區中關村南大街9號北京理工科技大廈1402室 京ICP備2023014753號-2
    技術支持和業務聯系:info@testage.com.cn 電話:010-51297073

    軟件測試 | 領測國際ISTQBISTQB官網TMMiTMMi認證國際軟件測試工程師認證領測軟件測試網

    老湿亚洲永久精品ww47香蕉图片_日韩欧美中文字幕北美法律_国产AV永久无码天堂影院_久久婷婷综合色丁香五月

  • <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>