第十二章 多模組與多專案.

Slides:



Advertisements
Similar presentations
1 程式語言 Visual Basic 循序結構、選擇結構 黃瀧輝 老師 Long Hwai,Huang.
Advertisements

第2章 Visual Basic 6.0编程基础 (第一部分)
第二章 VB的编程机制 【授课时间】第3周,第2次课 【授课题目】 2.1 面向对象程序设计概述 2.2 VB中的对象
Demo-dataSource與DropDownList
ooxx這個遊戲程式,非常的簡單只要你小時候會玩井字遊戲即可把電腦打敗,可以說是一種考智力取勝的遊戲。
程式語言(I)- Visual Basic 6.0 第 9 章 結構化程式設計
上課囉 職場甘苦談 小資男孩向錢衝 育碁數位科技 呂宗益/副理.
客户端用Net-Library和SQL SERVER连接
課程名稱:程式設計 授課老師:________
高等医药院校药学类第三轮规划教材——大学计算机基础
第五章 数组.
VBA应用开发与实例 李 辉 微软课程培训讲师. VBA应用开发与实例 李 辉 微软课程培训讲师.
Visual Basic程序设计.
BLANK overview.
程式語言Visual Basic 變數的可視範圍
Chapter 1 複習.
Visual Basic快速入门 ADO数据控件与数据绑定控件 VB数据库编程举例 VB开发数据库应用系统实例分析
Visual Basic 2010 程式設計16堂特訓 第七堂 VB的迴圈流程控制.
建立VB.NET應用程式 資管系 助理教授 詹曉苓.
Visual Basic 6.0 學習範本 第三章 基本資料型態.
第6章 数 组 6.1 一维数组 6.2 控件数组 6.3 二维数组.
第二章 Visual Basic语言基础.
講師:戴志華 國立台灣大學電機工程研究所 Visual Basic 程式設計 講師:戴志華 國立台灣大學電機工程研究所.
数组 第 6 章.
第5章 数组 Visual Basic程序设计.
Visual Basic程序设计 第七章 数组
程式語言 -Visual Basic 變數、常數與資料型態.
副程式 將可以重複使用的程式區塊獨立而成 寫在Private Sub 函數名稱() 副程式碼 End Sub 呼叫副程式
Visual Basic程序设计 第八章 过程 -子程序和函数
过程 第 7 章.
ASP动态网页设计实用教程 主讲教师: 开课单位:.
初识Visual Basic.
算法与程序设计.
第1章 概述 程序设计语言的发展 Visual Basic 6.0简介 Visual Basic 6.0集成开发环境 设计程序的一般步骤.
第十三章 檔案.
Access VBA程序设计 本章重点 Access Basic编程语言 运算符、函数与表达式 Access Basic语句 模块的使用
第4章 程序控制结构与算法基础.
新觀念的 VB6 教本 第七章 讓程式轉彎的控制敘述.
流程控制、陣列 台南市聖功女子高級中學 毛全良.
计算机程序设计强化复习 Visual Basic 6.0.
程式語言Visual Basic 重複結構 黃瀧輝 老師 Long Hwai,Huang.
程式設計 Visual Basic簡介 週次:1 建國技術學院 資管系 饒瑞佶 2003年9月17日.
程式語言Visual Basic 傳址與傳值
第12章 VBA模块设计.
RWM600 (13.56MHz) Reader Antenna.
RWM600 (13.56MHz) Reader Antenna.
新觀念的 VB6 教本 第 6 章 資料型別.
第5章 Visual Basic控制结构 之 常用算法举例
Visual Basic 6.0 ——程序设计.
第 8 章 过程.
Visual Basic程序设计.
VB程序设计语言 主讲教师:王 杨.
VB程序设计语言 主讲教师:王 杨.
程式設計 Visual Basic簡介 週次:2 建國技術學院 資管系 饒瑞佶 2003年9月17日.
程式語言(I)- Visual Basic 6.0 第 8 章 模組化程式設計I-副程式與自定函數.
江西财经大学信息管理学院 《数据库应用》课程组2007
第五章: 輸入與輸出.
VB语言程序设计教程.
107學年度高一程式設計 上機考試 投影片 加減乘除.
小结 郭清溥.
现代信息技术 微电子技术 计算机技术 传感技术 通信技术 处理、存储信息的技术 传感、采集技术 传递信息的技术
程序基础 2019/4/25.
第二章、第三章错题分析.
萬芳高中高一下程式設計 上課教學說明檔 106-2學期 班級:S105 ~ S110.
计算机应用基础 潍坊学院 计算机工程学院 主讲人:丁素英.
程式設計 Visual Basic簡介 週次:4 建國技術學院 資管系 饒瑞佶 2003年10月18日.
第5章 数组 5.1 数组概述 5.2 静态数组和动态数组 5.3 数组的基本操作 5.4 控件数组 5.5 数组在自定义数据类型中的应用.
1、过程概述 2、函数过程 3、子过程 4、过程的使用 5、传递参数 6、过程的嵌套
算法与Visual Basic程序基础(二)
程序调试与错误处理.
Presentation transcript:

