
- •Using Your Sybex Electronic Book
- •Acknowledgments
- •Contents at a Glance
- •Introduction
- •Who Should Read This Book?
- •How About the Advanced Topics?
- •The Structure of the Book
- •How to Reach the Author
- •The Integrated Development Environment
- •The Start Page
- •Project Types
- •Your First VB Application
- •Making the Application More Robust
- •Making the Application More User-Friendly
- •The IDE Components
- •The IDE Menu
- •The Toolbox Window
- •The Solution Explorer
- •The Properties Window
- •The Output Window
- •The Command Window
- •The Task List Window
- •Environment Options
- •A Few Common Properties
- •A Few Common Events
- •A Few Common Methods
- •Building a Console Application
- •Summary
- •Building a Loan Calculator
- •How the Loan Application Works
- •Designing the User Interface
- •Programming the Loan Application
- •Validating the Data
- •Building a Math Calculator
- •Designing the User Interface
- •Programming the MathCalculator App
- •Adding More Features
- •Exception Handling
- •Taking the LoanCalculator to the Web
- •Working with Multiple Forms
- •Working with Multiple Projects
- •Executable Files
- •Distributing an Application
- •VB.NET at Work: Creating a Windows Installer
- •Finishing the Windows Installer
- •Running the Windows Installer
- •Verifying the Installation
- •Summary
- •Variables
- •Declaring Variables
- •Types of Variables
- •Converting Variable Types
- •User-Defined Data Types
- •Examining Variable Types
- •Why Declare Variables?
- •A Variable’s Scope
- •The Lifetime of a Variable
- •Constants
- •Arrays
- •Declaring Arrays
- •Initializing Arrays
- •Array Limits
- •Multidimensional Arrays
- •Dynamic Arrays
- •Arrays of Arrays
- •Variables as Objects
- •So, What’s an Object?
- •Formatting Numbers
- •Formatting Dates
- •Flow-Control Statements
- •Test Structures
- •Loop Structures
- •Nested Control Structures
- •The Exit Statement
- •Summary
- •Modular Coding
- •Subroutines
- •Functions
- •Arguments
- •Argument-Passing Mechanisms
- •Event-Handler Arguments
- •Passing an Unknown Number of Arguments
- •Named Arguments
- •More Types of Function Return Values
- •Overloading Functions
- •Summary
- •The Appearance of Forms
- •Properties of the Form Control
- •Placing Controls on Forms
- •Setting the TabOrder
- •VB.NET at Work: The Contacts Project
- •Anchoring and Docking
- •Loading and Showing Forms
- •The Startup Form
- •Controlling One Form from within Another
- •Forms vs. Dialog Boxes
- •VB.NET at Work: The MultipleForms Project
- •Designing Menus
- •The Menu Editor
- •Manipulating Menus at Runtime
- •Building Dynamic Forms at Runtime
- •The Form.Controls Collection
- •VB.NET at Work: The DynamicForm Project
- •Creating Event Handlers at Runtime
- •Summary
- •The TextBox Control
- •Basic Properties
- •Text-Manipulation Properties
- •Text-Selection Properties
- •Text-Selection Methods
- •Undoing Edits
- •VB.NET at Work: The TextPad Project
- •Capturing Keystrokes
- •The ListBox, CheckedListBox, and ComboBox Controls
- •Basic Properties
- •The Items Collection
- •VB.NET at Work: The ListDemo Project
- •Searching
- •The ComboBox Control
- •The ScrollBar and TrackBar Controls
- •The ScrollBar Control
- •The TrackBar Control
- •Summary
- •The Common Dialog Controls
- •Using the Common Dialog Controls
- •The Color Dialog Box
- •The Font Dialog Box
- •The Open and Save As Dialog Boxes
- •The Print Dialog Box
- •The RichTextBox Control
- •The RTF Language
- •Methods
- •Advanced Editing Features
- •Cutting and Pasting
- •Searching in a RichTextBox Control
- •Formatting URLs
- •VB.NET at Work: The RTFPad Project
- •Summary
- •What Is a Class?
- •Building the Minimal Class
- •Adding Code to the Minimal Class
- •Property Procedures
- •Customizing Default Members
- •Custom Enumerations
- •Using the SimpleClass in Other Projects
- •Firing Events
- •Shared Properties
- •Parsing a Filename String
- •Reusing the StringTools Class
- •Encapsulation and Abstraction
- •Inheritance
- •Inheriting Existing Classes
- •Polymorphism
- •The Shape Class
- •Object Constructors and Destructors
- •Instance and Shared Methods
- •Who Can Inherit What?
- •Parent Class Keywords
- •Derived Class Keyword
- •Parent Class Member Keywords
- •Derived Class Member Keyword
- •MyBase and MyClass
- •Summary
- •On Designing Windows Controls
- •Enhancing Existing Controls
- •Building the FocusedTextBox Control
- •Building Compound Controls
- •VB.NET at Work: The ColorEdit Control
- •VB.NET at Work: The Label3D Control
- •Raising Events
- •Using the Custom Control in Other Projects
- •VB.NET at Work: The Alarm Control
- •Designing Irregularly Shaped Controls
- •Designing Owner-Drawn Menus
- •Designing Owner-Drawn ListBox Controls
- •Using ActiveX Controls
- •Summary
- •Programming Word
- •Objects That Represent Text
- •The Documents Collection and the Document Object
- •Spell-Checking Documents
- •Programming Excel
- •The Worksheets Collection and the Worksheet Object
- •The Range Object
- •Using Excel as a Math Parser
- •Programming Outlook
- •Retrieving Information
- •Recursive Scanning of the Contacts Folder
- •Summary
- •Advanced Array Topics
- •Sorting Arrays
- •Searching Arrays
- •Other Array Operations
- •Array Limitations
- •The ArrayList Collection
- •Creating an ArrayList
- •Adding and Removing Items
- •The HashTable Collection
- •VB.NET at Work: The WordFrequencies Project
- •The SortedList Class
- •The IEnumerator and IComparer Interfaces
- •Enumerating Collections
- •Custom Sorting
- •Custom Sorting of a SortedList
- •The Serialization Class
- •Serializing Individual Objects
- •Serializing a Collection
- •Deserializing Objects
- •Summary
- •Handling Strings and Characters
- •The Char Class
- •The String Class
- •The StringBuilder Class
- •VB.NET at Work: The StringReversal Project
- •VB.NET at Work: The CountWords Project
- •Handling Dates
- •The DateTime Class
- •The TimeSpan Class
- •VB.NET at Work: Timing Operations
- •Summary
- •Accessing Folders and Files
- •The Directory Class
- •The File Class
- •The DirectoryInfo Class
- •The FileInfo Class
- •The Path Class
- •VB.NET at Work: The CustomExplorer Project
- •Accessing Files
- •The FileStream Object
- •The StreamWriter Object
- •The StreamReader Object
- •Sending Data to a File
- •The BinaryWriter Object
- •The BinaryReader Object
- •VB.NET at Work: The RecordSave Project
- •The FileSystemWatcher Component
- •Properties
- •Events
- •VB.NET at Work: The FileSystemWatcher Project
- •Summary
- •Displaying Images
- •The Image Object
- •Exchanging Images through the Clipboard
- •Drawing with GDI+
- •The Basic Drawing Objects
- •Drawing Shapes
- •Drawing Methods
- •Gradients
- •Coordinate Transformations
- •Specifying Transformations
- •VB.NET at Work: Plotting Functions
- •Bitmaps
- •Specifying Colors
- •Defining Colors
- •Processing Bitmaps
- •Summary
- •The Printing Objects
- •PrintDocument
- •PrintDialog
- •PageSetupDialog
- •PrintPreviewDialog
- •PrintPreviewControl
- •Printer and Page Properties
- •Page Geometry
- •Printing Examples
- •Printing Tabular Data
- •Printing Plain Text
- •Printing Bitmaps
- •Using the PrintPreviewControl
- •Summary
- •Examining the Advanced Controls
- •How Tree Structures Work
- •The ImageList Control
- •The TreeView Control
- •Adding New Items at Design Time
- •Adding New Items at Runtime
- •Assigning Images to Nodes
- •Scanning the TreeView Control
- •The ListView Control
- •The Columns Collection
- •The ListItem Object
- •The Items Collection
- •The SubItems Collection
- •Summary
- •Types of Errors
- •Design-Time Errors
- •Runtime Errors
- •Logic Errors
- •Exceptions and Structured Exception Handling
- •Studying an Exception
- •Getting a Handle on this Exception
- •Finally (!)
- •Customizing Exception Handling
- •Throwing Your Own Exceptions
- •Debugging
- •Breakpoints
- •Stepping Through
- •The Local and Watch Windows
- •Summary
- •Basic Concepts
- •Recursion in Real Life
- •A Simple Example
- •Recursion by Mistake
- •Scanning Folders Recursively
- •Describing a Recursive Procedure
- •Translating the Description to Code
- •The Stack Mechanism
- •Stack Defined
- •Recursive Programming and the Stack
- •Passing Arguments through the Stack
- •Special Issues in Recursive Programming
- •Knowing When to Use Recursive Programming
- •Summary
- •MDI Applications: The Basics
- •Building an MDI Application
- •Built-In Capabilities of MDI Applications
- •Accessing Child Forms
- •Ending an MDI Application
- •A Scrollable PictureBox
- •Summary
- •What Is a Database?
- •Relational Databases
- •Exploring the Northwind Database
- •Exploring the Pubs Database
- •Understanding Relations
- •The Server Explorer
- •Working with Tables
- •Relationships, Indices, and Constraints
- •Structured Query Language
- •Executing SQL Statements
- •Selection Queries
- •Calculated Fields
- •SQL Joins
- •Action Queries
- •The Query Builder
- •The Query Builder Interface
- •SQL at Work: Calculating Sums
- •SQL at Work: Counting Rows
- •Limiting the Selection
- •Parameterized Queries
- •Calculated Columns
- •Specifying Left, Right, and Inner Joins
- •Stored Procedures
- •Summary
- •How About XML?
- •Creating a DataSet
- •The DataGrid Control
- •Data Binding
- •VB.NET at Work: The ViewEditCustomers Project
- •Binding Complex Controls
- •Programming the DataAdapter Object
- •The Command Objects
- •The Command and DataReader Objects
- •VB.NET at Work: The DataReader Project
- •VB.NET at Work: The StoredProcedure Project
- •Summary
- •The Structure of a DataSet
- •Navigating the Tables of a DataSet
- •Updating DataSets
- •The DataForm Wizard
- •Handling Identity Fields
- •Transactions
- •Performing Update Operations
- •Updating Tables Manually
- •Building and Using Custom DataSets
- •Summary
- •An HTML Primer
- •HTML Code Elements
- •Server-Client Interaction
- •The Structure of HTML Documents
- •URLs and Hyperlinks
- •The Basic HTML Tags
- •Inserting Graphics
- •Tables
- •Forms and Controls
- •Processing Requests on the Server
- •Building a Web Application
- •Interacting with a Web Application
- •Maintaining State
- •The Web Controls
- •The ASP.NET Objects
- •The Page Object
- •The Response Object
- •The Request Object
- •The Server Object
- •Using Cookies
- •Handling Multiple Forms in Web Applications
- •Summary
- •The Data-Bound Web Controls
- •Simple Data Binding
- •Binding to DataSets
- •Is It a Grid, or a Table?
- •Getting Orders on the Web
- •The Forms of the ProductSearch Application
- •Paging Large DataSets
- •Customizing the Appearance of the DataGrid Control
- •Programming the Select Button
- •Summary
- •How to Serve the Web
- •Building a Web Service
- •Consuming the Web Service
- •Maintaining State in Web Services
- •A Data-Driven Web Service
- •Consuming the Products Web Service in VB
- •Summary

