----這種辦法是利用VisualBasic提供的創建ActiveX部件的功能設計一個專門完成“大任務”的ActiveX部件。這里對ActiveX部件作如下簡單介紹,以期適合不同的讀者。VisualBasic所能設計的部件共有兩種:一種是可視的部件;另一種是不可視的部件。ActiveX控件和窗體一起構成了應用程序與用戶交互的界面,ActiveX文檔使用在Internet應用程序中。由于我們的問題不涉及到可視的部件,所以這里不再贅述。
----不可視的部件又稱為代碼部件,包括ActiveDLL部件和ActiveXEXE部件兩種。ActiveX部件的另一個名稱是ActiveX服務器,之所以被稱作服務器是由于ActiveX部件與使用它們的應用程序之間的關系可以被類比為服務器程序與客戶端程序之間的關系:ActiveX部件封裝了特定的功能或業務規則,應用程序不需要知道ActiveX部件是如何實現這些功能或業務規則的,只需要通過ActiveX部件提供的編程接口(API)傳遞應用程序的要求(通過屬性或方法的參數),然后從部件的事件獲得執行結果。根據ActiveX部件(ActiveX服務器)的執行方式可以把ActiveX部件分為進程內部件和進程外部件,所謂進程內部件即部件和使用它們的應用程序執行時共享同一個進程;而進程外部件卻執行在自己的進程中,也可以這樣認為:進程外部件的執行不影響使用它們的應用程序!顯然,這個特性正是本文開始面對的那個問題所需要的。在部件中只有ActiveXEXE部件是進程外部件,因此利用這個特性我們可以創建一個ActiveXEXE部件來完成“大任務”,而應用程序窗體只顯示一些任務的提示信息,直到ActiveXEXE部件的類的事件提示任務結束為止。這樣應用程序就避免了那種呆板的“白布”窗體的出現,而能夠響應任何來自用戶的操作或者當從那些遮蓋住它的程序切換回來時自行刷新。給用戶的感覺是程序是在“異步”執行。
----下面我們通過例子來看如何實現這一想法:這個例子中,我們假設應用程序窗體是一個一直顯示當前時間的數字時鐘,當你使其執行“大任務”直到任務的完成,這期間你會發現數字時鐘窗體從來就沒有被“掛起”過,仍然能夠響應你的拖動操作和不停地顯示時間。以下是實現這一程序和ActiveXEXE部件的步驟及源代碼:
----步驟二:為工程添加一個Timer控件的容器窗體(添加窗體通過菜單工程>添加窗體完成)。窗體名稱改為frmClock;在窗體上放置一個Timer控件(從工具箱中選擇Timer控件),名稱改為timClock。
----說明:添加該窗體的用意是提供一個執行任務的定時器(Timer控件)
----步驟三:設計實現“大任務”的類BigJob(注:代碼部件是通過各種類實現應用程序交給它的任務的,關于類的創建請參考《手冊》或MSDN文檔),默認情況下當你新建ActiveXEXE部件時VisualBasic為你添加了一個名為Class1的類(要增加類通過菜單工程>添加類模塊完成),從工程資源管理器中選中Class1,然后在屬性窗口中設置如下屬性:
----(名稱):BigJob
----Instancing:5-MultiUse
----編寫API:為類BigJob添加方法和事件(通過菜單工具>添加過程完成)部分代碼及程序說明如下:
新聞熱點
疑難解答