第十二章 多模組與多專案

章節預覽 12.1 Visual Basic的檔案類型 12.2 模組(Module) 12.3 多模組設計 12.4 多專案操作 12.3 多模組設計 12.4 多專案操作 12.5 呼叫應用程式-Shell函數

12.1:Visual Basic的檔案類型 在前面幾章所介紹的程式設計中,我們在開啟Visual Basic IDE之後,將會產生一個「專案」(預設名稱為Project1)與一個「表單」(預設名稱為Form1)。當我們將專案存檔後,會產生一個附檔名為.vbp的「專案檔案」。而「專案檔案」中將存放所有該專案會使用到的模組檔案、外加控制項檔案路徑及相關檔名等資訊。 若使用開啟舊專案來載入某個已存在的專案檔時,Visual Basic IDE則會將記錄於該專案檔內的各個檔案同時載入系統。這些檔案可能包含下列幾種目的與格式: 專案工作區檔(副檔名為.vbw) 主檔名與專案檔之主檔名相同,記錄專案中使用到的表單名稱與資料。 表單模組檔(副檔名為.frm) 當專案中使用了表單時,每一個表單都會產生一個表單模組檔,用來儲存表單及其子件的屬性及相關程式碼。

12.1:Visual Basic的檔案類型 一般模組檔(副檔名為.bas) 若專案中使用一般模組來存放公用程序,則每一個「一般模組」會產生一個『一般模組檔』。 類別模組檔(副檔名為.cls) 專案若使用物件類別,則專案檔內會記錄類別模組檔。 二進位資料檔(副檔名為.frx) 表單中若使用了二進位資料(例如圖片),則這些二進位資料會另外存放在該檔案,主檔名與表單主檔名相同。 專案群組檔(副檔名為.vbg) 當使用二個專案以上時,則會產生專案群組檔,記錄使用的專案檔名。 ocx控制項檔(副檔名為.ocx) 當專案使用了工具箱未提供的外加控制項,則會產生ocx外加控制項檔案。 資源檔(副檔名為.res) 專案中若使用其它文字或點陣圖時,專案檔內會記錄該資源檔。

12.1:Visual Basic的檔案類型 其它檔案 除了上述檔案外,Visual Basic還可能產生.dca(設計工具使用中的快取記憶體檔)、.dep(安裝精靈使用的儲存檔)、.ctl(使用者控制項檔)、.ctx(使用者控制項的二進位檔)、.pag(屬性頁檔)等等,請讀者自行參閱Visual Basic 6.0線上輔助說明。 並非每一個「專案」都會包含上述的所有類別檔案,上述的許多檔案只會在寫撰寫程式的過程使用到各類資源(例如表單、外加控制項、程式模組、類別、圖片、功能表)時,才會將使用的資源記錄在.vbp專案檔中。 專案群組檔,則必須在程式設計時出現兩個以上的專案(也就是「專案群組」視窗出現兩個以上的專案名稱),在儲存專案時,才會產生一個「專案群組」檔案(.vbg)。

12.2:模組(Module) Visual Basic程式碼放在模組檔中,比較常用的模組有三類: 表單模組(Form Module) 表單模組檔的附檔名為『.frm』,其中包括 (1)表單本身的文字說明 (2)在表單的控制項子件及屬性設定 (3)程序程式碼(含事件程序和一般程序)。 若該專案只使用一個表單,則所有程式碼可以會被放到表單模組。 一般模組 (Standard Module) 一般模組檔的副檔名為『.bas』,其中包含公用或一般模組層次的型態宣告(例如:常數、變數)以及公用程序。 若應用程式非常大,必須使用二個以上的表單時,由於在多個表單模組中,可能會有出現一些相同的程式區塊,此時可以建立一個獨立的模組,並且將這些相同的程式區塊放在該模組的程序,使得這些程序可以被共用,這些程序稱為「公用程序」,而這個獨立模組則稱為「一般模組」或稱為「基本模組」、「標準模組」。請特別注意的是,「一般模組」只能撰寫「一般程序」,不可撰寫「事件程序」。

