- •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
562 Chapter 12 HANDLING STRINGS, CHARACTERS, AND DATES
The value printed this time will be 36,993.631506585647.
Let’s see how the date-manipulation methods deal with leap years. We’ll add 10 years to the current date with the AddYears method, and we’ll print the new value with a single statement:
Console.WriteLine(Now().AddYears(10).ToLongDateString)
The value that will appear in the Output window will be Sunday, April 10, 2011. This method simply changed the value of the year. If you add 3,650 days, you’ll get a different value, because the 10-year span contains at least two leap years:
Console.WriteLine(Now().AddDays(3650).ToOADate)
The new value that will be printed on the Output window will be Friday, April 08, 2011, and the corresponding double value will be 40,643.631506585647.
The TimeSpan Class
The last class discussed in this chapter is the TimeSpan class, which represents a time interval and can be expressed in many different units, from ticks and milliseconds to days. The TimeSpan is usually the difference between two date/time values, but you can also create a TimeSpan for a specific interval and use it in your calculations.
To use the TimeSpan variable in your code, just declare it with a statement like the following:
Dim TS As New TimeSpan
To initialize the TimeSpan object, you can provide a string with the number of days, hours, minutes, seconds, and milliseconds. The following statement initializes a TimeSpan object with a duration of 9 days, 12 hours, 1 minute, and 59 seconds:
Dim TS As TimeSpan = New TimeSpan(9, 12, 1, 59)
As you have seen, the difference between two dates calculated by the Date.Subtract method returns a TimeSpan value. You can initialize an instance of the TimeSpan object by creating two date/time values and getting their difference, as in the following statements:
Dim TS As New TimeSpan
Dim date1 As Date = #4/11/1985#
Dim date2 As Date = Now()
TS = date2.Subtract(date1)
Console.WriteLine(TS)
Depending on the day on which you execute these statements, they will print something like the following on the Output window:
5992.15:58:14.4766848
The days are separated from the rest of the string with a period, while all other items are separated with colons.
Copyright ©2002 SYBEX, Inc., Alameda, CA |
www.sybex.com |
HANDLING DATES 563
Properties
The TimeSpan type exposes the properties described in the following sections. Most of these members are shared.
Field Properties
TimeSpan exposes the simple properties shown in Table 12.3, which are known as fields and are all shared.
Table 12.3: The Fields of the TimeSpan Object
Property |
Returns |
Empty |
An empty TimeSpan object |
MaxValue |
The largest interval you can represent with a TimeSpan object |
MinValue |
The smallest interval you can represent with a TimeSpan object |
TicksPerDay |
The number of ticks in a day |
TicksPerHour |
The number of ticks in an hour |
TicksPerMillisecond |
The number of ticks in a millisecond |
TicksPerMinute |
The number of ticks in one minute |
TicksPerSecond |
The number of ticks in one second |
Zero |
A TimeSpan object of zero duration |
|
|
Interval Properties
In addition to the fields, the TimeSpan class exposes two more groups of properties that return the various intervals in a TimeSpan value; these are the shown in Tables 12.4 and 12.5. The members of the first group of properties return the number of specific intervals (days, hours, and so on) in a TimeSpan value. The second group of properties returns the entire TimeSpan’s duration in one of the intervals recognized by the TimeSpan method.
Table 12.4: The Intervals of a TimeSpan Value
Property |
Returns |
Days |
The number of whole days in the current TimeSpan |
Hours |
The number of whole hours in the current TimeSpan |
Milliseconds |
The number of whole milliseconds in the current TimeSpan. The largest |
|
value of this property is 999. |
Minutes |
The number of whole minutes in the current TimeSpan. The largest value of |
|
this property is 59. |
|
Continued on next page |
Copyright ©2002 SYBEX, Inc., Alameda, CA |
www.sybex.com |
564 Chapter 12 HANDLING STRINGS, CHARACTERS, AND DATES
Table 12.4: The Intervals of a TimeSpan Value (continued)
Property |
Returns |
Seconds |
The number of whole seconds in the current TimeSpan. The largest value of |
|
this property is 59. |
Ticks |
The number of whole ticks in the current TimeSpan |
|
|
Table 12.5: The Total Intervals of a TimeSpan Value
Property |
Returns |
TotalDays |
The total number of days in the current TimeSpan |
TotalHours |
The total number of hours in the current TimeSpan |
TotalMilliseconds |
The total number of whole milliseconds in the current TimeSpan |
TotalMinutes |
The number of whole minutes in the current TimeSpan |
TotalSeconds |
The number of whole seconds in the current TimeSpan |
|
|
If a TimeSpan value represents 2 minutes and 10 seconds, the Seconds property will return the value 10. The TotalSeconds property, however, will return the value 70, which is the total duration of the TimeSpan in seconds.
Warning Be very careful when choosing the property to express the duration of a TimeSpan in a specific interval. Since both properties will return a value, you may not notice that you’re using the wrong property for the task at hand.
Duration
This property returns the duration of the current instance of the TimeSpan. The duration is expressed as the number of days, followed by the number of hours, minutes, seconds, and milliseconds. The following statements create a TimeSpan object of a few seconds (or minutes, if you don’t mind waiting) and print its duration in the Output window. The first few statements initialize a new instance of the Date type, the T1 variable, to the current date and time. Then a message box is displayed that prompts to click the OK button to continue. Wait for several seconds before closing the message box. The last group of statements subtract the T1 variable from the current time and display the duration (this is how long you kept the message box open on your screen).
Dim T1, T2 As Date
T1 = Now
MsgBox(“Click OK to continue”)
T2 = Now
Copyright ©2002 SYBEX, Inc., Alameda, CA |
www.sybex.com |
HANDLING DATES 565
Dim TS As TimeSpan
TS = T2.Subtract(T1)
Console.WriteLine(“Total duration = “ & TS.Duration.ToString)
Console.WriteLine(“Minutes = “ & TS.Minutes.ToString)
Console.WriteLine(“Seconds = “ & TS.Seconds.ToString)
Console.WriteLine(“Ticks = “ & TS.Ticks.ToString)
Console.WriteLine(“Milliseconds = “ & TS.TotalMilliseconds.ToString)
Console.WriteLine(“Total seconds = “ & TS.TotalSeconds.ToString)
If you place these statements in a button’s Click event handler and execute them, you’ll see a series of values like the following in the Output window:
Total duration = 00:01:50.1183424
Minutes = 1
Seconds = 50
Ticks = 1101183424
Milliseconds = 110118.3424
Total seconds = 110.1183424
Methods
There are various methods for creating and manipulating instances of the TimeSpan class; these are described in the following sections.
Interval Methods
The methods in Table 12.6 create a new TimeSpan object of a specific duration. Each duration is specified as a number of intervals, accurate to the nearest millisecond.
Table 12.6: Interval Methods of the TimeSpan Object
Method |
Creates a New TimeSpan of This Length |
FromDays |
Number of days specified by the argument |
FromHours |
Number of hours specified by the argument |
FromMinutes |
Number of minutes specified by the argument |
FromSeconds |
Number of seconds specified by the argument |
FromMilliseconds |
Number of milliseconds specified by the argument |
FromTicks |
Number of ticks specified by the argument |
|
|
All methods accept a single argument, which is a Double value that represents the number of the corresponding intervals (days, hours, and so on).
Copyright ©2002 SYBEX, Inc., Alameda, CA |
www.sybex.com |
566 Chapter 12 HANDLING STRINGS, CHARACTERS, AND DATES
Parse(string)
This method creates a new TimeSpan object from a string with the TimeSpan format (days, followed by a period, followed by the hours, minutes, and seconds separated by colons). The following statements creates a new TimeSpan variable with a duration of 3 days, 12 hours, 20 minutes, 30 seconds, and 500 milliseconds:
Dim SP As New TimeSpan()
SP = TimeSpan.Parse(“3.12:20:30.500”) Console.WriteLine(SP)
3.12:20:30.5000000
Add
This method adds a TimeSpan object to the current instance of the class; its syntax is
newTS = TS.Add(TS1)
where TS, TS1, and newTS are all TimeSpan variables. The following statements create two TimeSpan objects and then add them:
Dim TS1 As New TimeSpan(“1:00:01”)
Dim TS2 As New TimeSpan(“2:01:09”)
Dim TS As New TimeSpan
TS = TS1.Add(TS2)
The duration of the new TimeSpan variable is 3 hours, 1 minute, and 10 seconds. A more practical example is the following, which constructs a TimeSpan object using the Fromxxx methods described in Table 12.6. The following statements create a TimeSpan object with a duration of 3 hours, 2 minutes, 16 seconds, and 500 milliseconds:
Dim TS As New System.TimeSpan()
TS = System.TimeSpan.FromHours(3)
TS = TS.Add(System.TimeSpan.FromMinutes(2))
TS = TS.Add(System.TimeSpan.FromSeconds(16))
TS = TS.Add(System.TimeSpan.FromMilliseconds(500))
Console.WriteLine(“The total Time Span is “ & TS.ToString)
The total duration of the TS TimeSpan variable is 3 hours, 2 minutes, 16 seconds, and 500 milliseconds. If you print the TS variable, its value will be: 03:02:16.5000000.
Subtract
The Subtract method subtracts a TimeSpan object from the current instance of the TimeSpan class. The following statements create two TimeSpan objects with different durations. Then, the two time spans are subtracted and their difference is printed in three different ways:
Dim T1, T2 As TimeSpan
T1 = New TimeSpan(3, 9, 10, 12)
T2 = New TimeSpan(0, 1, 0, 59, 3)
Dim TS As TimeSpan = T2.Subtract(T1)
Console.WriteLine(TS.Duration())
Copyright ©2002 SYBEX, Inc., Alameda, CA |
www.sybex.com |