- •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
448 Chapter 10 AUTOMATING MICROSOFT OFFICE APPLICATIONS
If you want to replace one or more instances of a word (or sentence) in the text, set the ReplaceWith argument to the replacement text and the Replace argument to one of the values wdReplaceAll or wdReplaceOne, depending on whether you want to replace a single or all instances of the text. The code segment in Listing 10.4 replaces all instances of “VB7” to “VB.NET” and removes the multiple spaces from the document.
Listing 10.4: Massaging a Word Document
Private Sub Button3_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles Button3.Click Dim thisDoc As Word.Document
Dim thisRange As Word.Range WordApp.Documents.Open(“c:\sample.doc”) WordApp.Visible = False
thisDoc = WordApp.ActiveDocument thisDoc.Content.Find.Execute(FindText:=”VB7”, ReplaceWith:=”VB.NET”, _
Replace:=Word.WdReplace.wdReplaceAll) While thisDoc.Content.Find.Execute(FindText:=” “, _
Wrap:=Word.WdFindWrap.wdFindContinue) thisDoc.Content.Find.Execute(FindText:=” “, ReplaceWith:=” “, _
Replace:=Word.WdReplace.wdReplaceAll, _
Wrap:=Word.WdFindWrap.wdFindContinue)
End While WordApp.Documents.Item(1).Save()
MsgBox(“Replaced all instances of ‘VB7’ with ‘VB.NET’ and saved the document”) WordApp.Documents.Item(1).Close()
End Sub
For the WordDemo application, we must specify the string to search for and the replacement string. The program searches for two consecutive spaces, and if found, replaces them with a single space. Notice that the replacement of all instances of “VB7” with “VB.NET” is carried out by a single call to the Find.Execute method. The wdReplaceAll option tells Word to replace all instances of the string throughout the document. Replacing the multiple spaces, however, is not as simple, because you may have more than two spaces in a row. The code sets up a While loop, which repeats while the Find.Execute method reports that instances of two or more consecutive spaces exist. In the loop’s body, we call the Find.Execute method, this time specifying a replacement string.
Note To test this application, create a short document with several instances of the string “VB7” and insert multiple spaces between its words. Save the document as sample.doc in the root folder of the C: drive and then run the application. You will find a simple file named sample.doc in the application’s folder on the CD.
Spell-Checking Documents
One of the most useful features of Word (and of every Office application) is its ability to spellcheck a document. This functionality is also exposed by Word’s objects, and you can borrow it for use within your Visual Basic applications. This is not only possible, it’s actually quite simple. To call
Copyright ©2002 SYBEX, Inc., Alameda, CA |
www.sybex.com |
PROGRAMMING WORD 449
upon Word’s spell-checking routines, you need to know about two objects: the ProofreadingErrors and SpellingSuggestions collections.
The ProofreadingErrors collection is a property of the Range object and it contains the misspelled words in the Range. To ask Word to spell-check a range of text and populate the ProofreadingErrors collection, call the Range object’s SpellingErrors method. This method returns a result that must be stored in an object variable of type ProofreadingErrors:
Dim SpellCollection As ProofreadingErrors
Set SpellCollection = DRange.SpellingErrors
DRange is Range object (a paragraph or an entire document). The second line populates the SpellCollection variable with the misspelled words. You can then set up a For Each…Next loop to read the words from the collection.
Besides locating spelling errors, Word can also suggest a list of alternate spellings or words that sound like the misspelled one. To retrieve the list of alternate words, you call the GetSpellingSuggestions method of the Application object, passing the misspelled word as an argument. Notice that this is a method of the Application object, not of the Range object you’re spell-checking. The results returned by the GetSpellingSuggestions method must be stored in another collection, this one of the SpellingSuggestions type:
Dim CorrectionsCollection As SpellingSuggestions
Set CorrectionsCollection = AppWord.GetSpellingSuggestions(“antroid”)
The second line retrieves the suggested alternatives for the word antroid. To scan the list of suggested words, you set up a loop that retrieves all the elements of the CorrectionsCollection collection. The example in the next section demonstrates the use of both methods from within a Visual Basic application.
VB.NET at Work: The WordSpellChecker Project
WordSpellChecker is an application that uses Word’s methods to spell-check a text file. You’ll find the WordSpellChecker application in this chapter’s folder on the CD; its main form, shown in Figure 10.2, consists of a multiline TextBox control on which the user can enter some text and spellcheck it by clicking the SpellCheck Document button.
Figure 10.2
The WordSpellChecker application’s main form
Copyright ©2002 SYBEX, Inc., Alameda, CA |
www.sybex.com |
450 Chapter 10 AUTOMATING MICROSOFT OFFICE APPLICATIONS
The application will contact Word and request the list of misspelled words. The list of misspelled words is displayed on a ListBox control on the same Form, as shown in Figure 10.2. The ListBox control on the left shows all the misspelled words returned by Word. Word can not only locate misspelled words but suggest alternatives as well. To view the alternate spellings for a specific word, select the word in the left list by double-clicking it.
To replace all instances of the selected misspelled word with the selected alternative, click the Replace button. You can design your own interface to allow the user to select which and how many instances of the misspelled word in the original document will be replaced.
The program uses three public variables, which are declared as follows:
Public WordApp As Application
Public CorrectionsCollection As SpellingSuggestions
Public SpellCollection As ProofreadingErrors
The SpellCollection variable is a collection that contains all the misspelled words, and the CorrectionsCollection variable is another collection that contains the suggested spellings for a specific word. The CorrectionsCollection variable’s contents are changed every time the user selects another misspelled word in Word’s Spelling Suggestions window.
When the SpellCheck Document button is clicked, the program creates a new document and copies the TextBox control’s contents to the new document using the InsertAfter method of the Range object, as follows:
WordApp.Documents.Add
Dim Drange As Word.Range
Drange = WordApp.ActiveDocument.Range
DRange.InsertAfter(Text1.Text)
Now comes the interesting part. The Visual Basic code calls the Range object’s SpellingErrors method, which returns a collection of ProofreadingErrors objects. The result of the SpellingErrors method is assigned to the object variable SpellCollection:
Dim SpellCollection As Word.ProofreadingErrors
Set SpellCollection = DRange.SpellingErrors
The lines in Listing 10.5—the SpellCheck Document button’s Click event handler—spell-check the document and add the words contained in the SpellCollection collection (the misspelled words) to the ListBox1 control.
Listing 10.5: The Check Document Button
Private Sub Button1_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles Button1.Click
Dim DRange As Word.Range
Me.Text = “Starting Word ...”
WordApp.Documents.Add()
Me.Text = “Checking words...”
DRange = WordApp.ActiveDocument.Range
DRange.InsertAfter(TextBox1.Text)
Copyright ©2002 SYBEX, Inc., Alameda, CA |
www.sybex.com |
PROGRAMMING WORD 451
Dim SpellCollection As Word.ProofreadingErrors SpellCollection = DRange.SpellingErrors
If SpellCollection.Count > 0 Then ListBox1.Items.Clear() ListBox2.Items.Clear()
Dim iword As Integer Dim newWord As String
For iword = 1 To SpellCollection.Count newWord = SpellCollection.Item(iword).Text
If ListBox1.FindStringExact(newWord) < 0 Then ListBox1.Items.Add(newWord)
End If Next
End If
Me.Text = “Word spelling Demo” End Sub
The document is checked in a single statement, which calls the SpellingErrors method of a Range object that contains the entire text. Then the program goes through every word in the SpellCollection collection and adds them to the ListBox1 control. Notice that the ListBox control with the misspelled words doesn’t contain duplicate entries. The code uses the control’s FindStringExact method to find out whether a word belongs to the list or not.
Every time an entry in this ListBox is clicked, the code calls the WordApp object’s GetSpellingSuggestions method, passing the selected word as an argument. The GetSpellingSuggestions method returns another collection with the suggested words, which are placed in the second ListBox control on the Form with the statements shown in Listing 10.6. If this collection is empty (Word can’t suggest any alternatives), the string “No suggestions!” is displayed on the control.
Listing 10.6: Retrieving Correction Suggestions
Private Sub ListBox1_SelectedIndexChanged(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles ListBox1.SelectedIndexChanged
Dim CorrectionsCollection As Word.SpellingSuggestions CorrectionsCollection = WordApp.GetSpellingSuggestions(ListBox1.Text) ListBox2.Items.Clear()
If CorrectionsCollection.Count > 0 Then Dim iWord As Integer
For iWord = 1 To CorrectionsCollection.Count ListBox2.Items.Add(CorrectionsCollection.Item(iWord).Name)
Next Else
ListBox2.Items.Add(“No suggestions!”) End If
End Sub
Copyright ©2002 SYBEX, Inc., Alameda, CA |
www.sybex.com |
452 Chapter 10 AUTOMATING MICROSOFT OFFICE APPLICATIONS
You can also replace misspelled words in the document with one of the suggested alternatives by clicking the Replace Word button. When you do, the application calls the Replace function to replace all instances of the selected word with the selected alternative. After that, it removes the misspelled word from the list. The code behind the Replace Word button is shown in Listing 10.7.
Listing 10.7: Replacing Misspelled Words
Private Sub Button2_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles Button2.Click
If ListBox1.SelectedIndex >= 0 And ListBox2.SelectedIndex >= 0 Then
TextBox1.Text = Replace(TextBox1.Text, _
ListBox1.SelectedItem, ListBox2.SelectedItem)
ListBox1.Items.Remove(ListBox1.SelectedIndex)
ListBox2.Items.Clear()
End If
End Sub
The WordSpellChecker application can become the starting point for many custom Visual Basic applications that require spell-checking but don’t need powerful editing features. In some cases, you might want to customize spelling, although it’s not a very common situation. In a mail-aware application, for example, you can spell-check the text and exclude URLs and e-mail addresses. You would first scan the words returned by the SpellingErrors method to check which ones contained special characters and omit them.
As you can see, tapping into the power of the Office applications isn’t really complicated. Once you familiarize yourself with the objects of these applications, you can access the Office applications by manipulating a few properties and calling the methods of these objects.
If you have a list of words to spell-check, you can call the CheckSpelling method of the Word.Application object to check the spelling of each word. The loop shown in Listing 10.8 goes through each word in a list and checks its spelling. If the word is misspelled, it’s added to a second ListBox control. This application uses the Word.Application object and doesn’t create a document with the text to be spell-checked.
Listing 10.8: Spell-Checking a List of Words
Dim WordApp As New Word.application()
Private Sub Button1_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles Button1.Click
Dim SpellCollection As Word.ProofreadingErrors
Dim wrd As Integer
ListBox2.Items.Clear()
Dim words As Integer = ListBox1.Items.Count
For wrd = 0 To words - 1
Me.Text = “Spelling ... “ & CInt(wrd / words * 100) & “ % done”
If Not WordApp.CheckSpelling(ListBox1.Items(wrd)) Then
Copyright ©2002 SYBEX, Inc., Alameda, CA |
www.sybex.com |