12.2:模組(Module) 類別模組 (Class Module) 類別模組檔的副檔名為『.cls』以為副檔名,可以用來建立自己定義的物件,其中則包括定義物件方法、屬性的程式碼。功能與表單模組類似,但由於我們建立的物件非視覺化物件,因此將沒有使用者介面。

12.3:多模組設計 之前設計的程式,通通都是存放在表單模組中,而從本節開始,我們將介紹如何撰寫多模組的程式。善用模組,將可以提高程式碼的重覆使用率。 公用與私用程序的宣告 在Visual Basic中,「表單模組」或「一般模組」最多只能夠有64k的程式碼。而一個中大型的應用程式,通常擁有二個以上表單。若專案包含二個以上的表單時, 則在模組中使用Private 或Public來宣告程序, 在程序呼叫時,將會有 些不同。 右圖中的Prj1專案中, 擁有二個表單F1與F2, 以及兩個一般模組檔 S1.bas與S2.bas, 並且使用Public與 Private宣告程序。

12.3:多模組設計 【說明】: 1. 上圖中,Prj1專案包含2個表單模組(簡稱表單)、2個一般模組。 2. 表單模組可以撰寫事件程序與一般程序;一般模組只能撰寫一般程序。 3. 不同模組的程序名稱可以相同,但同一模組內的程序名稱則不可重複。 4. 呼叫同一模組的Sub或Function程序,不論程序是Public還是Private,都具有最高優先被呼叫權。 【例如】:在F1.frm表單中呼叫pro1程序(即Call pro1),被呼叫且會執行的程序將會是F1.frm表單的pro1程序,而不是一般模組S1.bas的pro1程序。為了避免造成程式設計師及日後維護者的不便,最好還是不要取相同的程序名稱。 5. 只有以Public宣告的程序(無論是事件程序或一般程序),才能被其他模組的程式呼叫。

12.3:多模組設計 6. 若要呼叫其他表單的程序,則必須註明表單名稱。 【例如】: 在F2.frm表單中執行『Call F1.pro1』,則會執行F1.frm表單的pro1程序(因為該程序被宣告為Public)。 在F1.frm表單中執行『Call F2.pro3』,則不會執行F2.frm表單的pro3程序(因為該程序不是宣告為Public)。 7. 若不同的一般模組中,出現使用Public且名稱相同的程序,則呼叫時必須註明一般模組名稱。 【例如】:在F2.frm表單中執行『Call S2.pro4』,則會執行一般模組S2的pro4程序,而不會執行一般模組S1的pro4程序。

12.3:多模組設計 多模組的宣告變數、常數、陣列的宣告 當一個專案包含多個模組程式時,就有可能必須將資料指定給不同模組的變數或陣列,或者使用不同模組的變數來處理資料。不同模組的變數宣告方式與有效範圍略有不同,我們以下圖來加以說明。

12.3:多模組設計 【說明】: 1. 變數不一定需要宣告,就可以直接拿來使用。不過,培養宣告變數的習慣對於開發大型程式時,將可以避免偵錯的麻煩。而且變數如果未經宣告,雖然在同一模組內也可以使用,但是卻無法跨模組使用。或許您已經習慣了不宣告變數就直接使用變數,而難以改掉這個習慣,不過沒關係,您只要在模組的宣告區最前面加入『Option Explicit』敘述,如此一來,當您未宣告變數就直接使用變數時,Visual Basic IDE就會出現錯誤訊息來提醒您。 2. 變數、常數、陣列的程序有效範圍: 在程序內宣告變數可以使用Dim或Static宣告;宣告陣列則用Dim、ReDim及Static宣告;常數可以用Const,但這些宣告方式的有效範圍僅僅侷限在該程序內。我們將這些變數稱為『程序範圍變數』。 【範例】: 【範例】:上圖中表單1的Form_Activate程序中宣告了變數Num2、表單2的Form_Activate程序中宣告了變數var2、及一般模組S1.bas的pro1程序中宣告了變數var4。 Dim arrayA(10) As Integer '宣告大小固定的整數陣列 Static average(10) As Integer '宣告靜態陣列 ReDim score(10) As Integer '宣告動態陣列 Const PI=3.14 '宣告常數符號

