Title: Advanced GIS: functions,Procedures, Arrays and Collections
1Advanced GISfunctions,Procedures, Arrays and
Collections
2Functions and subprocedures
- Functions - consist of code that does something
specific and then return a value to the part of
the program that called it. For example, the
Sin() function. - Subprocedures - dont return results, eg. the
Unload method. So far, the code we wrote are
for event subprocedures. When a command button
named Command1 is pressed, Visual Basic runs
the Command1_Click() event subprocedure.
Subprocedure usually does something, like
changing the display, but it doesnt tend to pass
anything back to Visual Basic
3Creating a sub procedure
- Two ways to add sub procedure
- 1) Use the Add Procedure dialog box or
- Open the Code Editor window and go to Tools gt Add
Procedure. Type in Name of the procedure and
make sure Private scope is checked and click OK
to continue - 2) Directly define a procedure in the Code
Editor window - type in code for a procedure and
end with End Sub
4Call Procedure
- Using Call Procedure_Name to call procedure.
You may directly use Procedure without calling
procedures, but its not recommended. - Private Sub cmdCalculate_Click()
- intMyNumber InputBox (Input your number)
- Call SquareNumber
- End Sub
- Private Sub mnuToolsCalculate_Click()
- SquareNumber
- End Sub
- Private Sub SquareNumber()
- lblAnswer.Caption intMyNumber intMyNumber
- End Sub
5Passing Arguments to procedures
- Private Sub SquareNumber(intNum As Double)
- lblAnswer.Caption intNum intNum
- End Sub
- Private Sub cmdCalculate_Click()
- intMyNumber InputBox (Input your number)
- Call SquareNumber(intMyNumber)
- End Sub
- Exercise create a sub procedure with two
arguments for calculating area of a rectangle - Private Sub Area(x as single, y as single)
- lblAnswer.Caption x y
- End Sub
- Private Sub cmdCalculate_Click() need to
declare width/height - width Inputbox (Input width of a square)
- height inputbox (Input height of a square)
- Call Area(width, height)
- End Sub
6Lets create a window menu using Menu Editor
- Add a new form (Project gt Add Form)
- Go to Tools gt Menu Editor and create a two-layer
menu as shown on right
7Common Dialogs
- Insert Common Dialogs from Project gt Component gt
Microsoft Common Dialog - The following are the functions available
- Open file- ShowOpen
- Save File - ShowSave
- Color - ShowColor
- Font - ShowFont
- Print - ShowPrinter
- Help - ShowHelp
- Name this common dialog as dlgFile
8Connect FilegtSave with Common Dialog
- In Code Editor, type in the following code
associated with mnuFileSave_Click() - dlgFile.ShowSave
9Exercise
- Add Two menus to your SlideShow(HW8) program
File and Tools - Add Save As, and Exit on File menu and SlideShow
on Tools menu. (mnuFile, mnuFileSaveAs - CtrlS,
mnuFileExit, mnuTools, mnuToolsSlideShow) - Add Microsoft Common Dialog Control 6.0 and name
it as dlgMain (under munFileSaveAs_Click() ) - dlgMain.FileName lstSlides.Text
- dlgMain.ShowSave
- If dlgMain.FileName ltgt Then
- SavePicture imgPicture, dlgMain.FileName
- End If
- SavePicture requires two arguments, first-the
picture or image control from which the graphic
file is to be created. The second is the full
path to the location where the picture file is to
be saved.
10- use code Unload Me for mnuFileExit (and
dlgFile.ShowOpen to associate with Open, if Open
is under File) - mnuToolsSlideShow_Click() - type a msgbox
SlidShow has not been implemented yet with
vbExclaimation - run this program and save file to different
location with different file names
11Public or Private
- Public subprocedures are declared like this
- Public Sub ltsubprocedure namegt
- Public Function ltfunction namegt As ltreturn typegt
- A public routine can be accessed throughout the
program but a private can only called in the same
Form or Module - Advantage of using Private
- use less memory, code protected within one
corner, and names used over and over
12Passing arguments to procedures
- If a procedure requires arguments, they are
passed to the procedure, when the procedure is
called. Lets create a Sub called SquareNumber
with argument and one command button, one text
box and a label for showing the answer. - Private Sub SqureNumber (intNum As Double)
- lblAnswer.Caption intNum intNum
- End Sub
- Arguments have to be supplied to run this
procedure. Lets modify cmdCalculate - Private Sub cmdCalculate_Click()
- Call SquareNumber (txtNum.text)
- End Sub
13ByRef or ByVal
- Argument s can be passed either by value or by
reference. Passing by value- a copy of the
variable is passed to the sub procedure. If the
variable is changed in the sub procedure, the
original variable in the calling procedure is not
affected. If an argument is passed by reference,
changing the argument in the sub procedure will
permanently change the argument in the calling
procedure. ByRef is default, if not specified - Dim X As Integer
- X 5
- Call aSub(X)
- MsgBox X X
- Private Sub aSub (ByVal Y As Integer)
- Y 6
- End Sub
Try ByRef
Change ByVal to ByRef and see the differences
14Built-in functions
- String, numeric, date and time, financial
functions. - Commonly used String functions
- LCase/UCase converts to L/U case
- Len return length of string
- Left/Right/Mid return specified number of cha.
form left/right/middle side of a string. - Replace replace one or more occurrence of a
string inside another - LTrim/RTrim/Trim removes spaces from the
beginning (end)(both ends) of a string. - InStr/InStrRev returns the position of the
first(last) occurrence of one string within
another - Join return a string created by joining a number
of substrings contained in an array.
15Numeric/Date/Time
- Abs/Sin/Cos/Tan/Atn(arctangent)/Exp/Log/
Sqr/Sgn(sign of a number)/Rnd (random
number)/Int,Fix (integer portion of a number) - Date-current system date
- DateAdd- add specified interval to a date
- DateDiff - differ of two specified dates
- ..
- ..
16Variable Scope
17Static statement - to preserve the values of
procedure-level variables, use Static
VariableName As data type
- used to maintain the values of variables between
calls of the procedure. - Try this
- Private Sub Command1_Click()
- Static intNum As Integer
- intNum intNum 1
- MsgBox intNum
- End Sub
- Try to run these code several times, the
increment of - intNum can be shown in Static but not Dim
Private Sub Command1_Click() Dim intNum As
Integer intNum intNum 1 MsgBox intNum End Sub
18Option Explicit
- Implicit Declaration - in VB, if no declaration
for variables. Try the following code - myVariable 5
- myVariable myVariable 5
- MsgBox myVariable
19Function procedures - return values which
determines data type of functions
- Return a value from a function by assigning it to
the name of the function itself. Basically, the
function is treated as though it were a variable. - In slides 4/5, the SqureNumber sub can only
change the lblAnswer.Caption. If a function is in
place such as the follows - Private Function SqureNumber (intNum As Double)
As Double - SquareNumber intNum intNum
- End Function
- Private Sub munToolsCalcualte_Click()
- Dim intMyNumber As Double
- intMyNumber txtNum.Text
- lblAnswer.Caption SqureNumber (intMyNumber)
- End Sub
20Multi-form projects
- Most projects need more than one form. For
instance, login form, splash form and about form.
- To add a new form to a project, choose Add Form
from the Project menu or right-click in the
Project Explorer window. - Form can be referred as Me by procedures within
the form, and other forms must be referred to by
their names. - If a project contains more than one form, a
startup form must be declared in the Project
Properties dialog box, accessed from the Project
menu. (go to ProjectgtProject Properties...) - If you want the application to start without any
form initially loaded (e.g., retrieve data
-gtdisplay one of the form depending on the
contents of the data file), then create a Sub
procedure called Main in a standard module and
select Sub Main as the Startup Object.
21Manage Forms
- Tasks Methods/Statements
- Load/Not Display Load Statement
- LoadDispaly Show method
- Display a loaded form Show method
- Hide/Not unload Hide method
- HidUnload Unload
- Load frmMain or frmMain.Show
- frmMain.Hide or Me.Hide
- Unload frmMain or Unload Me, code portions
still exist - Set frmMain Nothing completely terminate the
form and reclaim memory
22Modal/Modeless Forms
- Most of dialog boxes in VB are modal. Only one
form can be modal on the screen at one time.
When a modal form is displayed, the application
beeps if the user clicks outside the form. - Modeless form- allows the user to switch to
another form or dialog box - With the style argument vbModal or vbModeless,
the Show method displays a modal or modeless
form. If you do not specify the style argument,
the form will be modeless. For example - Modal form
- frmMain.Show vbModal
- Modeless form, the default
- frmMain.Show vbModeless
23Standard modules
- No GUI, no form, only code.
- Public procedures shared by multiple projects,
avoid referencing form-specific controls, which
can be passed as arguments to the general
procedures of the standard module. - To call the procedure from outside the standard
module, directly refer to procedures name, if it
is unique, otherwise, you need the module name as
the prefix. To call procedure within own std
module, simply refer to the procedure name. - Save the std module with a unique name and .bas
file extension in the same directory where the
project file is saved.
24Practice
- Create a new project with form.
- Add standard module from U\4850_5850\ArcObjects\a
ml_func.bas by checking on ProjectgtAdd Module and
navigate to this directory. - Add a command button(cmdParse, CaptionParse),
textbox (txtInput) and type in code under
cmdParse_Click() - Private Sub cmdParse_Click()
- Dim strMyArray() As String
- ParseStringR txtInput.Text, strMyArray
- MsgBox strMyArray(0)
- End Sub
try single quote
25Arrays - used to store a series of elements that
usually contain related information
- Fixed-size array
- Dynamic array
- Multi-dimensional arrays
261-D fixed array
- Dim My1DFixedArray(4) As String declare array
with 5 elements - My1DFixedArray(0) Heart assign value
- My1DFixedArray(1) Club
- My1DFixedArray(2) Spade
- My1DFixedArray(3) Diamond
- My1DFixedArray(4) Club
- MsgBox My1DFixedArray(2) retrieve
- Specify upper/lower bound
- Dim My1DFixedArray(0 to 4) As String
- Dim My1DFixedArray(1 to 4) As String
27Dynamic Arrays - number of elements to be stored
is not known ahead of time
Slide1
Slide2
Slide3
Slide4
....
....
0
1
2
3
- Dim DynArray() As String
- Dim X As Integer
- X InputBox (Enter the number of elements in
the_ array ) - ReDim DynArray(X-1)
Allow programmer to manage memory more
efficiently than fixed arrays
28ReDim/Preserve/Erase
- The size of array will be specified at run-time
with keyword ReDim and the memory for the array
is then allocated. You can change size of
dynArray anytime with ReDim statements, but the
original values contained in array are lost once
encountering ReDim. Use keyword Preserve to
preserve values. - ReDim Preserve DynArray (UBound(DynArray) 1)
this add one element more but preserve previous
values - Use Erase to deallocate memory and ReDim to
reallocate memory. e.g Erase DynArray
29Multi-dimensional arrays
- Path(0) Date(1) Second(2) Title(3)
- Slide(0) C\temp 1/30/89 5 Slide show
- Slide(1) U\4850 3/19/02 4 Rex
- Slide(2) E\temp 3/20/01 6 Trees
Option Explicit Dim Slide() As String Private Sub
Command1_Click() ReDim Slide(0 to 3, 0 to
1) Assign value Slide(col,row)
value Slide(0,0) C\temp Slide(0,1)
1/30/89 Slide(0,2) 5 Slide(0,3) Slide
Show Slide(1,0) U\4850
Add more data ReDim Preserve Slide(3, UBound
(Slide,2) 1)
30Exercise - work with 2-D dynamic arrays
- Create a new Form(frmGrades, Enter Grades), add
two labels(lblStudentName, Student Name
lblLetterGrade, Letter Grade), 2 text
(txtStudent, txtGrade, ), 1 commandbox
(cmdApply, Apply Grade, Default True),
Horizontal Scroll Bar (hscStudent, Max0, Min0) - The application will store students names and
grades in any array (dynamic). Because the
values in the array will need to be used in 2
different procedures. Variables have to be
declared at the form level. Dim Score() As String - Store student names in a 2-D dynamic array
Declare a Static variable Number As Integer
(maintain the number of students between
procedure calls)
31Grade
- Private Sub cmdApply_Click()
- Static Number As Integer
- ReDim Preserve Score(1, Number)
- Score(0, Number) txtStudent.Text
- Score(1, Number) txtGrade.Text
- hscStudent.Max Number
- hscStudent.Value Number
- Number Number 1
- End Sub
2-D Array txtStudent.text stored in Score first
column, and txtGrade in 2nd column
hscStudent.Value indicate where the slider of
the horizontal scroll bar is located and act as
the index for the Score array. When you move the
scroll bar slider, the Value property is changed,
and a different element in the Score array is
retrieved and displayed in txtStudent
Private Sub hscStudent_Change() txtStudent.Text
Score(0, hscStudent.Value) txtGrade.Text
Score(1, hscStudent.Value) End Sub
32Collection -an object that does not have a
graphic component, dynamically grows and shrinks
- Dim MyCollection As New Collection
- You can use four methods Add, Remove, Count, and
Item (Variant is the data type for storing
different data type) - Key
MyCollectioin
Index
1 2 3 4
Hello
3.14159
2/7/02
Slide1
Key
strHello Pi dt2/7/02 slide1
Its safer to use the key strings to identify the
items, why?
33Colleciton - 2
- Add NewItem w/o key at the end of the collection
- MyCollection.Add NewItem
- Add NewItem w/ key myNewItem at the end of the
col. - MyCollection.Add NewItem myNewItem
- Remove using Index or Key. Index starts from 1
not 0. - MyCollection.Remove 5 Remove the fifth item
- MyCollection.Remove myNewItem remove using
key - To Change an item, add new item first before or
after the old item, then remove the old one. e.g.
change 2/7/02 to 3/20/02 - MyCollection.Add 3/20/02, dt3/20/02,3
- MyCollection.Remove 4 or Remove dt2/7/02
- Set MyCollection Nothing clear collection
34Looping through Collection
- 1) For Each... Next and 2) For....Next
- Dim Thing As Variant
- For Each Thing In MyCollection for each is
more efficient than for next. - lstName.AddItem Thing
- Next
- Set Thing Nothing set variant to nothing will
recollect memory - Dim I As Integer
- For I 1 to MyCollection.Count
- lstName.AddItem MyCollection.Item(I)
- Next I
35Homework 9-1 30 points, due on 11/6/03.
- Work on your previous homework, if you dont have
a good vbp file, copy it from data_center\hw9-data
folder. - See demo for the tasks to be completed.
- See link on the webpage to get detailed
description of the homework -