Presentation is loading. Please wait.

Presentation is loading. Please wait.

Demo-dataSource與DropDownList

Similar presentations


Presentation on theme: "Demo-dataSource與DropDownList"— Presentation transcript:

1 Demo-dataSource與DropDownList
CH04 Demo-dataSource與DropDownList

2 副程式與模組 副程式和參數 當系統的架構越來越大,程式碼越來越多之後,開發人員陸續的發現到,有相當多的程式碼其實可以重複使用,藉由『副程式』或『函式』的建立,同樣一段程式碼,可以帶入不同的『參數』,就能夠重複的被使用在各種場合和不同的程式碼中。 系統內建的函式 .NET Framework本身內建了相當多豐富的系統函式(或是副程式)提供程式設計師使用: EX: CH04-19\Module1.vb Sub Main() '刪除 C:\abc.txt 檔案 System.IO.File.Delete("C:\abc.txt") Console.WriteLine("檔案已經刪除!") Console.ReadKey() End Sub 例如,您可以透過『System.IO.File.Delete』,來刪除硬碟中某個指定的檔案,底下的C:\abc.txt,我們稱之為『參數』:

3 副程式與模組 這些系統函式讓開發人員可以不需要親自撰寫所有的程式碼,只需要透過簡單的指令,就可以達成需要的功能。
當然,這些功能都是透過其他程式設計師事先撰寫好的程式碼來完成的,透過.NET Framework,我們只需要叫用這些副程式或是函式即可完成所需的功能。 我們在後面會陸續介紹(並使用到)相當多的.NET內建函式,當您在撰寫程式時,可以在程式碼輸入區鍵入: 您會發現系統自動跳出許多函式可供選擇和使用,其實很多函式您不需要自行撰寫,在.NET Framework中早已經內建。這也是透過.NET Frameowork撰寫程式的好處,您有相當強大的類別程式庫(Class Library)作為撰寫程式的後盾。

4 副程式與模組 在程式碼當中建立副程式 '副程式 Sub MySubA() Dim dt As Date '取得現在時間
EX:CH04-01 '副程式 Sub MySubA() Dim dt As Date '取得現在時間 dt = System.DateTime.Now.ToString '顯示 Console.WriteLine(dt) End Sub 請注意,副程式需要有一個名字,命名規則與變數相同。 叫用.NET本身提供的系統函式,來取得時間 顯示目前的時間。

5 副程式與模組 在程式碼當中使用剛才建立好的副程式 '主程式 Sub Main() '顯示
EX:CH04-01 '主程式 Sub Main() '顯示 Console.WriteLine("Hello") '呼叫副程式 Call MySubA() Console.WriteLine("How are you?") '暫停 Console.ReadKey() End Sub 利用Call指令來呼叫剛才建立好的副程式

6 副程式與模組 程式碼執行的順序 利用Call指令來呼叫剛才建立好的副程式

7 副程式與模組 程式碼執行的順序 利用Call指令來呼叫剛才建立好的副程式 這行就是透過副程式顯示出來的

8 這樣的一個程式區塊(從Sub…到End Sub),就被稱為『副程式』。這個副程式,則可以在其他的程式碼當中被呼叫
副程式與模組 副程式結構 EX:CH04-01 '副程式 Sub MySubA() Dim dt As Date '取得現在時間 dt = System.DateTime.Now.ToString '顯示 Console.WriteLine(dt) End Sub 這樣的一個程式區塊(從Sub…到End Sub),就被稱為『副程式』。這個副程式,則可以在其他的程式碼當中被呼叫

9 副程式與模組 在程式碼當中建立函式 Function的寫法
Function Max(ByVal a As Integer, ByVal b As Integer) As Integer If a > b Then Return a End If If a < b Then Return b '如果兩者相等,則傳回 Return 0 End Function Function也要有名字 請特別注意,Function需要指定回傳值的型別 這邊設定的叫做『參數』 Return指令用來結束Function並把值傳回 Function與Subroutine有一個很大的不同,是Function可以具有傳回值的,而Subroutine則沒有。和Subroutine不同的,則是Function需要指定『回傳值的型別』,也就是最後面的As Integer … As Integer

10 副程式與模組 函式的 回傳型別 與 參數 Function Max(ByVal a As Integer, ByVal b As Integer) As Integer 請特別注意,Function需要有回傳值的型別   前面我們強調,Function是會有傳回值的,因此這邊指定的型別,是該Function最後要回傳給主程式的回傳值型別。 Function Max(ByVal a As Integer, ByVal b As Integer) As Integer 參數可以有多個,以逗號隔開,每個參數都要有型別 參數是指,當主程式要呼叫這個Function時,需要傳入的運算用資料,目的是為了讓同樣一段副程式或是函式,可以用同一種邏輯處理類似的運算。不論您是使用副程式(Subroutine)或是函式(Function),都可以加入參數,只是剛才我們介紹副程式的時候沒有使用而已。