12.3:多模組設計 3. 變數、陣列、常數的模組有效範圍: 在模組的變數宣告區中若使用Dim宣告變數及陣列,或使用Const宣告常數,則該模組的任何程序都可以使用這些變數、陣列與常數。這些變數則稱為『模組範圍變數』。 【範例】:上圖中一般模組S1.bas的變數Num2,即為一般模組S1.bas的模組範圍變數(該模組的任何程序皆可使用)。表單1的變數str1則為F1.frm表單模組的模組範圍變數(該模組的任何程序皆可使用)。 4. 變數、陣列、常數的專案有效範圍: 變數在其隸屬模組的變數宣告區中,若使用Public宣告,或陣列及常數在一般模組的變數宣告區中分別使用Public及Public Const宣告,則有效範圍達整個專案,所有該專案之下的模組皆可取用這些變數、陣列、常數。我們將這些變數稱為『專案範圍變數』。 【範例】: 【範例】:上圖中表單1的變數Num1,表單2的變數var1及一般模組的變數var3都是專案範圍的變數。(所有模組的程序皆可使用) Public score(10) As Integer '宣告專案範圍的陣列 Public Const PI=3.14159 '宣告專案範圍的常數符號

12.3:多模組設計 5. 若變數的名稱相同但有效範圍不同時,則較接近的變數(有效區域較小的變數)會優先使用。 6. 若要使用其他表單模組的專案範圍變數時,則必須加上模組名稱: 【範例】:表單1 Sub Form_Activate中的Print F2.var1,即在F1模組中使用F2模組的var1變數(該變數必須使用Public宣告)。 7. 若要使用其他一般模組的專案範圍變數時,雖然不用加上模組名稱。但如果同時出現名稱相同且區域較小的有效變數或在其他一般模組內也出現名稱相同的有效變數,則使用時仍必須加上模組名稱: 【範例】:在表單2的Form_Activate程序中Print var3,則代表使用一般模組 (S1.bas)的var3專案範圍變數(該變數必須使用Public宣告)。 8. 若在程序中使用static宣告變數,則該變數為靜態變數,也就是當離開程序後,該變數值仍被保留直到整個應用程式執行完畢。 【範例】:表單2的Form_Activate程序中的var2為靜態變數。 9. 若宣告程序名稱時加上Static,則該程序內所有的區域變數都會變成靜態變數。 【範例】:一般模組(S1.bas)的Static Sub pro1內的var4為靜態變數。

12.3:多模組設計 建立多模組專案 建立多模組專案,代表該專案中包含不只一個表單或者包含一般模組。以下,我們直接來看看如何在專案中建議多模組程式設計。 建立新的表單(第二個以上的表單) 每一個專案都預設有一個表單檔,若您還想要建立其他的新表單,則有兩個方法: 方法一:執行【專案/新增表單】指令。 方法二:直接按下 新增表單快捷鈕。 新建立的表單將會依序是「Form2」、「Form3」、「Form4」、、(可更改)。其檔案格式為表單模組檔『.frm』。並且新建立表單的操作(設定屬性值和建立控制項)皆與表單「Form1」相同。

12.3:多模組設計 建立一般模組 建立一般模組,則只要執行【專案/新增模】指令即可。 新建立的「一般模組」名稱依序為「Module1」、「Module2」、、(可更改),檔案格式為一般模組檔『.bas』。您若想要更改一般模組的名稱,則可以先執行【檢視/屬性視窗】指令,在屬性視窗中重新設定「Name」屬性值即可。 通常我們會在一般模組中放置該專案所有表單或模組會用到的共用函數、程序或變數,不過請記得,宣告這些函數、程序、變數之前必須加上Public 關鍵字,例如下列範例 Public Function Add(X As Integer, Y As Integer) As Integer Add = A + B End Function

12.3:多模組設計 載入與刪除『表單檔』、『一般模組檔』 一般模組檔可能包含許多您常常會用到的函數與程序,例如:具有排序功能的程序。因此,我們不必在每開發一個專案時重新撰寫這些函數與程序,只需要將該模組檔載入新建立的專案即可。 要載入一個已存在的表單檔或一般模組檔,只要執行【專案/新增檔案】指令,將該模組檔加入到專案中即可。 由於加入模組檔是如此地簡單,因此我們應該將自行發展的函數與程序分類,存放於不同的模組檔中,等待開發的專案有需要時,直接載入即可,如此一來,就可以大幅減少開發程式的時間。 若要從專案中移走表單檔或一般模組檔,則只要先在專案視窗中選擇該檔,然後執行【專案/移除XXX】指令,XXX表單檔或一般模組檔就會從該專案消失。