146 Chapter 3 VISUAL BASIC: THE LANGUAGE
You may also see an odd loop statement like the following one:
While True
{ statements }
End While
This seemingly endless loop must be terminated from within its own body with an Exit statement, which is called when a condition becomes True or False. The following loop terminates when a condition is met in the loop’s body:
While True
{ statements }
If condition Then Exit While { more statements }
End While
Nested Control Structures
You can place, or nest, control structures inside other control structures (such as an If…Then block within a For…Next loop). Control structures in Visual Basic can be nested in as many levels as you want. It’s common practice to indent the bodies of nested decision and loop structures to make the program easier to read.
When you nest control structures, you must make sure that they open and close within the same structure. In other words, you can’t start a For…Next loop in an If statement and close the loop after the corresponding End If. The following pseudocode demonstrates how to nest several flow-control statements:
For a = 1 To 100
{ statements }
If a = 99 Then
{statements } End If
While b < a
{statements }
If total <= 0 Then { statements }
End If End While
For c = 1 to a
{ statements } Next
Next
I’m not showing the names of the count variables after the Next statement, because it’s not necessary. To find the matching closing statement (Next, End If, or End While), move down from the opening statement until you hit a line that starts at the same column. This is the matching closing statement. Notice that you don’t have to align the nested structures yourself. The editor reformats
Copyright ©2002 SYBEX, Inc., Alameda, CA |
www.sybex.com |

