Visual Basic 應(yīng)用程序的結(jié)構(gòu)
一個(gè)應(yīng)用程序?qū)嶋H上無非是指揮計(jì)算機(jī)完成任務(wù)的指令集。應(yīng)用程序的結(jié)構(gòu)是組織指令的方法,也就是指令存放的位置和指令的執(zhí)行順序。
典型的 "hello world" 例子以及諸如此類的簡單應(yīng)用程序都具有簡單結(jié)構(gòu)。對于只有一行的代碼來說,組織結(jié)構(gòu)并不十分重要。但應(yīng)用程序越復(fù)雜,對組織或結(jié)構(gòu)的要求也就越明顯。試想一下,如果允許應(yīng)用程序以隨機(jī)順序去執(zhí)行,那將會帶來什么樣的混亂。除了對應(yīng)用程序的執(zhí)行進(jìn)行控制外,如何在應(yīng)用程序中輕松查找特定指令,結(jié)構(gòu)也起著很重要的作用。
由于 Visual Basic 應(yīng)用程序是基于對象的,所以應(yīng)用程序的代碼結(jié)構(gòu)就是該程序在屏幕上物理表示的模型。根據(jù)定義,對象包含數(shù)據(jù)和代碼。在屏幕上看到的窗體代表屬性,這些屬性定義了窗體的外觀和內(nèi)在特性。應(yīng)用程序中的每個(gè)窗體都有一個(gè)包含其代碼的相關(guān)的窗體模塊(文件擴(kuò)展名為 .frm)。
每個(gè)窗體模塊都包含事件過程,即代碼部分,其中有為響應(yīng)特定事件而執(zhí)行的指令。窗體可包含控件。在窗體模塊中,對窗體上的每個(gè)控件都有一個(gè)對應(yīng)的事件過程集。除了事件過程,窗體模塊還可包含通用過程,它對來自任何事件過程的調(diào)用都作出響應(yīng)。
可將那些與特定窗體或控件無關(guān)的代碼放入另一類型的模塊——標(biāo)準(zhǔn)模塊(文件擴(kuò)展名為 .BAS )中。一個(gè)過程可能用來響應(yīng)幾個(gè)不同對象中的事件,應(yīng)該將這個(gè)過程放在標(biāo)準(zhǔn)模塊中,而不應(yīng)在每一個(gè)對象的事件過程中重復(fù)相同的代碼。
用類模塊(文件擴(kuò)展名為 .CLS )創(chuàng)建對象,這些對象可被應(yīng)用程序內(nèi)的過程調(diào)用。標(biāo)準(zhǔn)模塊只包含代碼,而類模塊既包含代碼又包含數(shù)據(jù),可視為沒有物理表示的控件。
在第四章“工程的管理”中敘述了哪些部件可以添加到應(yīng)用程序中,本章將說明如何將代碼寫到構(gòu)成應(yīng)用程序的各種部件中。按照缺省規(guī)定,工程包含的窗體模塊??筛鶕?jù)需要另行添加窗體、類和標(biāo)準(zhǔn)模塊。第九章“用對象編程”將討論類模塊。
事件驅(qū)動應(yīng)用程序的工作方式
事件是窗體或控件識別的動作。在響應(yīng)事件時(shí),事件驅(qū)動應(yīng)用程序執(zhí)行 Basic代碼。Visual Basic 的每一個(gè)窗體和控件都有一個(gè)預(yù)定義的事件集。如果其中有一個(gè)事件發(fā)生,而且,在關(guān)聯(lián)的事件過程中存在代碼,則 Visual Basic 調(diào)用該代碼。
盡管 Visual Basic 中的對象自動識別預(yù)定義的事件集,但要判定它們是否響應(yīng)具體事件以及如何響應(yīng)具體事件則是編程的責(zé)任了。代碼部分(即事件過程)與每個(gè)事件對應(yīng)。 想讓控件響應(yīng)事件時(shí),就把代碼寫入這個(gè)事件的事件過程之中。
對象所識別的事件類型多種多樣,但多數(shù)類型為大多數(shù)控件所共有。例如,大多數(shù)對象都能識別 Click 事件——如果單擊窗體,則執(zhí)行窗體的單擊事件過程中的代碼;如果單擊命令按鈕,則執(zhí)行命令按鈕的Click 事件過程中的代碼。每個(gè)情況中的實(shí)際代碼幾乎完全不一樣。
這里是事件驅(qū)動應(yīng)用程序中的典型事件序列:
1. 啟動應(yīng)用程序,裝載和顯示窗體。
2. 窗體(或窗體上的控件)接收事件。事件可由用戶引發(fā)(例如鍵盤操作),可由系統(tǒng)引發(fā)(例如定時(shí)器事件),也可由代碼間接引發(fā)(例如,當(dāng)代碼裝載窗體時(shí)的 Load 事件)。
3. 如果在相應(yīng)的事件過程中存在代碼,就執(zhí)行代碼。
4. 應(yīng)用程序等待下一次事件。
注意 許多事件伴隨其它事件發(fā)生。例如,在 DblClick 事件發(fā)生時(shí),MouseDown、MouseUp 和 Click 事件也會發(fā)生。
一個(gè)應(yīng)用程序?qū)嶋H上無非是指揮計(jì)算機(jī)完成任務(wù)的指令集。應(yīng)用程序的結(jié)構(gòu)是組織指令的方法,也就是指令存放的位置和指令的執(zhí)行順序。
典型的 "hello world" 例子以及諸如此類的簡單應(yīng)用程序都具有簡單結(jié)構(gòu)。對于只有一行的代碼來說,組織結(jié)構(gòu)并不十分重要。但應(yīng)用程序越復(fù)雜,對組織或結(jié)構(gòu)的要求也就越明顯。試想一下,如果允許應(yīng)用程序以隨機(jī)順序去執(zhí)行,那將會帶來什么樣的混亂。除了對應(yīng)用程序的執(zhí)行進(jìn)行控制外,如何在應(yīng)用程序中輕松查找特定指令,結(jié)構(gòu)也起著很重要的作用。
由于 Visual Basic 應(yīng)用程序是基于對象的,所以應(yīng)用程序的代碼結(jié)構(gòu)就是該程序在屏幕上物理表示的模型。根據(jù)定義,對象包含數(shù)據(jù)和代碼。在屏幕上看到的窗體代表屬性,這些屬性定義了窗體的外觀和內(nèi)在特性。應(yīng)用程序中的每個(gè)窗體都有一個(gè)包含其代碼的相關(guān)的窗體模塊(文件擴(kuò)展名為 .frm)。
每個(gè)窗體模塊都包含事件過程,即代碼部分,其中有為響應(yīng)特定事件而執(zhí)行的指令。窗體可包含控件。在窗體模塊中,對窗體上的每個(gè)控件都有一個(gè)對應(yīng)的事件過程集。除了事件過程,窗體模塊還可包含通用過程,它對來自任何事件過程的調(diào)用都作出響應(yīng)。
可將那些與特定窗體或控件無關(guān)的代碼放入另一類型的模塊——標(biāo)準(zhǔn)模塊(文件擴(kuò)展名為 .BAS )中。一個(gè)過程可能用來響應(yīng)幾個(gè)不同對象中的事件,應(yīng)該將這個(gè)過程放在標(biāo)準(zhǔn)模塊中,而不應(yīng)在每一個(gè)對象的事件過程中重復(fù)相同的代碼。
用類模塊(文件擴(kuò)展名為 .CLS )創(chuàng)建對象,這些對象可被應(yīng)用程序內(nèi)的過程調(diào)用。標(biāo)準(zhǔn)模塊只包含代碼,而類模塊既包含代碼又包含數(shù)據(jù),可視為沒有物理表示的控件。
在第四章“工程的管理”中敘述了哪些部件可以添加到應(yīng)用程序中,本章將說明如何將代碼寫到構(gòu)成應(yīng)用程序的各種部件中。按照缺省規(guī)定,工程包含的窗體模塊??筛鶕?jù)需要另行添加窗體、類和標(biāo)準(zhǔn)模塊。第九章“用對象編程”將討論類模塊。
事件驅(qū)動應(yīng)用程序的工作方式
事件是窗體或控件識別的動作。在響應(yīng)事件時(shí),事件驅(qū)動應(yīng)用程序執(zhí)行 Basic代碼。Visual Basic 的每一個(gè)窗體和控件都有一個(gè)預(yù)定義的事件集。如果其中有一個(gè)事件發(fā)生,而且,在關(guān)聯(lián)的事件過程中存在代碼,則 Visual Basic 調(diào)用該代碼。
盡管 Visual Basic 中的對象自動識別預(yù)定義的事件集,但要判定它們是否響應(yīng)具體事件以及如何響應(yīng)具體事件則是編程的責(zé)任了。代碼部分(即事件過程)與每個(gè)事件對應(yīng)。 想讓控件響應(yīng)事件時(shí),就把代碼寫入這個(gè)事件的事件過程之中。
對象所識別的事件類型多種多樣,但多數(shù)類型為大多數(shù)控件所共有。例如,大多數(shù)對象都能識別 Click 事件——如果單擊窗體,則執(zhí)行窗體的單擊事件過程中的代碼;如果單擊命令按鈕,則執(zhí)行命令按鈕的Click 事件過程中的代碼。每個(gè)情況中的實(shí)際代碼幾乎完全不一樣。
這里是事件驅(qū)動應(yīng)用程序中的典型事件序列:
1. 啟動應(yīng)用程序,裝載和顯示窗體。
2. 窗體(或窗體上的控件)接收事件。事件可由用戶引發(fā)(例如鍵盤操作),可由系統(tǒng)引發(fā)(例如定時(shí)器事件),也可由代碼間接引發(fā)(例如,當(dāng)代碼裝載窗體時(shí)的 Load 事件)。
3. 如果在相應(yīng)的事件過程中存在代碼,就執(zhí)行代碼。
4. 應(yīng)用程序等待下一次事件。
注意 許多事件伴隨其它事件發(fā)生。例如,在 DblClick 事件發(fā)生時(shí),MouseDown、MouseUp 和 Click 事件也會發(fā)生。