12.3:多模組設計 程式起點的設定 Visual Basic專案中若包含有表單,則會以第一個建立的表單當做程式的起始表單。由於模組是用來存放程式碼的地點,因此在Visual Basic專案中至少要有一個模組。 若我們的程式不需要使用任何表單時(例如:該程式只要與印表機連結並設定一些印表機的初始狀態,因此不需要讓使用者看到任何執行過程與結果),則可以將系統自動建立的Form1表單移除,然後建立至少一個一般模組檔,並且將其中一個程序命名為Main()程序,則Visual Basic就會從Main程序開始執行。例如下面的範例會在程式執行時產生3次的嗶聲,然後結束程式(不會產生任何表單)。 由上述可知,Visual Basic程式 預設將由第一個表單或一般模 組的Main程序開始執行。 不過我們也可以自行設定程式 的起始執行點。請按照課本 12-11頁操作: Sub Main ()  Dim I As Integer For I = 1 To 3 Beep Next I End Sub

12.3:多模組設計 與多模組設計有關的敘述與方法 載入表單 【語法說明】: Load敘述會將表單載入到記憶體,但不會將表單顯示在螢幕上。將表單載入後,則可以讀取、設定或修改表單的各種屬性值。 Load敘述不但可以載入表單,也可以載入控制項。您只要將表單名稱改為控制項名稱即可。 語法:Load 表單名稱 功能:將指定的表單檔載入記憶體中

12.3:多模組設計 刪除表單 【語法說明】: 一但使用Unload敘述將表單從記憶體中釋放後,若要再使用到該表單則必須重新使用Load敘述將表單載入。 Unload敘述也可以用來刪除控制項。 Me是用來代表目前的表單,例如:『Unload Me』敘述會將目前的表單刪除。 語法:Unload 表單名稱 功能:釋放表單檔所佔用的記憶體空間

12.3:多模組設計 顯示表單 【語法說明】: 表單不一定要先載入到記憶體,若表單尚未在入記憶體就執行Show方法,則系統會自動先將表單載入到,再執行Show方法將表單顯示出來。 style參數: 參數值為0(預設值):顯示的表單可與其它表單同時存在。也就是使用者可以自由切換每一個表單。 參數值為1:只顯示指定的表單,使用者不可切換到其它的表單,除非先將指定的表單關閉。 語法:[表單名稱.]Show [style] 功能:顯示表單

12.3:多模組設計 隱藏表單 【語法說明】: 執行Hide方法,只讓將表單隱藏起來不顯示在螢幕上,但實際上表單並未從記憶體中刪除,因此程式仍然可以取得與設定該表單的屬性值,只是使用者無法操作表單上的控制項。 若該表單不需要再被使用,應該使用Unload敘述完全刪除表單,如此一來就可以節省記憶體。若只是隱藏表單,則無法節省記憶體。(雖然兩種方法對於使用者而言感覺上並無差別) 當表單被隱藏時,其Visible屬性被設為False。(直接設定表單的Visible屬性,也是另一種隱藏表單的方法) 語法:[表單名稱.]Hide 功能:隱藏表單

12.3:多模組設計 多模組程式設計 【實作範例12-1】: 使用兩個表單以及一個一般模組設計排序與搜尋應用程式。 上機實作 Step1:專案名稱為『p12_01』。 Step2:建立兩個表單。在表單上產生下列控制項並設定屬性。 Step3:編輯程式碼。

【實作範例12-1】 Sort_Search_Service.bas 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 Public ArrayUnSorted(1 To 8) As Integer Public ArraySorted(1 To 8) As Integer Public Sub BubbleSort(NotSortX() As Integer, SortX() As Integer) For i = LBound(NotSortX) To UBound(NotSortX) SortX(i) = NotSortX(i) Next i n = UBound(SortX) K = n Do While (K <> 0) Times = 0 For i = LBound(SortX) To K - 1 If SortX(i) > SortX(i + 1) Then Temp = SortX(i) 'SortX(i)與SortX(i+1)互換 SortX(i) = SortX(i + 1) 'SortX(i)與SortX(i+1)互換 SortX(i + 1) = Temp 'SortX(i)與SortX(i+1)互換 Times = i End If K = Times Loop End Sub