FLOW-CONTROL STATEMENTS 147
the code automatically as you edit. It also inserts the matching closing statement—the End If statement is inserted automatically as soon as you enter an If statement, for example.
Listing 3.16 shows the structure of a nested For…Next loop that scans all the elements of a twodimensional array.
Listing 3.16: Iterating through a Two-Dimensional Array
Dim Array2D(6, 4) As Integer |
|
Dim iRow, iCol As Integer |
|
For iRow = 0 To Array2D.GetUpperBound(0) |
|
For iCol = 0 To Array2D.GetUpperBound(1) |
|
Array2D(iRow, iCol) = iRow * 100 + iCol |
|
Console.Write(iRow & “, “ & iCol & “ = “ & Array2D(iRow, iCol) & “ |
“) |
Next iCol |
|
Console.WriteLine() |
|
Next iRow |
|
|
|
The outer loop (with the iRow counter) scans each row of the array, and the inner loop scans each column in the current row. At each iteration, the inner loop scans all the elements in the row specified by the counter of the outer loop (iRow). After the inner loop completes, the counter of the outer loop is increased by one and the inner loop is executed again, this time to scan the elements of the next row. The loop’s body consists of two statements that assign a value to the current array element and then print it in the Output window. The current element at each iteration is Array2D(iRow, iCol).
Part of the output produced by this code segment is shown here. The pair of values separated by a comma are the indices of an element, and its value follows the equal sign:
0, 0 = 0 |
0, 1 = 1 |
0, 2 = 2 |
0, 3 = 3 |
|
0, 4 = 4 |
|
|
|||
1, 0 = 100 |
1, 1 = 101 |
1, 2 = 102 |
1, |
3 = 103 |
1, 4 = 104 |
|||||
2, 0 = 200 |
2, 1 = 201 |
2, 2 = 202 |
2, |
3 = 203 |
2, 4 = 204 |
|||||
3, 0 |
= 300 |
3, 1 |
= 301 |
3, 2 = 302 |
3, |
3 = 303 |
3, 4 |
= 304 |
||
4, 0 |
= 400 |
4, 1 |
= 401 |
4, 2 |
= 402 |
4, |
3 |
= 403 |
4, 4 |
= 404 |
5, 0 |
= 500 |
5, 1 |
= 501 |
5, 2 |
= 502 |
5, |
3 |
= 503 |
5, 4 |
= 504 |
6, 0 |
= 600 |
6, 1 |
= 601 |
6, 2 |
= 602 |
6, |
3 |
= 603 |
6, 4 |
= 604 |
Tip The presence of the counter names iCol and iRow aren’t really required after the Next statement. Actually, if you supply them in the wrong order, Visual Basic will catch the error. In practice, few programmers specify counter values after a Next statement because Visual Basic matches each Next statement to the corresponding For statement. If the loop’s body is lengthy, you can improve the program’s readability by specifying the corresponding counter name after each Next statement.
You can also nest multiple If statements. The structure shown in Listing 3.17 tests a user-sup- plied value to determine whether it’s positive and, if so, determines whether the value exceeds a certain limit.
Copyright ©2002 SYBEX, Inc., Alameda, CA |
www.sybex.com |

