330 likes | 475 Views
10 – Enumerated Data Types & Procedure Parameters. Session Aims & Objectives. Aims, to introduce: the idea of enumerated data types passing parameters/arguments to procedures control arrays Objectives, after this week’s sessions, you should be able to:
E N D
Session Aims & Objectives • Aims, to introduce: • the idea of enumerated data types • passing parameters/arguments to procedures • control arrays • Objectives, after this week’s sessions, you should be able to: • declare and use an enumerated data type • use parameters in your programs to make procedures more flexible • use control arrays
Enumerated Data Types • Often need to use numbers to represent things (coding) • For example, curry: mild, medium, or hot • Could store text: "mild", "medium", "hot" • takes lots of space (1 byte per character) • easily becomes inconsistent, e.g. "hit“ vs. “hot” • Alternatively, use numbers to represent text: 1 "mild" 2 "medium" 3 "hot"
Example: Curry v1 Option Explicit Private Sub Form_Load() lstCurry.AddItem "Mild", 0 lstCurry.AddItem "Medium", 1 lstCurry.AddItem "Hot", 2 picCurry.FillStyle = vbSolid End Sub Private Sub lstCurry_Click() lblCurryCode.Caption = lstCurry.ListIndex lblCurryText.Caption = lstCurry.List(lstCurry.ListIndex) If lstCurry.ListIndex = 0 Then picCurry.FillColor = vbWhite ElseIf lstCurry.ListIndex = 1 Then picCurry.FillColor = vbYellow Else picCurry.FillColor = vbRed End If picCurry.Cls picCurry.Circle (1000, 750), 500 End Sub Curry v1
Example: Curry v2 Option Explicit Private Sub Form_Load() lstCurry.AddItem "Mild", 0 lstCurry.AddItem "Medium", 1 lstCurry.AddItem "Hot", 2 picCurry.FillStyle = vbSolid End Sub Private Sub lstCurry_Click() Dim CuCo As Long ' Curry code CuCo = lstCurry.ListIndex lblCurryCode.Caption = CuCo lblCurryText.Caption = lstCurry.List(CuCo) If CuCo = 0 Then picCurry.FillColor = vbWhite ElseIf CuCo = 1 Then picCurry.FillColor = vbYellow Else picCurry.FillColor = vbRed End If picCurry.Cls picCurry.Circle (1000, 750), 500 End Sub Curry v2
Example: Curry v3 Option Explicit Const Mild = 0 Const Medium = 1 Const Hot = 2 Private Sub Form_Load() lstCurry.AddItem "Mild", Mild lstCurry.AddItem "Medium", Medium lstCurry.AddItem "Hot", Hot picCurry.FillStyle = vbSolid End Sub Private Sub lstCurry_Click() Dim CuCo As Long ' Curry code CuCo = lstCurry.ListIndex lblCurryCode.Caption = CuCo lblCurryText.Caption = lstCurry.List(CuCo) If CuCo = Mild Then picCurry.FillColor = vbWhite ElseIf CuCo = Medium Then picCurry.FillColor = vbYellow Else picCurry.FillColor = vbRed End If picCurry.Cls picCurry.Circle (1000, 750), 500 End Sub Curry v3
Example: Curry v4 Option Explicit Enum TSpice Mild = 0 Medium = 1 Hot = 2 End Enum Private Sub Form_Load() lstCurry.AddItem "Mild", Mild lstCurry.AddItem "Medium", Medium lstCurry.AddItem "Hot", Hot picCurry.FillStyle = vbSolid End Sub Private Sub lstCurry_Click() Dim CuCo As TSpice ' Curry code CuCo = lstCurry.ListIndex lblCurryCode.Caption = CuCo lblCurryText.Caption = lstCurry.List(CuCo) If CuCo = Mild Then picCurry.FillColor = vbWhite ElseIf CuCo = Medium Then picCurry.FillColor = vbYellow Else picCurry.FillColor = vbRed End If picCurry.Cls picCurry.Circle (1000, 750), 500 End Sub Curry v4
Questions: EDTs • Create an EDT to store the following classification of height: short, average, tall • Create an EDT to store the following classification of publication: book, journal Enum THeight Short = 0 Average = 1 Tall = 2 End Enum Enum TPublication Book = 0 Journal = 1 End Enum
Parameters in Event Procedures • Provide us with information about event • e.g. if mouse was clicked • where was it (x, and y co-ordinates) • which mouse button was pressed • which keyboard buttons were pressed ([Shift] / [Ctrl])
Example: Draw • Parameters: • appear in the brackets of a procedure definition Option Explicit Private Sub picDraw_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single) If Button = 1 Then picDraw.PSet (X, Y) End If End Sub Private Sub picDraw_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single) If Button = 1 Then picDraw.Line -(X, Y) End If End Sub mouse button keyboard [Shift] [Ctrl] keys horizontal & vertical mouse co-ordinates
Parameters/Arguments (what) Milk Make cup of tea Sugars • Sometimes our own procedures need information • Making a cup of tea: • milk, and number of sugars • Makes them more flexible
Parameters (how) • Procedure Declaration • Formal parameters define name & type • Procedure Call • actual parameters list values in order Option Explicit Dim res As Long Private Sub Calc(Num1 As Long, Num2 As long) res = Num1 * Num2 End Sub Private Sub btnCalc_Click() Calc 5, 2 Calc 11, 15 End Sub
Example: House v1 Option Explicit Private Sub btnDraw_Click() picHouse.Cls picHouse.Line (1000, 1000)-(2000, 1750), , B picHouse.Line (1000, 1000)-(1500, 750) picHouse.Line -(2000, 1000) End Sub House v1
Example: House v1 to v2 Option Explicit Private Sub btnDraw_Click() picHouse.Cls picHouse.Line (1000, 1000)-(2000, 1750), , B picHouse.Line (1000, 1000)-(1500, 750) picHouse.Line -(2000, 1000) End Sub House v1 House v2 Option Explicit Private Sub DrawHouse() picHouse.Line (1000, 1000)-(2000, 1750), , B picHouse.Line (1000, 1000)-(1500, 750) picHouse.Line -(2000, 1000) End Sub Private Sub btnDraw_Click() picHouse.Cls DrawHouse DrawHouse DrawHouse End Sub
Example: House v2 Option Explicit Private Sub DrawHouse() picHouse.Line (1000, 1000)-(2000, 1750), , B picHouse.Line (1000, 1000)-(1500, 750) picHouse.Line -(2000, 1000) End Sub Private Sub btnDraw_Click() picHouse.Cls DrawHouse DrawHouse DrawHouse End Sub House v2
Example: House v3 Option Explicit Private Sub DrawHouse(x As Single, y As Single) picHouse.Line (x, y)-(x + 1000, y + 750), , B picHouse.Line (x, y)-(x + 500, y - 250) picHouse.Line -(x + 1000, y) End Sub Private Sub btnDraw_Click() picHouse.Cls DrawHouse 1000, 1000 DrawHouse 2500, 1000 DrawHouse 4000, 1000 End Sub House v3
Questions: Parameters • Given the following declaration: • What will the following put in lblOutput? Sub thing(Num1 As Long, Num2 As Long, Num3 As Long) Dim tmpOutput As Long tmpOutput = (Num1 + Num2) * Num3 lblOutput.Caption = tmpOutput End Sub thing 2, 3, 6 thing 6, 3, 2 thing 20, 5, 2 30 18 50
Example: Till v1 Option Explicit Dim SubTotal As Double Dim Total As Double Private Sub btnEquals_Click() Dim price As Double Dim quantity As Double price = Val(Me.txtPrice.Text) quantity = Val(Me.txtQuantity.Text) SubTotal = price * quantity lblSubTotal.Caption = "£" & SubTotal End Sub Private Sub btnAdd_Click() Total = Total + SubTotal lblTotal.Caption = "£" & Total End Sub Private Sub btnUndo_Click() Total = Total - SubTotal lblTotal.Caption = "£" & Total End Sub Till v1
Example: Till v2 Option Explicit Dim SubTotal As Double Dim Total As Double Private Sub TotalAdd(amount As Double) Total = Total + amount Me.lblTotal.Caption = "£" & Total End Sub Private Sub btnEquals_Click() Dim price As Double Dim quantity As Double price = Val(Me.txtPrice.Text) quantity = Val(Me.txtQuantity.Text) SubTotal = price * quantity lblSubTotal.Caption = "£" & SubTotal End Sub Private Sub btnAdd_Click() TotalAdd SubTotal End Sub Private Sub btnUndo_Click() TotalAdd -SubTotal End Sub TotalAdd amount: Double Till v2
Example: Heart Rate v3 Option Explicit Dim HR(0 To 6) As Long Private Sub Form_Load() HR(0) = 134 HR(1) = 127 HR(2) = 139 HR(3) = 155 HR(4) = 143 HR(5) = 151 HR(6) = 141 End Sub Private Sub DrawHR() Dim i As Long picMain.Cls For i = 0 To 6 picMain.Line -(i * 500, HR(i) * 10) Next End Sub Private Sub btnDraw_Click() DrawHR End Sub
Example: Heart Rate v4 Option Explicit Dim HR(0 To 6) As Long Private Sub Form_Load() HR(0) = 134 HR(1) = 127 HR(2) = 139 HR(3) = 155 HR(4) = 143 HR(5) = 151 HR(6) = 141 End Sub Private Sub DrawHR(picTemp As PictureBox) Dim i As Long picTemp.Cls For i = 0 To 6 picTemp.Line -(i * 500, HR(i) * 10) Next End Sub Private Sub btnDraw_Click() DrawHR Me.picMain1 DrawHR Me.picMain2 End Sub
Control Arrays • Several controls have same name • Distinguished by unique index • Very similar to a variable array • Makes it easier to do same thing to all controls – using for loop
Example: Ships - UI • Four controls share same name (picMain): picMain(1) picMain(0) picMain(2) picMain(3) Ships lblMooringID
Example: Ships - Code Option Explicit Sub Draw() Dim i As Long For i = 0 To 3 picMain(i).DrawWidth = 3 picMain(i).Line (1000, 1000)-(2000, 1000) picMain(i).Line -Step(-200, 200) picMain(i).Line -Step(-600, 0) picMain(i).Line -Step(-200, -200) Next End Sub Private Sub picMain_Click(Index As Integer) lblMooringID.Caption = Index Draw End Sub
Control Arrays - How • To create a control array, either: • Create a control with the same name as an existing control (VB will ask you if you want to create a control array) Or: • Create a control and type a value into its index property (e.g. 0)
Container Controls • Some controls can contain other controls: • Picture boxes • Frames • The container (parent) control clips the contained (child) controls • The child controls will not be displayed outside the boundary of their parent
Example – Pic Container • The inner picture box is clipped: picOuter picInner
Tutorial Exercise: Curry • LEARNING OBJECTIVE:to understand enumerated data types • Task 1: Get the Curry examples from the lecture working. • Task 2: Modify your code – add an extra category called ‘Blazing’ with a code value of 3.
Tutorial Exercise: Draw • LEARNING OBJECTIVE: • use parameters provided by event procedures • Task 1: Get the Draw example (from the lecture) working. • Task 2: Modify your code – allow the user to rub out (paint in the background colour) using the right mouse button. • Task 3: Modify your code – allow the user to use a thicker line by holding down the [ctrl] button on the keyboard
Tutorial Exercise: House • LEARNING OBJECTIVE: • use parameters in your own procedures, to make them more flexible (general purpose) • Task 1: Get the House examples (versions 1, 2, and 3) from the lecture working. • Task 2: Modify your code – add code that draws a door and a window for each house. • Task 3: Modify your code – add code that draws 10 small houses. Hint: use a for loop (rather than simply copying the procedure calls)
Tutorial Exercise: Till • LEARNING OBJECTIVE: • use parameters in your own procedures, to make them more flexible (general purpose) • Task 1: Get the Till examples (versions 1 and 2) from the lecture working. • Task 2: Modify your code – add code that clears all data when the clear button is clicked. • Task 3: Modify your code – create a procedure to calculate and display the sub total.
Tutorial Exercise: Heart Rate • LEARNING OBJECTIVE: • use parameters in your own procedures, to make them more flexible (general purpose) • Task 1: Get the Heart Rate examples (versions 3 and 4) from the lecture working. • Task 2: Modify your code – use additional parameters to control the horizontal and vertical sizes of the graphs (so that the two graphs can be different sizes).