11 副程式與模組 呼叫函式 上例中的這個函式,主要的功能是取得兩個整數中,那一個較大,因此呼叫時需要傳入兩個參數,傳入的參數,可以是變數的形式:
Dim n1, n2 As Integer Dim ret As Integer ret = Max(n1, n2) 也可以是這樣: Dim ret As Integer ret = Max(35, 73) 傳入Max這個Function的參數,可以是變數,也可以是常數。 由於Function會有回傳值,因此您必須建立一個變數來『接收回傳值』: ret = Max(35, 73)

12 Demo-dataSource與DropDownList
實例演練 建立一個函式,讓使用者輸入圓的的半徑,該函式就傳回圓的面積 提示: 假設半徑為 r,則圓面積的計算公式為:r*r* Demo-dataSource與DropDownList

13 副程式與模組 傳址呼叫(ByRef) 與 傳值呼叫(ByVal )
Function Swap(ByRef n1 As Integer, ByRef n2 As Integer) As Integer ByRef為傳址呼叫

14 副程式與模組 傳址呼叫(ByRef) Sub Main() Dim a, b As Integer a = 10 b = 20
EX:CH04-06 Sub Main() Dim a, b As Integer a = 10 b = 20 Swap(a, b) Console.WriteLine("變數a:" & a) Console.WriteLine("變數b:" & b) Pause() End Sub Function Swap(ByRef n1 As Integer, ByRef n2 As Integer) As Integer Dim c As Integer c = n1 n1 = n2 n2 = c End Function 主程式呼叫Swap時,以ByRef方式來傳入a,b兩個參數… 請注意,以ByRef傳入的n1,n2參數,就是主程式中的a,b,不只是接收a,b的值,是完全等於a,b

15 透過這樣的方式,我們可以一次回傳兩個值回主程式,也可以達成Swap函式需要的效果,而這個是ByVal傳遞方式無法做到的
副程式與模組 傳址呼叫(ByRef) EX:CH04-06 Sub Main() Dim a, b As Integer a = 10 b = 20 Swap(a, b) Console.WriteLine("變數a:" & a) Console.WriteLine("變數b:" & b) Pause() End Sub Function Swap(ByRef n1 As Integer, ByRef n2 As Integer) As Integer Dim c As Integer c = n1 n1 = n2 n2 = c End Function 透過這樣的方式,我們可以一次回傳兩個值回主程式,也可以達成Swap函式需要的效果,而這個是ByVal傳遞方式無法做到的

16 副程式與模組 傳址呼叫(ByRef) 與 傳值呼叫(ByVal )
Function Swap(ByRef n1 As Integer, ByRef n2 As Integer) As Integer ByRef為傳址呼叫 ByRef的觀念,您可以想像成,當主程式呼叫副程式的時候,把自己的變數本身一起傳過去給副程式用了; 而ByVal則是,當主程式呼叫副程式的時候,把自己變數內的值給副程式用,但原本主程式中的變數則不受副程式的影響。

17 副程式與模組 Optional關鍵字 Function add(ByVal a As Integer, Optional ByVal b As Integer = 0) 以此關鍵字修飾的參數被定義後,主程式在呼叫該函數時,可以省略此參數

18 副程式與模組 Optional關鍵字 Sub Main() Dim a As Integer
EX:CH04-09 Sub Main() Dim a As Integer a = add(5) '只傳入一個參數也不會發生錯誤,回傳值為回傳值為5 MsgBox(a) a = add(5, 10) '回傳值為15 End Sub '將a,b兩個參數相加並傳回,如果沒有傳入b參數,則預設為 Function add(ByVal a As Integer, Optional ByVal b As Integer = 0) Return a + b End Function 因為「Optional」修飾字的關係,就算在呼叫add這個Function時,沒有填入參數b值也不會有錯誤訊息

19 副程式與模組 變數的存留期與存取範圍 變數的『存留期』,是指變數在記憶體當中佔有的時間,從什麼時候開始到什麼時候結束。
變數的『存取範圍』,則是指程式碼中可以存取特定變數的範圍。 『全域變數』與『區域變數』 全域變數指的是在程式的任何範圍都存取的到的變數:

20 副程式與模組 0018: n = Console.ReadLine() 0001: '這是全域變數 0019: Return n
請注意這個變數宣告在主程式Sub Main()的外面,稱之為全域變數。 EX:CH04-09 0001: '這是全域變數 0002: Dim UserName As String 0003: '主程式 0004: Sub Main() 0005: UserName = GetUserName() 0006: '顯示 0007: ShowWelcome() 0008: '暫停 0009: Pause() 0010: End Sub 0011: 0012: '取得使用者名稱 0013: Function GetUserName() 0014: '這是區域變數 0015: Dim n As String 0016: 0017: Console.Write("請輸入您的名稱:") EX:CH04-09 0018: n = Console.ReadLine() 0019: Return n 0020: End Function 0021: 0022: '顯示歡迎訊息 0023: Sub ShowWelcome() 0024: Console.WriteLine(UserName & "您好,歡迎您來到本系統") 0025: End Sub 0026: 0027: '暫停 0028: Sub Pause() 0029: Console.WriteLine() 0030: Console.Write("===>程式暫停中,請按任意鍵繼續...") 0031: Console.ReadKey() 0032: End Sub 這邊用到了第2行所定義的全域變數。 這個變數宣告在Function GetUserName()裡面,稱之為區域變數。

21 副程式與模組 全域變數與區域變數的特性如下: 全域變數 區域變數 宣告方式 生命週期 存取範圍
宣告在區域的外層 宣告在某個區域裡面(例如Function) 生命週期 與程式同生共死 (意即:程式執行時持續佔有記憶體空間) 跟著被宣告的範圍,當該函式(或範圍)被呼叫時生成,該函式結束時消滅。 (意即:只有該函式執行時佔有記憶體空間) 存取範圍 整個程式範圍 被宣告的區域內   何時需要定義一個全域變數呢?假設這個變數需要被所有函式存取,則我們會將其定義為全域變數。   區域變數則比較簡單,假設某個變數僅會在一定的範圍內存取,我們就會設計成區域變數。 Do 和 Loop區域 For [Each] 和 Next區域 If 和 End If區域 Select 和 End Select區域 SyncLock 和 End SyncLock Try 和 End Try區域 While 和 End While區域 Sub和End Sub區域 Function和End Function區域

22 副程式與模組 靜態變數 以Static關鍵字宣告的變數是靜態變數,其值會被保留,不會隨著所在的副程式(或函式)的結束而消失…
EX:CH04-09 Sub Main() For i As Integer = 1 To 12 Test() Next Pause() End Sub Sub Test() Static n As Integer n = n + 1 Console.WriteLine("n:" & n) 以Static關鍵字宣告的變數是靜態變數,其值會被保留,不會隨著所在的副程式(或函式)的結束而消失

23 副程式與模組 備註 為什麼需要『靜態變數』呢?您可能會覺得,靜態變數的生命週期似乎和『全域變數』是一樣的,那乾脆在函式的最外層宣告一堆全域變數,不就可以達到和『靜態變數』一樣的功能嗎?答案是:『Yes』但是我們不會這麼做。 主要的原因依舊是剛才我們提過的,全域變數有著一個不好的特性,就是每一個副程式或是任何區域,都可以存取該變數,因此難保其他的副程式會不小心用到這個全域變數,或是誤設該變數的值。這會導致程式很難察覺的錯誤;而且如此一來,函式的獨立性又被破壞了。 此外,由於全域變數是程式碼中所有範圍均可以存取,因此有個很大的問題,就是命名,凡是全域變數中已經用過的變數名稱,同樣的名稱都不能出現在副程式或函式當中。 而靜態變數有著跟全域變數一樣的生命週期,但是其存取範圍卻被刻意侷限在某個副程式或是區域當中,這樣不僅可以避免被程式設計師誤用,有些常用的變數名稱,也可以重複的使用在不同的副程式或函式當中。

24 副程式與模組 .NET Class Library
  前面我們介紹過怎麼自己定義副程式和函式,但是其實在.NET Framework當中,已經有內建相當豐富的函式庫,並且依照不同的功能區分。   例如當我們撰寫程式時,需要使用到與數學函式有關的部份,可以在程式碼輸入區鍵入『System.Math.』:

25 副程式與模組 .NET Class Library
  類別庫包羅萬象,無法在書籍中完全加以介紹,但是透過『命名空間』,對於類別庫的使用,則可以有個概略性的思考方式。   例如在.NET Framework當中,與數學有關的系統函式都會位於System.Math命名空間底下,因此如果要尋找某些特定的函式,可以從命名空間開始思考。 命名空間是為了區分龐大的函式庫所採用的方法,因為.NET提供了一整套複雜且龐大的內建函式,如果不加以分門別類,上萬個各式各樣的內建函式將會難以分辨。因此,我們可以透過命名空間來對函式庫加以分類,例如Systm.Math.Sqrt()這個寫法當中,Sqrt是函式名稱,而System和Math則是命名空間。   這也表示了,命名空間下面還可以有命名空間,如此一來,也有另一個好處,就是即使函式名稱相同,我們也可以冠上不同的命名空間來加以區分。例如,假設我們自己撰寫了一個同名的Sqrt函式,我們可以在這個函式上面冠上不同的命名空間,例如StudyHost.Math.Sqrt,以區別不同的函式。 命名空間名稱 功能 System.Data 提供所有與資料庫(Access, SQL Server, Oracle)相關的函式與功能。 System.Drawing 提供與繪圖有關的函式與功能。 System.IO 提供與檔案、資料夾存取有關的功能。 System.Net 提供與網路相關的函式與功能。 System.Net.Mail 提供與電子郵件相關的函式與功能。 System.Web 提供與網際網路資源存取相關的功能。 System.Xml 提供與XML相關的功能。

26 副程式與模組 .NET My Class   除了透過System命名空間來存取.NET提供的內建函式之外,在Visual Basic 2005當中有一個捷徑,就是My Class。   My Class機制透過簡單的『My』關鍵字,讓程式設計師可以輕鬆的引用.NET Framework的功能。我們只需要在程式碼撰寫時,鍵入『My.』系統就會跳出可供使用的功能。例如『My.Computer』表示所有與我的電腦相關的功能:

27 副程式與模組 何謂模組(Module)   『模組』是一群副程式的集合,當我們在主程式中建立了很多副程式(或函式)之後,可以把功能相似的副程式歸類為一個模組,如此一來,開發人員在使用時也比較方便,不需要到處尋找程式碼片段。   同時,將主程式碼當中的功能切割成副程式,再歸類到一個模組檔案中,更可以讓開發程式的時候方便管理,後續的維護也會更加便利。特別是在多人同時開發一個專案的時候,這樣的好處會更加的明顯,這種將程式碼建立的更加結構的方式我們稱之為『模組化』。

28 副程式與模組 如何建立一個模組 方法一:點選選單中的「專案」→「加入模組」。

29 副程式與模組 如何建立一個模組 方法二:在「方案總管」中,按下滑鼠右鍵→「加入」→「模組」:

30 副程式與模組 模組的功能   把需要用到的函式(或副程序)寫進模組裡,這樣在使用時就可以用簡潔的程式碼來呼叫這些函式(或副程序) ,一方面精簡主程式,另一方面可以讓程式容易維護!   更重要的是,透過模組來撰寫應用程式,當我們把程式分割成獨立的幾個功能,且使用模組來設計之後,程式碼可以同時給多個開發人員一起開發,加快開發時程。此外,在這次專案中,建構好的模組,也可以在下次專案中重新拿出來使用,而不需要再撰寫一樣(或相似)的程式碼。

31 副程式與模組 模組的使用 在剛才建立好的模組檔案中,設計一個Sub…
EX:CH04-14\NewModule.vb Module NewModule '暫停 Sub Pause() Console.WriteLine() Console.Write("===>程式暫停中,請按任意鍵繼續...") Console.ReadKey() End Sub End Module 只需要打入模組名稱『newmodule.』VS2005就會帶出該模組中可用的函式(剛才我們建了一個Pause)出來給我們選擇。 主程式當中,可以這麼使用它:

32 副程式與模組 函式自動註解功能 如果您使用Visual Basic 2005撰寫函式或副程式時,在函式或副程式的上頭連續打三個『'』,則會出現這串自動產生的註解文字: 註解功能 0022: ''' <summary> 0023: ''' 把成績平均 0024: ''' </summary> 0025: ''' <returns></returns> 0026: ''' <remarks></remarks> 0027: Function Average() As Single 0028: Dim AvgScore As Single 0029: 0030: AvgScore = SumScore / Students 0031: Return AvgScore 0032: End Function 請在函式或副程式上頭,連續打三個『‘』,就會自動出現這串文字,請在<summary>和</summary>中,手動入輸入註解

33 副程式與模組 模組中函式的可用範圍   當我們將模組A中的Sub C()加了Private關鍵字之後,我們的主程式Module1當中的Sub Main(),想要叫用模組A的Sub C()時,就不可行了: 註解功能 Module A Sub B() Call C() End Sub Private Sub C() (…略…) Sub D() End Module 當Sub C()加上了Private關鍵字之後,模組內的Sub B()和Sub D()都可以呼叫Sub C(),但是模組A之外的其他程式碼,則無法透過A.C()的方式來呼叫模組內的Sub C():