148 Chapter 3 VISUAL BASIC: THE LANGUAGE
Listing 3.17: Simple Nested If Statements
Income = InputBox(“Enter your income”)
If Income > 0 Then
If Income > 10000 Then
MsgBox “You will pay taxes this year”
Else
MsgBox “You won’t pay any taxes this year”
End If
Else
MsgBox “Bummer”
End If
The Income variable is first compared with zero. If it’s negative, the Else clause of the If…Then statement is executed. If it’s positive, it’s compared with the value 10,000, and depending on the outcome, a different message is displayed.
The Exit Statement
The Exit statement allows you to exit prematurely from a block of statements in a control structure, from a loop, or even from a procedure. Suppose you have a For…Next loop that calculates the square root of a series of numbers. Because the square root of negative numbers can’t be calculated (the Sqrt() function will generate a runtime error), you might want to halt the operation if the array contains an invalid value. To exit the loop prematurely, use the Exit For statement as follows:
For i = 0 To UBound(nArray)
If nArray(i) < 0 Then Exit For
nArray(i) = Math.Sqrt(nArray(i))
Next
If a negative element is found in this loop, the program exits the loop and continues with the statement following the Next statement.
There are similar Exit statements for the Do loop (Exit Do) and the While loop (Exit While), as well as for functions and subroutines (Exit Function and Exit Sub). If the previous loop was part of a function, you might want to display an error and exit not only the loop, but the function itself:
For i = 0 To nArray.GetUpperBound()
If nArray(i) < 0 Then
MsgBox “Negative value found, terminating calculations”
Exit Function
End If
nArray(i) = Sqr(nArray(i))
Next
If this code is part of a subroutine procedure, you use the Exit Sub statement. The Exit statements for loops are Exit For, Exit While, and Exit Do. There is no way (or compelling reason) to exit prematurely from an If or Case statement.
Copyright ©2002 SYBEX, Inc., Alameda, CA |
www.sybex.com |