8. 建立Internet元件 

 

在前一章中我們討論了如何以Visual Basic所提供的Internet元件發展應用程式,包括一些聊天軟體、檔案伺服器和網頁瀏覽器等Internet應用程式。本章要告訴你如何建立自己的Internet元件,這些元件包括:

本章要告訴你如何以Visual Basic建立或是加強上述這些元件,討論的主題與 第九章"建立Internet應用程式" 息息相關,因此,你必須融會貫通這些章節才能在Visual Basic的Internet程式設計課題上得到充分的了解。

如何建立在Internet上面使用的ActiveX控制項?
 

將ActiveX控制項應用在Internet應用程式中的時候,有幾項特別的考量因素必須在此說明:

 數位化簽名(Digital Signature) 

所有可執行元件必須擁有數位化簽名,以供辨識作者並且證明這些元件可以安全地執行和安全地使用於腳本程式(Scripts)中。你可以從VeriSign ( http://www.verisign.com )或其他廠商那裡取得數位化簽名。

 執行緒模式(Therading Model) 

ActiveX控制項的執行緒模式必須與其應用程式的執行緒模式相容;單一執行緒應用程式可以使用單一執行緒或多重執行緒的ActiveX控制項,但是多重執行緒的應用程式只能使用多重執行緒的控制項。DHTML應用程式就是屬於多重執行緒的應用程式。

 非同步載入(Asynchronous Loading) 

依照預設條件,所有物件在Internet上面的載入動作都是非同步的。因此,在引用物件之前,你必須先確定它們是否已經存在,你可以用IsNull函式來達到此一目的。

 封裝部署(Packaged for Distribution) 

透過Internet安裝的ActiveX控制項必須要用安裝程式來進行安裝工作,「封裝暨部署精靈」可以幫你產生必要的.CAB檔和.HTM檔,關於這部份請看 第九章 中對「封裝暨部署精靈」的討論。

我們在 第六章"ActiveX控制項" 中建立的AsynchronousAnimation控制項可以在Internet上執行,因此,以下各節會把這個控制項應用在HTML、DHTML和ActiveX文件中。

如何以VBScript使用ActiveX控制項?
 

HTML文件是在Internet上面被用得最廣泛的資料格式,在Internet Explorer中的HTML文件還可包含ActiveX控制項、VBScript、JScript和Java Applet。如圖8-1所示,AsynchronousAnimation控制項可以被用在一個名為htAni.HTM的HTML文件中。

以下是htAni.HTM的HTML碼,請注意AsynchronousAnimation控制項和共用對話方塊控制項(CommonDialog Control)在HTML中必須以 <OBJECT> 標籤加以識別。同時,這兩個控制項由VBScript程式碼控制。


 

 圖8-1 內嵌於網頁中的AsynchronousAnimation控制項
<HTML>
<P>
<OBJECT ID="asyncAnimation" WIDTH=200 HEIGHT=80
CLASSID="CLSID:1B9C2FBC-0156-11D2-A061-00AA005754FD"
</OBJECT>

<OBJECT ID="dlgFile" WIDTH=50 HEIGHT=50
CLASSID="CLSID:F9043C85-F6F2-101A-A3C9-08002B2F49FB"
</OBJECT>

<P>
<INPUT TYPE="BUTTON" VALUE="View Animation" NAME="butView">

<SCRIPT LANGUAGE="VBscriptV>
`Event procedure for the intrinsic button control
Sub butView_OnClick
    `Make sure objects exist
    If IsNull(dlgFile) Or IsNull(asyncAnimation) Then Exit Sub
    `Get a file
    dlgFile.ShowOpen
    strFile = dlgFile.FileName
    `If a filename was enteredDear John, How Do I... 
    If strFile <> "" Then
        `Dear John, How Do I... display it in the asyncAnimation control
        asyncAnimation.AVIFile = strFile
        `Reset FileName
        dlgFile.FileName = ""
    End If
End Sub

`Handle error events from the asyncAnimation control
Sub asyncAnimation_FileError(Number, Description)
    `Display a message with the error
    MsgBox "File is not a valid animation.", _
        vbOKOnly And vbCritical, "Error " & Number
End Sub
</SCRIPT>
</HTML>

要取得控制項的CLASSID資訊,最簡單的方法就是使用即將在 第九章 中介紹的「封裝暨部署精靈」,這個輔助精靈會產生含有相關 <OBJECT> 標籤的.HTM檔。

你可以修改輔助精靈產生的.HTM檔,加入文字、圖形、Visual Basic控制項、其他ActiveX元件以及可執行的腳本程式。

在使用VBScript時請注意以下幾點:

請參閱Visual Studio MSDN Library中的"VBScript Language Reference "和"VBScript Tutorial ",也請參閱Inside Microsoft Visual Basic Scripting Edition。

如何建立DHTML文件?
 

DHTML未來將會被包含在HTML 4.0中。藉由可程式化的Document Object Model (DOM)和Cascading Style Sheet (CSS),DHTML來讓網頁更具動態性。


注意:

目前Microsoft和Netscape對DHTML採行的格式仍然不同,但World Wide Web協會(W3C)對DHTML標準已有了定案,並且把他們的建議公佈在 http://www.w3c.org 網站上,未來這兩種瀏覽器可能就會支援同一種DHTML。


Visual Basic提供了新的設計工具,輔助程式設計師處理DHTML網頁。Visual Basic的DHTML設計師,如圖8-2,會顯示出網頁的階層結構,並且提供編輯區讓你在網頁中加入文字或文件。


 

 圖8-2 以DHTML設計師來設計網頁

使用DHTML設計師來建立DHTML網頁,不同於建立Visual Basic的表單、ActiveX文件、使用者控制項或是屬性頁。DHTML設計師的編輯區比較像是瀏覽器,而不像一般Visual Basic的編輯工具,以下我們列出了一些相異之處:

圖8-3所顯示的是一個由Visual Basic所建立的DHTML網頁,網頁中包含著我們在 第六章 中所建立的AsynchronousAnimation控制項,共用對話方塊控制項和HTML的指令按鈕控制項。這個範例收錄在隨書光碟的dhAni.VBP專案裡。


 

 圖8-3 AsynchronousAnimation控制項在DHTML網頁中播放Windows動畫

為了比較DHTML和一般HTML在使用控制項時的差異性,我們用圖8-3中的範例來模仿前一節中的範例;但儘管這兩個範例網頁看起來完全相同,dhAni.VBP的Visual Basic程式碼和dhAni.HTM中的VBScript程式碼卻有所差異。DHTML網頁容許變數宣告和參數型別的設定,並且要求使用控制項時必須以Document物件引用之。請看以下的程式碼:

`Displays a Windows animation on the Web page
Private Function butView_onclick() As Boolean
    `Make sure objects exist
    If IsNull(dlgFile) _
        Or IsNull(asyncAnimation) Then Exit Function
    Dim strFilename As String
    `Display the Open File dialog box
    Document.dlgFile.ShowOpen
    `Get the file name
    strFilename = Document.dlgFile.FileName

    `If a file was selectedDear John, How Do I... 
    If strFilename <> "" Then
        `Dear John, How Do I... show it in the AsyncAni control
        Document.asyncAnimation.AVIFile = _ 
            strFilename
    End If
End Function

Private Sub asyncAnimation_FileError(Number As Long, _
    Description As String)
    `Display a message with the error
    MsgBox "File is not a valid animation.", _
        vbOKOnly And vbCritical, "Error " & Number
End Sub

你可能注意到了一件事:butView按鈕的onclick事件程序是一個Function而非Sub。在DHTML裡,事件程序會使用傳回值以便啟動它們的預設動作,舉個例子來說,如果你為某個超連結(Hyperlink)寫了一個onclick事件程序,必須在程式碼的最後傳回True,這樣瀏覽器才會到這個超連結的網址,否則,瀏覽器只會執行程式碼但不會到該連結所指的網址。請看以下的程式:

Private Function lnkHome_onclick() As Boolean
    Dim intGo As Integer
    `Get a response
    intGo = MsgBox("Do you want to go home?", vbYesNo)
    `If the user chose yesDear John, How Do I... 
    If intGo = vbYes Then
        `Dear John, How Do I... enable the default action (go to link)
        lnkHome_onclick = True
    Else
        `Dear John, How Do I... cancel the default action (don't go to link)
        lnkHome_onclick = False
    End If
End Function

如果要知道更多有關DHTML的資訊,例如在DHTML應用程式中包含多份網頁,請看 第九章"建立Internet應用程式" 。

如何建立ActiveX文件?
 

ActiveX文件有許多組成元素,包括Visual Basic使用者文件、表單、程式模組以及其他加入的元件。使用者文件(User Document)是一種獨特的Visual Basic收納器,用來將其收納進來的物件顯示在網頁瀏覽器上。


注意:

World Wide Web協會(W3C)的標準並不涵蓋ActiveX文件,但是它是Microsoft的ActiveX策略性元件。ActiveX文件由早期的"物件連結及嵌入"技術(Object Linking and Embedding)演進而來,目前已是廣為軟體業界所接受的既存標準(de facto Standard)。Internet Explorer支援ActiveX文件,但Netscape Navigator並不支援它。


使用者文件十分類似Visual Basic的表單,所有的Visual Basic控制項都可以用在上面。在使用者文件上加入控制項的方式和在表單上加入控制項的方式並無不同,但在程式部分就有了差異。使用者文件的載入和載出都受到網頁瀏覽器的指揮命令,因此,以下幾點請你牢記:

  • 必須等到相關物件都載入後,某個物件才能呼叫另一個物件。舉例來說,使用者可能會按下一個按鈕,而這個按鈕所呼叫的物件卻正在載入中;為了防止這種情形,你可以用IsNull函式檢查物件是否載入完成。
     
  • 你必須把不同使用者文件所共用的資料放在全域變數或共用物件中,因為某份使用者文件中的資料並不能與其他使用者文件共享。
     

從圖8-4中你可以看到ActiveX文件中AsynchronousAnimation控制項在網頁瀏覽器中執行的情形,ActiveX文件看起來很像前兩節中所介紹的HTML網頁和DHTML網頁。

這個範例被收錄在隨書光碟中的axAni.VBP專案裡。


 

 圖8-4 Animation Viewer在ActiveX文件中播放Windows動畫

以下這段程式碼和寫在表單上的程式碼完全相同:

`Displays a Windows animation on the Web page
Sub cmdView_click()
    `Make sure objects exist
    If IsNull(dlgFile) Or IsNull(asyncAnimation) Then Exit Sub
    Dim strFilename As String
    `Display the Open File dialog box
    dlgFile.ShowOpen
    `Get the file name
    strFilename = dlgFile.FileName
    `If a file was selectedDear John, How Do I... 
    If strFilename <> "" Then
        `Dear John, How Do I... show it in the AsyncAni control
        asyncAnimation.AVIFile = strFilename
    End If
End Sub

Private Sub asyncAnimation_FileError(Number As Long, _
    Description As String)
    `Display a message with the error
    MsgBox "File is not a valid animation.", vbOKOnly And vbCritical, _
        "Error " & Number
End Sub

對Visual Basic程式設計師而言,建立一個ActiveX文件要比建立一個DHTML或HTML應用程式還要容易。然而,要維護修改ActiveX文件的內容卻比較困難,因為很多文件編輯軟體都可以用來修改HTML和DHTML檔案,而且修改後也不用編譯它們。

如何建立WebClass?
 

IIS應用程式所使用的物件可以透過Webclass來管理它們的建立和銷毀事宜。當你啟動了一個新的IIS應用程式時,Visual Basic就會自動產生一個Webclass。


注意:

如果要使用Webclass,你必須安裝Internet Information Server (IIS)或是Personal Web Server (PWS)。


你可以修改預設的Webclass,使之能夠產生一些HTML字串。例如,以下這個Webclass_Start事件程序可以建立一個Dice物件,然後在網頁上顯示結果:

Private Sub WebClass_Start()
    Dim sQuote As String
    `Create a Dice object
    Dim diceObject As New Dice
    `Define quote character for building HTML strings
    sQuote = Chr$(34)
    `Set counter for this page
    Session("Tries") = Session("Tries") + 1
    `Write a reply to the user
    With Response
        .Write "<HTML>"
        .Write "<body>"
        .Write "<h1><font face=" & sQuote & "Arial" & sQuote & _
               ">Chance -- Try " & Session("Tries") & "</font></h1>"
        .Write "<p>You rolled a " & diceObject.Roll & _
               " and a " & diceObject.Roll & "."
        .Write "</p>"
        .Write "<p>Refresh or reload to roll again.</p>"
        .Write "</body>"
        .Write "</html>"
    End With
End Sub

當你執行Chance範例(Chance.VBP)時,Visual Basic會為你的IIS專案設立一個虛擬目錄,產生一個引用Webclass的Active Server Page(ASP),然後執行這個ASP。這樣,Internet Explorer就會顯示出如圖8-5的結果。


 

 圖8-5 每當你按下網頁瀏覽器的「重新整理」按鈕,模擬的骰子就會被投擲一次

Chance範例也示範了如何用Session物件保存屬性值。以下這行程式碼在Session物件中產生了一個Tries屬性,並將其屬性值加1:

Session ("Tries") = Session ("Tries") + 1

如果要在每次重新整理時保留程式的設定值,可以把Webclass的StateManagement屬性設為wcRetainInstance;如果設為wcNoState,Webclass便不會保留Session物件的資訊而網頁永遠顯示"Try 1 "。

Chance範例以Response物件的Write物件方法把HTML碼送到網頁瀏覽器中。這是一個示範說明Webclass的好方法,但是並不適用於顯示大量的資訊或是更新網頁內容。你可以把網頁的內容存放在另外的HTML檔案中,做為範本檔案。這個技巧我們將在 第九章"建立Internet應用程式" 中進一步介紹。