用VB開發(fā)與機(jī)器環(huán)境無關(guān)的程序

字號(hào):

利用Visual Basic開發(fā)應(yīng)用程序時(shí),常常會(huì)遇到這樣的問題:生成的可執(zhí)行文件在開發(fā)的機(jī)器上能夠運(yùn)行,復(fù)制到另一臺(tái)機(jī)器上則無法運(yùn)行,這種現(xiàn)象稱之為應(yīng)用程序與機(jī)器環(huán)境相關(guān)。造成這種現(xiàn)象主要有兩個(gè)方面的原因:一是程序在運(yùn)行過程中調(diào)用了一些文件,如數(shù)據(jù)庫文件、文本文件和圖片文件等,由于路徑使用不當(dāng)而無法定位;二是Visual Basic編譯成的.EXE文件并不是實(shí)際意義上的EXE文件,Visual Basic系統(tǒng)中的標(biāo)準(zhǔn)控件和開發(fā)過程中用到的第三方控件,都沒有包含在內(nèi)。此現(xiàn)象可由圖1形象地加以說明。
    因此要解決用VB開發(fā)的應(yīng)用程序與機(jī)器環(huán)境的相關(guān)性,必須從兩個(gè)方面入手,一是保證應(yīng)用程序能調(diào)用到所用文件,二是應(yīng)用程序發(fā)布時(shí)同時(shí)發(fā)布所有用到的控件和DLL文件。
    開發(fā)與路徑無關(guān)的應(yīng)用程序
    無論應(yīng)用程序論開發(fā)得多么好,是否成功還取決于其能否在任何機(jī)器的任何目錄下都能運(yùn)行,這就要求應(yīng)用程序要自成一體,不但要包含所有用到的文件,而且還應(yīng)與路徑無關(guān)。實(shí)現(xiàn)應(yīng)用程序與路徑無關(guān)可用兩種方法:一是利用VB.APP對(duì)象的PATH屬性;二是把調(diào)用文件放在光盤上,直接調(diào)用。
    1.利用VB.APP.PATH實(shí)現(xiàn)與路徑無關(guān)
    該方法的主要思路是在調(diào)用文件時(shí)利用相對(duì)路徑,由于VB中不支持與DOS類似的相對(duì)路徑,如調(diào)用當(dāng)前目錄下的“hh1.bmp”文件,寫成“hh1.bmp” 和 “.\hh1.bmp“將會(huì)出錯(cuò)。為解決該問題,VB提供一個(gè)VB.APP對(duì)象,該對(duì)象有個(gè)名為PATH的屬性,它記下了執(zhí)行文件所在的路徑,可在運(yùn)行時(shí)訪問。
    用該方法創(chuàng)建與路徑無關(guān)應(yīng)用程序的要點(diǎn)如下:
    (1)為應(yīng)用程序(項(xiàng)目)創(chuàng)建一個(gè)目錄,用以存放建立的窗體或其它文件。
    (2)把應(yīng)用程序所調(diào)用的文件放在該目錄下或者放在該目錄的子目錄下。子目錄按照引用文件的類型進(jìn)行建立,如存放圖片的子目錄名為PIC,存放表的的目錄為DBF等。
    (3)除包含在可執(zhí)行文件中的文件(如在設(shè)計(jì)時(shí)圖片框加載的圖片)外的其它文件,調(diào)用一律采用相對(duì)路徑而禁用絕對(duì)路徑。
    這樣在復(fù)制應(yīng)用程序的時(shí)候,只要把應(yīng)用程序目錄下的所有文件(包括子目錄)復(fù)制到任意目錄下,應(yīng)用程序都不會(huì)發(fā)生因找不到文件而產(chǎn)生的錯(cuò)誤。
    以下是一個(gè)程序?qū)嵗?,該?shí)例顯示一系列的角度逐漸變化的地球圖片,從而形成地球轉(zhuǎn)動(dòng)動(dòng)畫。用VB設(shè)計(jì)一個(gè)窗體,窗體上放置一個(gè)圖片框,名為Image1(Strech=.T.),給窗體加一個(gè)定時(shí)器控件,控件名為Timer1(Interval=25,enabled=.t.),該項(xiàng)目存放在A:\exam下,圖片文件存放在A:\EXAM1\PIC下面。
    使用絕對(duì)路徑,程序代碼如下:
    Dim t1 As Integer
    Private Sub Form_Load()
    t1 = 0 注釋:t1 記錄時(shí)鐘事件發(fā)生的次數(shù)
    End Sub
    Private Sub Timer1_Timer()
    t1 = t1 + 1
    If t1 < 100 Then 注釋:圖片共顯示100幅
    current = t1 Mod 8
    注釋:current表示當(dāng)前應(yīng)該顯示哪張圖片
    FileName$ = "A:\exam\pic\earth" && current && ".jpg" 注釋:圖片文件名(絕對(duì)路徑)
    Image1.Picture = LoadPicture(FileName$) 注釋:顯示圖片
    Else
    End 注釋:程序結(jié)束
    End If
    End Sub
    該程序使用絕對(duì)路徑調(diào)用外部文件(earth0.jpg fearth7.jpg),當(dāng)把EXAM目錄全部內(nèi)容拷貝到其它機(jī)器上,抽出軟盤后,運(yùn)行程序?qū)l(fā)生找不到文件錯(cuò)誤。若采用VB.APP.PATH屬性,把形成圖片文件名的語句改寫如下:
    FileName$ = VB.App.Path && "\pic\earth" && current && ".jpg" 注釋:形成顯示圖片的文件名
    這樣無論把exam目錄完全復(fù)制到任何機(jī)器,程序均能運(yùn)行。