【實作範例12-1】 Sort_Search_Service.bas 29 30 31 32 33 34 35 36 37 38 39 40 41 Public Function SeqSearch(Data() As Integer, ByVal K As Integer) As Integer find_flag = False For i = LBound(Data) To UBound(Data) If K = Data(i) Then SeqSearch = i find_flag = True Exit For End If Next i If Not (find_flag) Then SeqSearch = -1 End Function

【實作範例12-1】 Sort_Search_Service.bas 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 Public Function BinarySearch(X() As Integer, ByVal K As Integer) As Integer Low = LBound(X) Upper = UBound(X) Do While (Low <= Upper) m = Int((Low + Upper) / 2) '計算中間位置 Select Case X(m) Case Is > K 'K位於上半部 Upper = m - 1 Case Is < K 'K位於下半部 Low = m + 1 Case Is = K '找到了 BinarySearch = m Exit Function End Select Loop BinarySearch = -1 End Function

【實作範例12-1】 f12_01_a.frm 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 '********************************************** '******** f12_01_a.frm(選擇服務項目) ******** Public sorted Private Sub cmdEnd_Click() End End Sub Private Sub cmdRun_Click() If optService(0).Value = True Then Call BubbleSort(ArrayUnSorted(), ArraySorted()) sorted = True Call ShowSortResult Else Call f12_01_b.SortService f12_01_b.Show 1 End If

【實作範例12-1】 f12_01_a.frm 21 22 23 24 25 26 27 28 29 30 31 32 33 34 Private Sub Form_Activate() ArrayUnSorted(1) = 63: ArrayUnSorted(2) = 33: ArrayUnSorted(3) = 41 ArrayUnSorted(4) = 86: ArrayUnSorted(5) = 79: ArrayUnSorted(6) = 52 ArrayUnSorted(7) = 54: ArrayUnSorted(8) = 74 sorted = False End Sub Private Sub ShowSortResult() lblData.Caption = "" For i = LBound(ArraySorted) To UBound(ArraySorted) lblData.Caption = lblData.Caption & "sort(" & i & ")=" & _ ArraySorted(i) & vbCrLf Next i

【實作範例12-1】 f12_01_b.frm 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 '********************************************** '******** f12_01_b.frm(選擇搜尋方法) ******** Public Sub SortService() If f12_01_a.sorted = True Then optSearchService(1).Enabled = True optSearchService(1).Value = True Else optSearchService(1).Enabled = False End If End Sub Private Sub cmdClose_Click() Unload f12_01_b

【實作範例12-1】 f12_01_b.frm 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 Private Sub cmdSearch_Click() If optSearchService(0).Value = True Then If f12_01_a.sorted = True Then Location = BinarySearch(ArraySorted(), Val(txtTarget.Text)) Else Location = SeqSearch(ArrayUnSorted(), Val(txtTarget.Text)) End If If Location <> -1 Then lblData = txtTarget.Text & "位於排序後的第" & Location & "個位置" lblData = txtTarget.Text & "位於排序前的第" & Location & "個位置" lblData.Caption = "找不到" + txtTarget.Text End Sub

12.4:多專案操作 開發這些大型程式時,通常我們不會將所有的功能整合在單獨一個程式中,反而會採用組合應用程式的設計理念,將完整的需求切割為許多的小功能,個別獨立寫成一個單元(我們可以稱這些單元為組合元件),再整合在一起。 如此做的好處在於,若將來開發應用程式需要使用相同功能時,我們只要將已經寫好的組合元件加入程式中,就不用重新發開程式。並且每一個小單元還可以分交給不同的程式設計師分工進行設計,如此一來,不但可以縮短程式開發的時間,而且更加符合經濟效益。(不同的組合方式可以完成不同的大型軟體,應付客戶類似但卻不同的需求) Visual Basic 6為了讓專案經理或資深程式設計師能夠更輕易地完成元件的組合,因此在專案總管中特別加入了多專案管理的功能。 通常專案經理或資深程式設計師會將客戶的需求切割為許多個小專案,並將這些專案分別交給手下的程式設計師分別完成。最後再由專案經理或資深程式設計師將這些分別設計的專案在Visual Basic IDE中整合起來,進行測試、編譯、執行,最終完成整個客戶需要的大型軟體。