34 副程式與模組 模組中函式的可用範圍 這種機制其實是一種『保護措施』,因為當程式碼愈來越複雜之後,程式設計師只是依照函式的名稱來使用,如果不小心叫用到不該呼叫的函式,可能會讓程式發生意料之外的錯誤,因此設計模組的程式設計師,必須承擔起這個責任,讓模組的架構更佳的完善。

35 副程式與模組 Private的意義說明 程式的嚴重錯誤往往發生在『邏輯上』而非程式碼的『語法』撰寫上,近代程式開發工具,都已經備有完善的程式碼檢查功能,在撰寫和編譯的同時,都已經可以去除大部分的程式語法謬誤,,但是開發工具無法幫您檢查邏輯上的錯誤。 當一個大型專案切割成許多小專案之後,撰寫主程式的可能是一個開發人員(John),撰寫模組的又是另一個(Eric),這時模組的架構就變的相當重要。如果模組內的眾多函式當中,某些只提供該模組內部使用的函式(例如上例中的CheckData),因為沒有加上Private關鍵字,被開發主程式的程式設計師拿去使用,您可能以為似乎無傷大雅,其實將會衍生出一些重大問題。 其中一個就是專案的改版,上例中,開發Computation模組的程式設計師(John),在第一版開發的時候,因為沒有將CheckData()函式設為Private,導致開發主程式的人(Eric)在不知情的狀況底下拿去用了,在第一版的程式沒有問題,當程式要改版了, John覺得CheckData()這個函式不太合用,因此把它改掉(也許換了名子,也許換了功能)但是並沒有通知Eric,因為John覺得這個函式是Computation模組自己使用的,『應該』不會有其他的程式設計師用到才對(但是顯然他料錯了)。這會導致程式無法連結或是發生執行階段錯誤。 當發現錯誤了,專案經理只有兩種選擇,不是要John將函式還原,就是要Eric改寫程式不要用到CheckData()這個函式。不管是何者,都將會嚴重的影響程式開發進度,造成專案的延誤… 當程式很小,只有一位程式設計師的時候,這種問題看來影響不大,當程式架構非常大,超過10位程式設計師需要彼此合作溝通的時候,這個問題就出現了,程式越不嚴謹,隨著時間發生錯誤的機會就越高,出現這種錯誤,就會影響開發效率與時程,接著,公司的專案就會Delay,聽到Delay這個字,就表示要額外多花錢,專案成本膨脹,公司收入減少,開發人員獎金減少,客戶抱怨增加…

36 Demo-dataSource與DropDownList
習題 參考CH02-12的範例,建立一個BMI函式,當傳入身高,體重,則傳回該人的BMI值。 如果函式的回傳值型別設為Single,但主程式接收參數的變數型別為Integer,則會發生什麼狀況? 如果函式中參數的型別為String,但主程式傳遞給該函式的相對應變數為Integer型別,則會發生什麼狀況? 如果函式中參數的型別為Integer,但主程式傳遞給該函式的相對應變數為String型別,則會發生什麼狀況? Demo-dataSource與DropDownList

37 Demo-dataSource與DropDownList
習題 請撰寫一個函式,名稱為GetNumber,接收的參數為msg(String型別),並且回傳Integer型別的回傳值,必須具備顯示Msg並且要求使用者輸入數字的功能,以取代範例CH04-03程式碼中的4-5行和6-7行,讓範例CH04-03的主程式這麼寫,就可以完成一樣的功能: n1=GetNumber(“請輸入數字1:”) n2=GetNumber(“請輸入數字2:”) Demo-dataSource與DropDownList

38 Demo-dataSource與DropDownList
習題 請建立一個函式,可以傳入兩個或三個整數型態的參數,並針對傳入的參數做相乘的動作,當參數只傳入兩個時,則將兩個參數相乘,並將結果回傳,若傳入三個參數,則將這三個參數相乘,並把結果回傳。 Demo-dataSource與DropDownList

39 Demo-dataSource與DropDownList
習題 請試著透過My Class,找到下載網際網路上檔案的方法 請試著透過My Class,找到刪除一個本機電腦檔案(例如自己的C:\)的方法 請試著透過My Class,找到讓電腦『叮』一聲的方法 請試著透過My Class,偵測使用者是否按下鍵盤上的Number Lock,並顯示出來。 Demo-dataSource與DropDownList


Download ppt "Demo-dataSource與DropDownList"

Similar presentations


Ads by Google