12.4:多專案操作 新增專案 【實作範例12-2:part1】: 正常啟動Visual Basic 6.0時,系統只會提供一個專案(預設名稱為Project1),如果我們希望在加入其它專案的話,則可以執行【檔案/新增專案】指令,就會依序出現Project2、Project3、、、等新的專案,同時在專案總管處也會變成專案群組-Group1。 每一個專案都會有一個預設的表單,名稱則為Form1。以下這個範例將實際示範如何在Visual Basic IDE中建立多專案。 【實作範例12-2:part1】: 在初始專案外,再新增一個專案(一共2個專案),並練習檢視兩個專案的表單及程式碼編輯視窗。 請按照課本12-23,12-24頁操作。

12.4:多專案操作 專案的編輯與執行 專案總管中的每一個專案可以分別來加以編輯,並且會個別編譯為可執行檔,編輯與編譯請參閱第二章說明。 Visual Basic預設執行時會執行第一個專案,如果想要指定執行/編譯的專案,則以執行【設為啟動專案】指令加以完成,如下圖所示。 2:執行【設為啟動專案】指令。 往後若進行執行或編譯工作, 則Visual Basic會執行與編譯 Project2,而不是Project1。 1:選取要執行的專案 ,然後按下滑鼠右鍵。

12.4:多專案操作 移除專案 【實作範例12-2:part1】: 移除Project2專案。 請按照課本12-26頁操作。

12.4:多專案操作 MDI開發環境與專案存檔 【實作範例12-3】: 由於我們在第二章就已經將Visual Basic IDE設為SDI開發環境下,所有在開發多專案的時候,常常不容易在作區中看不出哪一個表單是屬於哪一個專案所有,而只有在專案總管才能觀察目前選取的表單屬於哪一個專案所有(被選取表單在專案總管視窗中會反白)。 所以如果我們使用MDI開發環境來編輯多專案的開發就不會發生這種現象了,我們以範例來加以說明。 【實作範例12-3】: 使用MDI環境開發多專案,並且將專案分別存檔。 請按照課本12-27~12-32頁操作。

12.4:多專案操作 多專案的實用性 在Visual Basic 6.0專業版或企業版中,我們除了可以開發編譯成執行檔.exe的一般專案之外,還可以開發其他類型的專案,例如:ActiveX dll、ActiveX 控制項、、等等。這些類型的專案與一般專案不同,他們無法獨立成為可執行檔,只能將它們編譯為*.dll程式庫或 *.ocx控制項。通常在撰寫這些程式時,由於無法獨自執行,因此常常會加上一個測試用的一般專案,以便於測試這些程式庫或使用者自訂控制項的正確性,此時就需要使用多專案的開發模式了。 以多人合作開發的大型為例,專案負責人(專案經理、系統分析師或資深程式設計師)會將專案切割為許多小專案,並分配給開發小組的每一位程式設計師某些小專案,將這些小專案分別獨立開發,最後再整合起來成為大型專案。

12.4:多專案操作 問題是,如何整合小專案呢? 比較簡單的方法是將這些小專案分別編譯成可執行檔應用程式,然後主專案使用下一節介紹的Shell函式來呼叫這些應用程式,不過這種方法實在很遜又不專業,通常業界很少利用此方法開發大型專案,原因則是因為可執行檔專案必須獨自進行測試與編譯,萬一發現錯誤,就必須分別加以修改,然後再重新編輯成執行檔,接著又得再進行一次整體測試,如此一來,將拖垮整個專案的開發進度。 專業的做法應該先把將專案分成一個主專案以及許多子專案,主專案負責執行與使用其它子專案的程式庫與控制項,並且最後將被編譯為一個可執行檔,而其它子專案則會使用一般模組、表單、dll程式庫、ActiveX控制項、、、等方式製作。

12.4:多專案操作 對於製作主專案的設計師而言(通常是由系統分析師、資深程式設計師或專案經理親自擔綱),可以先假設所有的子專案皆已完成,然後撰寫主專案的程式及介面,當使用到子專案功能時,若該子專案尚未完成,就以簡單的『本功能尚未完成』訊息帶過,如此就不會影響整個專案進度與主程式基本功能的測試。 等到子專案完成時,只要加入專案群組中,並略為修正主程式原本顯示『本功能尚未完成』的訊息,改以呼叫子專案所開發的功能即可進行該功能的測試。 對於被分配到製作子專案的程式設計師而言,在交出成品之前,自己也應該對於子專案的功能加以測試,由於這些子專案可能是一些dll程式庫或ActiveX控制項,因此需要加入一個測試用的專案來加以測試,此時就可以在專案總管中加入簡單的測試專案,等到測試達到預期要求後,就可以將該子專案交給負責主程式的人員,進行與主專案的合併。

12.5:呼叫應用程式-Shell函數 有的時候,我們會希望程式可以呼叫其他的應用程式,此時可以透過Shell函數來完成。使用Shell函數呼叫的應用程式與原本使用Visual Basic開發的程式可以同時操作,並且互相不會產生影響,也就是關閉任何一個程式,另一個程式仍然可以繼續執行。 Shell函數 【語法說明】: 副檔名.exe可省略。 應用程式檔名可以使用字串變數儲存,若該應用程式與呼叫程式位於不同的磁碟與目錄,則需要加上磁碟機名稱與路徑。 語法:Shell("應用程式檔名.exe",w) 功能:以特定方式(由w參數決定)開啟可執行檔視窗。 回傳值:當呼叫成功,則會回傳應用程式的工作代碼,若不成功,則產生錯誤,無法繼續執行。

12.5:呼叫應用程式-Shell函數 w參數可以決定呼叫應用程式後,被啟動應用程式的視窗型態。

【實作範例12-4】 【實作範例12-4】: 上機實作 設計Windows 98應用程式的管理介面。 Step1:將專案名稱設為『p12_04』。 Step2:在表單上產生下列功能表。 Step3:撰寫程式碼。

【實作範例12-4】 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 Private Declare Function GetWindowsDirectory Lib "kernel32" Alias _ "GetWindowsDirectoryA" (ByVal lpBuffer As String, ByVal nSize As Long) As Long Dim SystemDir As String Function GetWindowsDir() As String Dim Temp As String Dim Ret As Long Temp = String(145, 0) Ret = GetWindowsDirectory(Temp, 145) '取得系統磁碟及目錄,即C:\WINNT Temp = Left(Temp, Ret) 'Temp="C:\WINNT" If Temp <> "" And Right(Temp, 1) <> "\" Then GetWindowsDir = Temp & "\" Else GetWindowsDir = Temp End If End Function Private Sub Form_Activate() SystemDir = GetWindowsDir() & "system32\" 'SystemDir="C:\WINNT\system32\" End Sub

【實作範例12-4】 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 Private Sub mnuBack_Click() ExeFile = SystemDir & "ntbackup.exe" RunOK = Shell(ExeFile, 1) End Sub Private Sub mnuCal_Click() ExeFile = SystemDir & "calc.exe" Private Sub mnuDiskClear_Click() ExeFile = SystemDir & "cleanmgr.exe" Private Sub mnuNotepad_Click() ExeFile = SystemDir & "notepad.exe" RunOK = Shell(ExeFile, 2)

【實作範例12-4】 程式說明: (1) 第22~24行:表單載入後自動執行,透過GetWindowsDir函數取得系統安裝目錄,即C:\WINNT\或D:\WINNT\…等等(視安裝系統於哪一個磁碟機而定),並與『system32\』字串連結為C:\WINNT\system32\或D:\WINNT\system32\…等等。由於Windows 2000 Server的四項應用程式皆位於該目錄下,因此在表單一開始執行時,先取得該目錄路徑。 (2) 第9~20行:GetWindowsDir函數中呼叫了GetWindowsDirectory函數,這是一個Windows API函數,所以必須在第4~5行宣告並引入支援GetWindowsDirectory API的kernel32.dll檔。 【Windows API】: Windows API(Application Programming Interface;應用程式介面)是一種函數庫;為了方便程式設計師在設計視窗程式時節省程式的開發時間,因此微軟將某些較常用或較低階的系統呼叫先撰寫成函數庫,程式設計師只要直接呼叫Windows API函數庫的函數,就可以完成某些特定工作。在Visual Basic中使用Windows API提供的函數,首先必須先宣告API函數(例如指定DLL檔名),然後才可以在程式中呼叫這些函數。

【實作範例12-4】 (3) 第31~34行:開啟Windows 2000 Server的小算盤應用程式,並將停駐點移到小算盤應用程式。 【註】: 本範例若非於Windows 2000執行,可能會出現路徑錯誤而導致找不到執行檔的錯誤。這是因為其他作業系統,不一定將小算盤等應用程式,放置於system32目錄下,例如Windows 98的小算盤執行檔位於C:\Windows\目錄下。 Step4:執行程式。

【實作範例12-4】 1:執行【附屬應用程式/小算盤】指令 2:系統自動開啟 WINNT\system32\calc.exe 小算盤應用程式

12.6:本章回顧 Visual Basic的檔案類型 模組(Module) 多模組設計 多專案操作 呼叫應用程式-Shell函數 App.Path Windows API

本章習題