Enhancing Visual Basic .NET
Applications Far Beyond the
Scope of Visual Basic 6.0
“How to do the things that you used to d...
Enhancing Visual Basic .NET Beyond the Scope of Visual Basic 6.0 – David Ross Goben
Page –2–
Table of Contents
Preface ......
Enhancing Visual Basic .NET Beyond the Scope of Visual Basic 6.0 – David Ross Goben
Page –3–
Notes Regarding Class Constru...
Enhancing Visual Basic .NET Beyond the Scope of Visual Basic 6.0 – David Ross Goben
Page –4–
Using a Delegate to Perform S...
Enhancing Visual Basic .NET Beyond the Scope of Visual Basic 6.0 – David Ross Goben
Page –5–
First, News of Free VB.NET Li...
Enhancing Visual Basic .NET Beyond the Scope of Visual Basic 6.0 – David Ross Goben
Page –6–
PART TWO --------------------...
Enhancing Visual Basic .NET Beyond the Scope of Visual Basic 6.0 – David Ross Goben
Page –7–
Black Book Tip # 10: Get The ...
Enhancing Visual Basic .NET Beyond the Scope of Visual Basic 6.0 – David Ross Goben
Page –8–
Black Book Tip # 55: Converti...
Enhancing Visual Basic .NET Beyond the Scope of Visual Basic 6.0 – David Ross Goben
Page –9–
PREFACE
This tome was first r...
Enhancing Visual Basic .NET Beyond the Scope of Visual Basic 6.0 – David Ross Goben
Page –10–
VB2010 added many welcome la...
Enhancing Visual Basic .NET Beyond the Scope of Visual Basic 6.0 – David Ross Goben
Page –11–
Introduction
Transitioning f...
Enhancing Visual Basic .NET Beyond the Scope of Visual Basic 6.0 – David Ross Goben
Page –12–
you no longer need to worry ...
Enhancing Visual Basic .NET Beyond the Scope of Visual Basic 6.0 – David Ross Goben
Page –13–
For example, many, but not a...
Enhancing Visual Basic .NET Beyond the Scope of Visual Basic 6.0 – David Ross Goben
Page –14–
long as a platform has a Mic...
Enhancing Visual Basic .NET Beyond the Scope of Visual Basic 6.0 – David Ross Goben
Page –15–
NOTE: The difference between...
Enhancing Visual Basic .NET Beyond the Scope of Visual Basic 6.0 – David Ross Goben
Page –16–
You can bring up the Object ...
Enhancing Visual Basic .NET Beyond the Scope of Visual Basic 6.0 – David Ross Goben
Page –17–
What is an Application Domai...
Enhancing Visual Basic .NET Beyond the Scope of Visual Basic 6.0 – David Ross Goben
Page –18–
Object-Oriented Programming
...
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0
Upcoming SlideShare
Loading in …5
×

Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0

9,766 views

Published on

Updated and Expanded. Taking what one learned under VB6 and turbo charge it with VB.NET savvy. This document reviews the fundamental differences between VB6 and VB.NET, and how to deal with and exploit those changes. A plethora of solution examples are featured. Numerous articles are also included, demonstrating often simple coding techniques to accomplish amazing feats for what many online have claimed was impossible.

Published in: Technology, News & Politics
2 Comments
2 Likes
Statistics
Notes
  • Download Here:http://www.sendspace.com/file/8kn03w
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
  • I too am a former VB6 programmer. I was hesitant at first to switch to .Net, but I am very glad I did. There is so much information here that I am a bit overwhelmed but I am going to stick with it. I don't know how to thank DRG enough for this incredible treasure trove of ideas and information.
    I am immediately taking steps to at least put one of your suggestions in place. I am referring to the 'Option Explicit' and 'Option Strict' compile options. I am going back through every program I have and turning those 2 options on. I have already run into some errors just by turning them on, so this is a very good thing.
    Thank you Mr. Goben
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
No Downloads
Views
Total views
9,766
On SlideShare
0
From Embeds
0
Number of Embeds
5
Actions
Shares
0
Downloads
299
Comments
2
Likes
2
Embeds 0
No embeds

No notes for slide

Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0

  1. 1. Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0 “How to do the things that you used to do under VB6 even better under VB.NET, and how to make your VB.NET applications accomplish so very much more.” Written and Edited by David Ross Goben Copyright © 2010-2016 by David Ross Goben All rights reserved. (Last updated February 24, 2016) (The above two logos are registered trademarks of Microsoft Corporation) This title was originally published as “Visual Basic .NET Compared to Visual Basic 6.0” in July, 2010. NOTE: You can download the latest update of this PDF document for free at Google Docs: https://drive.google.com/file/d/0B_Dj_dKazINlcmpucEFPeVBObjg/view?usp=sharing Source Listings are available, unbroken by page breaks, in “Code Excerpts from Enhancing Visual Basic .NET.rtf”: https://drive.google.com/file/d/0B_Dj_dKazINlMlA5UUx6R2JLOG8/view?usp=sharing
  2. 2. Enhancing Visual Basic .NET Beyond the Scope of Visual Basic 6.0 – David Ross Goben Page –2– Table of Contents Preface ..................................................................................................................................................9 Introduction.........................................................................................................................................11 Why Is VB.NET Not 100% Compatible with VB6?.....................................................................................12 Why .NET?..................................................................................................................................................13 What is Dot NET?................................................................................................................................................. 14 What is the .NET Framework? .............................................................................................................................. 14 What is a Namespace?......................................................................................................................................... 15 What is an Application Domain?............................................................................................................................ 16 What is a Solution/Assembly?............................................................................................................................... 17 What is a Project? ................................................................................................................................................ 17 Object-Oriented Programming....................................................................................................................18 Classes and Objects............................................................................................................................................. 18 Fields, Properties, Methods, and Events ............................................................................................................... 20 Encapsulation, Inheritance, and Polymorphism...................................................................................................... 20 Overloading, Overriding, and Shadowing............................................................................................................... 21 Scoping Rules...................................................................................................................................................... 21 My Basic Guidelines for VB.NET Development .........................................................................................22 Conclusion to the Introduction....................................................................................................................23 Noteworthy VB.NET Features That Differ from, or are New to VB6.................................................25 Notes Regarding the VB6 Compatibility Library.........................................................................................25 Notes Regarding All String Variables in VB.NET Now Being Reference Types........................................26 Notes Regarding Sending Structures to P/Invokes....................................................................................27 Notes Regarding Fixed-Length Strings ......................................................................................................28 A Note Regarding Passing Parameters ByVal...........................................................................................29 A Note Regarding Returning Value Data via the Return Command from Functions.................................30 A Note Regarding Multi-Variable Declarations...........................................................................................30 Notes Regarding Collections Now Storing Objects, Not Simple Strings....................................................30 A Note Regarding VB.NET Default Properties That Cannot Be Parameterless........................................32 A Note Regarding VB.NET Having Dropped the 'Let' Keyword.................................................................32 A Note Regarding New and Wider Variable Definitions.............................................................................33 Notes Regarding Edit and Continue...........................................................................................................33 Notes Regarding the VB.NET GET/SET Property Format.........................................................................33 A Note Regarding the Support of Using…End Using.................................................................................34 A Note Regarding the New 'IsNot' Keyword...............................................................................................34 A Note Regarding the New 'AndAlso' Keyword..........................................................................................34 A Note Regarding the New 'OrElse' Keyword ............................................................................................34 A Note Regarding Overloading, and Why We Should Welcome It ............................................................35 A Note Regarding New Variable Types SByte, UShort, UInteger, ULong, and UIntPtr ............................35 A Note Regarding Partial Classes and Structures .....................................................................................35 A Note Regarding Form-Linked Controls ...................................................................................................36 A Note Regarding Better IntelliSense.........................................................................................................36 A Note Regarding Accessing Common or All Options in IntelliSense Popups..........................................36 A Note Regarding Snippets........................................................................................................................36 A Note Regarding the Exception Assistant ................................................................................................36 A Note Regarding the Immediate Window .................................................................................................37 A Note Regarding Debug Trace Enhancements........................................................................................37 A Note Regarding the Continue Statement................................................................................................37 A Note Regarding Data Source Binding.....................................................................................................37 A Note Regarding the Conditional Operator...............................................................................................37 A Note Regarding Structured Exception Handling.....................................................................................37 A Note Regarding Type Inference..............................................................................................................37 A Note Regarding Anonymous Typing.......................................................................................................37 A Note Regarding Enumerators .................................................................................................................38 A Note Regarding Optional Event Parameters...........................................................................................38 Notes Regarding the MY Namespace........................................................................................................38
  3. 3. Enhancing Visual Basic .NET Beyond the Scope of Visual Basic 6.0 – David Ross Goben Page –3– Notes Regarding Class Construction and Destruction...............................................................................39 Notes Regarding New Style P/Invoke Signatures......................................................................................42 A Note Regarding the VB.NET Form Event Firing Sequence....................................................................45 Notes Regarding Form Command Changes..............................................................................................46 Notes Regarding MouseMove Event Parameters......................................................................................48 A Note Regarding Type Object as the New Universal Data Type .............................................................50 A Note Regarding the Instance Handle......................................................................................................51 A Note Regarding Checking For a Previous Application Instance.............................................................51 A Note Regarding Getting the App Title.....................................................................................................52 A Note Regarding Getting the App Path and the App EXE Name..................................................................52 A Note Regarding Reviving the VB6 App Command.................................................................................52 A Note Regarding Collections Enhancements ...........................................................................................54 Notes Regarding Registry I/O.....................................................................................................................54 A Note Regarding Adjusting Form Opacity (Transparency).......................................................................54 A Note Regarding Literal Type Characters ................................................................................................55 Notes Regarding Loading Images..............................................................................................................55 Notes Regarding Loading Icons .................................................................................................................56 Notes Regarding Embedding Classes........................................................................................................57 Notes Regarding Accessing Private Class Members from a Sister Object ...............................................57 Notes Regarding the Checked State of a CheckedListBox........................................................................59 Notes Regarding New String Manipulation Features.................................................................................59 Featured Articles 60 VB.NET Generics Collection Classes................................................................................................61 Generic Collections ......................................................................................................................................61 Generics ......................................................................................................................................................61 Generics Collection Classes.........................................................................................................................63 How to Perform Easy Font Manipulation at Runtime under VB.NET...............................................64 Easily Change Font Sizes at Runtime...........................................................................................................64 Easily Change Font Styles at Runtime (Bold, Italic, Underline, and Strikethrough) ........................................64 Easily Change Font Names at Runtime ........................................................................................................65 Building a Suite of Runtime Font Modification Tools......................................................................................66 Drawing Labels with Transparent Backgrounds over Images.........................................................68 Easily Placing Labels with Transparent Backgrounds over Controls..............................................................68 Painting Text Directly onto Controls with Ease..............................................................................................70 Painting Text across Multiple Controls with Ease..........................................................................................71 Emulating VB6 Image Control Features in VB.NET..........................................................................72 Painting Images on a Form...........................................................................................................................72 Image with Transparency Rendering over Multiple Controls..........................................................................79 Emulating What VB6 Image Controls Do Using a Borderless Form...............................................................81 Room for Improvement....................................................................................................................................... 83 Emulating What VB6 Image Controls Do Using a PictureBox........................................................................88 Emulating What VB6 Image Controls Do Using a Resource Icon ..................................................................89 Super-Fast No-Holds-Barred VB6 Image Emulation......................................................................................91 Emulating Mouse Interaction on Drawn Images............................................................................................91 Conclusion ...................................................................................................................................................92 Implementing Unions in VB.NET .......................................................................................................93 Structures that use Sub-Structures and Union Sub-Structures......................................................................97 Understanding VB.NET Imports.......................................................................................................100 Namespaces, Modules, and Non-Inheritable Classes: Siblings by Different Names......................100 Using Imports Aliases ...................................................................................................................101 Referencing Class Code without Importing or Instantiation ...........................................................101 Understanding VB.NET Delegates...................................................................................................102 Delegates in Events ...................................................................................................................................102 Delegates and AddressOf...........................................................................................................................103 Delegates and Callbacks............................................................................................................................104 Invoking Methods through Delegates..........................................................................................................105
  4. 4. Enhancing Visual Basic .NET Beyond the Scope of Visual Basic 6.0 – David Ross Goben Page –4– Using a Delegate to Perform Super-Fast Shell-Metzner Sorts on Any 1D Array...........................................106 Closing Notes on Delegates .......................................................................................................................110 VB.NET Structures Compared to VB6 User-Defined Types...........................................................112 Releasing COM Objects from Memory in VB.NET..........................................................................115 Changed Behavior of VB6 Functions in VB.NET............................................................................116 Array Function...........................................................................................................................................116 Dir Function ...............................................................................................................................................116 Get#, Put# Functions.................................................................................................................................116 IsObject Function ......................................................................................................................................116 Mod Operator ............................................................................................................................................117 Return Statement ......................................................................................................................................117 SavePicture Statement..............................................................................................................................117 Str Function ...............................................................................................................................................117 TypeName Function ..................................................................................................................................117 TypeOf Function........................................................................................................................................118 VarType Function ......................................................................................................................................118 Upgrading Win32 Data Types for VB.NET P/Invokes .....................................................................119 Fix-Length Strings......................................................................................................................................119 Strings Used in Interfaces...........................................................................................................................120 Strings Used in Platform Invoke..................................................................................................................120 Strings Used in Structures..........................................................................................................................121 Fixed-Length String Buffers........................................................................................................................122 Dealing with "As Any" in P/Invoke Signatures .............................................................................................122 Using the AsAny Marshalling Parameter.....................................................................................................123 List of All .NET UnmanagedType Members ................................................................................................124 Thread Creation, Queue Hooking, and Other Special P/Invoke Features ....................................................126 String Formats Changes between VB6 and VB.NET ......................................................................127 Marshaling Memory and Passing Strings to P/Invokes in VB.NET................................................129 Upgrading Administrative Rights Checks.......................................................................................133 Running applications that require Administrative Privileges.........................................................................133 Check for the User having Administrative Rights.........................................................................................134 Running Applications Requiring Administrative Rights without Being Prompted ..........................................134 Disabling User Account Control through your User Account Settings ..................................................................................135 Disabling User Account Control through the Control Panel..................................................................................................135 Disabling User Account Control through MSCONFIG ..........................................................................................................135 Disabling User Account Control through Editing the Registry...............................................................................................135 Adding Run-Time Custom Menus and Cloneable ToolStripMenuItems to VB.NET......................136 Understanding Menus by Converting a MenuStrip to a MainMenu ..............................................................136 Optimizing MainMenu Design Code............................................................................................................141 Building ContextMenuStrip PopUp Menus on the Fly..................................................................................144 Building MenuStrips on the Fly ...................................................................................................................145 Cloning MenuStrip Items with a Cloneable ToolStripMenuItem Class..........................................................145 Using cToolStripMenuItem.CloneMenu to Create a New MergeMenuStrip Method .....................................148 Conclusion .................................................................................................................................................149 Adding Window and File Lists to VB.NET Menus.......................................................................... 150 Maintaining an Active Child Windows List............................................................................................... 150 Adding an Open Window List to a VB.NET MenuStrip menu................................................................................ 151 Adding a MainMenu and ContextMenu control to your VB.NET Toolbox............................................................... 152 Maintaining a Most Recently Used File List ............................................................................................ 152 MRU File Support under VB6.............................................................................................................................. 153 MRU File Support under VB.NET........................................................................................................................ 157 Flicker-Free VB.NET Form Resizing ................................................................................................162 The Minimalist Solution for Form Resizing Flicker...................................................................................163 Adding a Little Pizzazz to the Minimalist Solution....................................................................................164 Adding More Pizzazz to Build a More Stable Solution.............................................................................164 Adding Alotta Pizzazz: Professional Results by Intercepting the Windows Message Queue .................165 Form Resize Subclassing under VB6............................................................................................................... 166 Form Resize Subclassing under VB.NET......................................................................................................... 168 Easy Ways to Draw Lines and Shapes, and to Paint in VB.NET....................................................172
  5. 5. Enhancing Visual Basic .NET Beyond the Scope of Visual Basic 6.0 – David Ross Goben Page –5– First, News of Free VB.NET Line and Shape Controls ............................................................................172 Drawing Lines from the Paint Event .........................................................................................................172 Drawing Rectangles from the Paint Event................................................................................................174 Drawing Ellipses (Circular Shapes) from the Paint Event........................................................................176 Painting Backgrounds with Patterns.........................................................................................................176 Painting the Background of Odd Shapes Using a Flood Fill....................................................................178 GDI FloodFill..................................................................................................................................................... 178 GDI+ FloodFill................................................................................................................................................... 180 Drawing Other Shapes from the Paint Event ...........................................................................................184 Drawing Super-Fast Rounded Rectangles from the Paint Event.............................................................184 Drawing Shapes Outside of the Paint Event ............................................................................................189 Conclusion ................................................................................................................................................190 Adding Images to ListBoxes and ComboBoxes with Ease under VB.NET...................................191 Principle features of an Owner-Drawn ListBox (and ComboBox)............................................................191 Using A Generic List Collection and an ImageListControl .......................................................................192 Using A Flag at the Start of the List Item Text..........................................................................................193 Using a Custom Class as a List Item to Index Graphics..........................................................................194 Centering a Message Box on a Form under VB.NET......................................................................196 The Simple Explanation of Centering a Message Box on a Form ...........................................................196 Some Background Information .................................................................................................................196 A More Detailed Explanation of Centering a Message Box on a Form....................................................197 The Detailed Explanation of Centering a Message Box on a Form .........................................................197 Putting It All Together ...............................................................................................................................202 Restoring Raster Graphics and Rubber Bands to .NET................................................................ 204 Getting an Image Graphics Object Without Going Through the Paint() Event........................................ 205 Restoring Raster Operations to .NET...................................................................................................... 205 Getting One's Hands Dirty................................................................................................................................... 206 The GDI32 Class ................................................................................................................................................ 208 Emulating a Selection Rubber Band under GDI...................................................................................... 214 Emulating a Selection Rubber Band under GDI+.................................................................................... 215 Using the GDI+ DrawReversibleFrame() Method.................................................................................................. 215 Using the GDI+ DrawRectangle() Method and a Translucent Brush...................................................................... 217 Extending VB.NET Controls Functionality..................................................................................... 219 Demonstrating Control Extension Using the VB.NET ComboBox (and ListBox).................................... 219 Win32 ComboBox Messages............................................................................................................................... 220 The CB_DIR Message (and how to make it work under VB.NET) ......................................................................... 221 The CB_SETTOPINDEX and CB_GETTOPINDEX Messages.............................................................................. 224 The CB_SETEXTENDEDUI and CB_GETEXTENDEDUI Messages..................................................................... 225 The CB_SETCURSEL Message.......................................................................................................................... 226 Adding a CheckBox to the Edit Field of a ComboBox ........................................................................................... 227 Sizing the ComboBox DropDown List Width......................................................................................................... 228 Sizing the ComboBox DropDown List Height........................................................................................................ 230 Adding the DriveListBox, DirListBox, and FileListBox Controls to VB.NET ............................................ 231 Send (SMTP) and Retrieve (POP3) Email with Ease under VB.NET ............................................. 233 Adding the VB6 MAPISession and MAPIMessage Controls to VB.NET................................................. 233 PART ONE ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- Sending Email under VB.NET using Native Methods ....................................................................... 234 Quick and Dirty Email Senders .................................................................................................................... 234 TCP Ports, SSL Authentication, and Creating Credentials............................................................................. 236 An Email Sender with a Lot of Muscle .......................................................................................................... 237 Sending Email Messages as HTML ........................................................................................................................... 240 Sending Alternate Message Views.............................................................................................................................. 241 Sending a Plain Text Message Body and a RichText AlternateView........................................................................... 244 Sending Alternate Message Views with Different Context Types and Transfer Encoding ........................................... 245 Typical Email Server Specifications ..................................................................................................................249
  6. 6. Enhancing Visual Basic .NET Beyond the Scope of Visual Basic 6.0 – David Ross Goben Page –6– PART TWO ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- Encoding and Decoding Email Data.................................................................................................. 250 Allowing Users to Specify Content-Type and Content-Transfer-Encoding Options ......................................... 251 Determining if Text can be Sent Encoded As Quoted-Printable, Base64, or 7Bit............................................ 252 Converting 8-Bit HTML Data to 7-Bit for Sending without Loss of Integrity ..................................................... 253 Converting 8-Bit Text Data to 7-Bit for Sending without Data Loss................................................................. 253 Decoding Quoted-Printable Text .................................................................................................................. 255 Translating Base64 Data Back to Its Original Format.................................................................................... 255 Translating BinHex Data Back to its Original Format..................................................................................... 258 PART THREE ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ Receiving Email under VB.NET using Native Methods..................................................................... 259 Connecting to a POP3 Server...................................................................................................................... 262 Checking for a POP3 Server Response........................................................................................................ 264 Checking for Being Connected to a POP3 Server......................................................................................... 264 Getting a Response from the POP3 Server .................................................................................................. 264 Submitting a Request to the POP3 Server.................................................................................................... 266 Disconnecting from the POP3 Server........................................................................................................... 266 Getting Email Statistics from the POP3 Server ............................................................................................. 267 Getting an Email Reference List from the POP3 Server ................................................................................ 267 Get an Email Header from the POP3 Server................................................................................................. 268 Retrieve an Email from the POP3 Server ..................................................................................................... 269 Deleting an Email from the POP3 Server...................................................................................................... 270 Reset (Undo) All Deletes from the POP3 Server........................................................................................... 270 Send a 'Keep-Alive' NOOP Command to the POP3 Server ........................................................................... 271 Disposing of Resources............................................................................................................................... 271 Using the Completed POP3 Class ............................................................................................................... 271 PART FOUR ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- Email Data Blocks Made Easy .......................................................................................................... 273 Easily Extracting the Component Parts from an Email File............................................................................. 276 Compiling Everything into an Email Class Library ............................................................................ 279 Building the VBNetMail Class Library............................................................................................................ 281 Accessing your New VBNetEmail Class Library DLL from another Project...................................................... 281 The Complete SMTP Class File ........................................................................................................ 282 The Complete POP3 Class File......................................................................................................... 284 The Complete Utilities Class File....................................................................................................... 290 Conclusion.............................................................................................................................................. 298 Useful References 299 Comparing Visual Basic System I/O Commands......................................................................300 REALLY Looking under the Hood of Visual Basic .NET ..........................................................302 VB6 Changed Commands In VB.NET ........................................................................................304 VB6 Aficionado Complaint Department (116 VB6 User Complaints against VB.NET Answered) 316 Additional "Black Book" Tips 343 Black Book Tip # 1: Bypassing Click Events when a Context Menus is Not Displayed on a Right-Click .....346 Bonus Tip.........................................................................................................................................347 Black Book Tip # 2: Creating an Association between a File Extension and Your Application....................348 Black Book Tip # 3: Get the Linked File Path from a Shortcut File.............................................................351 Bonus Tip........................................................................................................................................................352 Black Book Tip # 4: Create a Shortcut File within Your Code ....................................................................353 Bonus Tip........................................................................................................................................................354 Black Book Tip # 5: Adding a File to the Recent Documents Folder..........................................................355 Black Book Tip # 6: Sorting Any Column in a ListView Control in Ascending or Descending Order............356 Bonus Tip........................................................................................................................................................359 Black Book Tip # 7: Sizing a Label or TextBox to Fully Contain a String for Display ..................................360 Black Book Tip # 8: Set a New SelectedIndex for a ListBox or a ComboBox without Firing its Click Event.363 Black Book Tip # 9: Display TextBox Text Format-Justified at Runtime.....................................................365 Bonus Tip 1 .....................................................................................................................................................370 Bonus Tip 2 .....................................................................................................................................................370 Bonus Tip 3 .....................................................................................................................................................370
  7. 7. Enhancing Visual Basic .NET Beyond the Scope of Visual Basic 6.0 – David Ross Goben Page –7– Black Book Tip # 10: Get The ListIndex of a ListBox Row that is Under the Mouse Cursor........................371 Black Book Tip # 11: Open File Explorer with a Target File Selected ........................................................372 Black Book Tip # 12: Determining if an array is Dimensioned....................................................................373 Black Book Tip # 13: Customizing the Display of TabControl Tabs ...........................................................374 Bonus Tip........................................................................................................................................................378 Black Book Tip # 14: Detecting a TabControl Tab on a Right MouseDown Event......................................379 Black Book Tip # 15: Prevent the User from Selecting a TabControl Tab ..................................................380 Black Book Tip # 16: Hiding Tab Pages without Destroying the Tab Pages or their Resources .................381 Black Book Tip # 17: Passing a Parameter ByVal when the Invoking Function Specifies a ByRef Parameter...384 Black Book Tip # 18: Show and Hide Additional Information at the Bottom of the Form.............................385 NOTES ON IMAGES .......................................................................................................................................389 Black Book Tip # 19: Easily Recovering Crashed Menus and Toolbars under VB.NET..............................390 Black Book Tip # 20: Tracking ComboBox Items under the Mouse ...........................................................396 Black Book Tip # 21: Greatly Simplifying P/Invoke Definitions of POINTAPI and RECT Structures............399 Black Book Tip # 22: Easily Sorting Strongly-Typed Generic Collections Lists ..........................................405 Black Book Tip # 23: Dithering a Form's Background.........................................................................409 Black Book Tip # 24: Designing Intelligent Context Menus for TextBox and RichTextBox Controls ..........412 Black Book Tip # 25: Setting Context Menu Icon Image Transparency at Runtime....................................417 Bonus Tip # 1 ..................................................................................................................................................419 Bonus Tip # 2 ..................................................................................................................................................420 Black Book Tip # 26: Adding Background Transparency to Images on Toolstrips and Menus..................421 Black Book Tip # 27: Easily Do a Redim Preserve with Leftward Bounds of Multi-dimensioned Arrays....424 Black Book Tip # 28: Implementing a C-Style Bit Field Class in VB.NET ..............................................428 Black Book Tip # 29: Taking Advantage of, and Extending Application Events......................................439 Black Book Tip # 30: Enable Built-In Justify-Alignment in a RichTextBox from VB.NET.............................442 Black Book Tip # 31: Easily Replace Power Pack Shape Controls with Faster Paint() Event code.............446 Black Book Tip # 32: Dealing with the Form Cursor not displaying over Form Controls .............................455 Black Book Tip # 33: Passing Scalar Values and Strings to and from a Byte Array....................................457 Black Book Tip # 34: Display Buttons Labels wider than the button normally allows..................................467 Black Book Tip # 35: Performing Selections or inserting RichText Data Off-screen without Scrolling.........469 Black Book Tip # 36: Opening an Associated Application without a File....................................................471 Black Book Tip # 37: Comparing Color Values..........................................................................................476 Black Book Tip # 38: Use [Enum].GetValues() to Parse Enumeration Definitions......................................477 Black Book Tip # 39: Detecting Transparency Colors................................................................................478 Black Book Tip # 40: Greatly Accelerate TreeView Reflection of Directory Trees ......................................479 Black Book Tip # 41: Sorting TreeView Directory Trees in an Orderly Fashion..........................................483 Black Book Tip # 42: Taking Advantage of VB.NET Drag and Drop Features............................................488 Bonus Tip........................................................................................................................................................492 Black Book Tip # 43: Taking Advantage of the DateTimePicker Control...................................................493 Black Book Tip # 44: Padding Strings and Filling Separator Lines in Proportionally-spaced Text...............496 Black Book Tip # 45: Making Sense of Form Default Buttons and Their DialogResult Properties...............499 Black Book Tip # 46: Quick and Easy Text-Justification for Text Boxes, Labels, and Dialog Boxes ...........500 Black Book Tip # 47: Owner-Drawn Controls Made Easy..........................................................................506 Black Book Tip # 48: Owner-Drawn TreeViews Made Easy ......................................................................509 Black Book Tip # 49: Embedding Images within Your Source Code ..........................................................513 Converting Between an Image and a Base64 String..........................................................................................513 Formatting Base64 Strings for Embedding Within Source Code.........................................................................514 ImageLists versus Resources...........................................................................................................................517 Creating BuildImageListCode(), an ImageList Initialization Source Code Generator ...........................................518 Creating Single Base64 Image Data.................................................................................................................523 Creating Single Base64 Icon Data....................................................................................................................525 Black Book Tip # 50: Replace the BrowseFolderDialog Control with a Custom BrowserDialog Form.........527 Black Book Tip # 51: Using, Creating, and Embedding ImageStrips with Ease..........................................544 Loading an ImageStrip.....................................................................................................................................545 Creating Your Own ImageStrip.........................................................................................................................545 Splitting an ImageStrip.....................................................................................................................................546 Updating Black Book Tip # 49 to Use ImageStrips.............................................................................................546 Black Book Tip # 52: Extracting Icon Images from Files and Displaying Them in a Directory TreeView .....550 Black Book Tip # 53: Determining If a Computer Has an Internet Connection ...........................................581 Black Book Tip # 54: Manipulating Color Value Members with Ease .........................................................586
  8. 8. Enhancing Visual Basic .NET Beyond the Scope of Visual Basic 6.0 – David Ross Goben Page –8– Black Book Tip # 55: Converting Byte Sizes to Formatted Byte, KB, MB, GB, or TB Strings......................589 Black Book Tip # 56: Getting, Enumerating, and Changing Screen Settings..............................................591 Black Book Tip # 57: Printing Plain Text and Formatted Rich Text with Ease............................................599 Using VB6 Printer Functionality under VB.NET .................................................................................................599 Printing Simple Text under VB.NET..................................................................................................................599 Drawing Simple Text a Full Page at a Time............................................................................................602 Drawing Simple Text on a Page One Line at a Time...............................................................................604 Selecting a Printer............................................................................................................................................607 Selecting Page Setup Options..........................................................................................................................607 Selecting a Printer Font and Font Color ............................................................................................................608 Performing a Print Preview...............................................................................................................................609 Creating a Print Document Class......................................................................................................................610 Supporting the Help Buttons on Dialogs............................................................................................................614 Printing WYSIWYG RichTextBox Text ..............................................................................................................615 Black Book Tip # 58: Creating Fancier ProgressBar Marquees and Enhanced ProgressBars....................624 Enhancing Our Custom ProgressBar Marquee by Tiling It .................................................................................627 Emulating the Aero Glass ProgressBar Marquee ..............................................................................................628 Drawing Custom ProgressBars of User-Defined Heights ...................................................................................631 Emulating the Standard ProgressBar Using Images..........................................................................................632 Custom ProgressBars With More Complex Images...........................................................................................636 Black Book Tip # 59: Adding a Horizontal Scrollbar to a ComboBox DropDown List..................................640 Black Book Tip # 60: Restoring 3D Curved-Surface Appearances for Buttons and Tabs ...........................643 Black Book Tip # 61: Allowing a Form’s BackColor Property to Accept Transparency Colors ....................645 Closing Remarks ..............................................................................................................................647 About the Author ..............................................................................................................................649 Free Online PDF Documents Available by David Ross Goben.....................................................................650 Open Letters Sent to Advocates for the Electric Universe and Expansion Tectonics Theories.....................650 Navigating Your Way through Visual Basic 6.0 to Visual Basic .NET Application Upgrades ........................651 Enhancing Visual Basic .NET Applications Far Beyond the Scope of Visual Basic 6.0................................652 Doom 3 Walkthrough and Strategy Guide ..................................................................................................653 Also Available from the Author......................................................................................................................654 A Gnostic Cycle: Exploring the Origin of Christianity ...................................................................................654 NOTE: You can download this document’s source code listings for the code consisting of more than just a few lines, colorized, unbroken by page breaks, and with spacing fully intact, all wrapped within a RichText file named “Code Excerpts from Enhancing Visual Basic .NET.rtf” from my public folder at Google Drive: https://drive.google.com/file/d/0B_Dj_dKazINlMlA5UUx6R2JLOG8/view?usp=sharing NOTICE The opinions expressed herein are those of the author and are not opinions advocated or sanctioned by any other individual or body. These are the personal views of an independent software developer, and all criticisms, praises, endorsements and rejections are entirely his own; not those of any other.
  9. 9. Enhancing Visual Basic .NET Beyond the Scope of Visual Basic 6.0 – David Ross Goben Page –9– PREFACE This tome was first released when VB2008 was still fresh. Now, VB2015 is VB.NET’s fresh face. This manual has been continuously updated and is applicable to all these releases. Sadly, the Upgrade Wizard referred to at times was last available to VB2008. Though you can still find the free VB2008 Express Edition floating around the web that features this wizard, as well as fee-based Migration Partners (search the Web for “convert vb6 to vb.net”), once you are proficient in VB.NET, it is easier to redesign your VB6 projects as totally reconstructed VB.NET projects, copying and pasting segments as needed, even whole code blocks, and editing each to update and enhance them as required. At first I imagined this would be a difficult task, but in writing fresh code using the more powerful features available to VB.NET, I realized it was much easier to really pump up its power. I highly recommend this approach. Though I think VB2015 is their best version yet, it also is my feeling that VB2008 had actually been their most effectual release, where Microsoft® best realized their vision for Visual Basic .NET. Although VB2005 was a monumental paradigm shift from the tentative VB2002/VB2003 releases, and it finally restored VB to its high standing as a RAD (Rapid Application Development) platform, I have always looked at VB2005 as a preparatory “Release Candidate” for VB.NET, because using the Upgrade Wizard to convert the linear, procedural language of VB6 to the object-oriented language of VB2005 was, even with all its incredible enhancements that were all greeted with loud and heavy sighs of relief, still an often gauche, sometimes long, and frustrating effort, seldom really worth all the time-consuming labor required to transition VB6 code, other than for simple or small applications. Besides, what was the typical result of this? It was, essentially, just a VB6 program that was able to run under VB.NET. VB2002 and VB2003 were awkward and problematic implementations that often required convoluted, impossible-to-remember workarounds to duplicate some quite simple VB6 functions. For example, VB6 could get the running application’s Major Version as an Integer using App.Major. Before VB2005, VB.NET required System.Diagnostics.FileVersionInfo.GetVersionInfo(System.Reflection.Assembl y.GetExecutingAssembly.Location).FileMajorPart. With the introduction of the My namespace in VB2005, this was simplified to a much more logical My.Application.Info.Version.Major (refer to “A Note Regarding Reviving the VB6 App Command” on page 52 to see how to emulate the much simpler App suite of commands under VB.NET, enabling you to once again specify App.Major and most other App functions). Truly, it is my feeling that Microsoft should have never bothered releasing any pre- VB2005 code, except to those who would diligently beta-test it, report verifiable bugs, and submit enhancement suggestions, though we must also fully appreciate that Microsoft also needed to offset the enormously expensive development assets they had invested to this long range game-changing venture. It is my strongest feeling that VB6 should have been aggressively supported throughout the release cycle of VB.NET, not just the marginal nodding support that it got, even though most objective people recognized by 1999 that VB6 was desperately floundering in the wake of developing technology, becoming more of an anchor chain around the neck of Visual Studio’s development (the main reason why VC++ programmers derided VB6). But until then, Microsoft should have more vocally supported VB6 extensions to access Dot NET forms, workspaces, and code until that time (as it was, they did in fact develop these assets, but few in the VB6 world seemed to be aware of it), easing the VB6 transition from its procedural code platform roots to the more powerful Object-Oriented world of Dot NET. Unlike claims made by critics from the “Classic VB” world, everything that can be done in VB6 can be easily accomplished using Dot NET as of VB2008, no longer requiring convoluted alternative solutions or intense, deep research to find a compatible alternative for a simple language feature, as had been the case for early VB.NET releases. However, many developers do not have, or may never have a need for object-based programming, and VB6 still fills that procedural language niche in the VB Community, though I would love for VB6 to have been upgraded to 64-bit and feature a massively updated IDE.
  10. 10. Enhancing Visual Basic .NET Beyond the Scope of Visual Basic 6.0 – David Ross Goben Page –10– VB2010 added many welcome language features beyond VB2008 and pretty-much settled out the language, but the latest release, VB2015, blows all previous editions of the IDE out of the water! Its source code editing features alone are worth the upgrade. Also, it can be used without needing to upgrade source code from VB2010 forward. Further, the Visual Studio 2015 Community edition is nowhere near as limited as previous “Express” editions. VS2015 is now a full .NET development environment, save for enhanced MSDN subscriber support and privileges. Otherwise you have the full implementation of Microsoft’s Programming Language Suite, which now features multi-project solutions in VB. Remember, however, when installing, that you should select ALL the features you want, such as Desktop, Web, Phone, Storefront, or whatever. By default, the installation configuration, based upon how you reach the download point, might solely be for Web, Storefront, etc., so please take the time to read the option prompts and not simply sigh “Yeah, yeah. Whatever” before hitting the button labeled “Next”. Also, avoid the trial software options, to start, unless you really need to explore those avenues. Regarding Running VB6 on Recent Operating Systems Many developers, like myself, must still support legacy VB6 and VBA code. This is not really so surprising to those of us who have been in the business for any appreciable amount of time, considering that there are still masses of developers supporting legacy code for even the 36-bit DEC PDP-10 Mini- Computer dinosaurs from the 1960s. As such, we still need to be able to run Visual Studio 6 and especially Visual Basic 6 from our development platforms. It is often said by many presumed authorities, especially online, that VB6 will not run on Windows Vista, Windows 8/8.1, or Windows 10, or any operating system that features a 64-bit environment. However, VB6, a 32-bit environment, will run on these systems if you simply Run as Administrator (the 64-bit systems will support it, and easily, through WOW64; Windows 32-bit On Windows 64-bit). Installation Setup for Visual Studio 6, or just VB6, should also be installed by running as an administrator. Still, be advised that the installation will report a single error if you are installing on an operating system later than Windows 2000, though it will not report any specific details on what that error actually was (it will report these details, however, if you install it in Safe Mode, but other than that, there is no differences or a real need for Safe Mode). Even so, you can safely ignore this error because it was ultimately caused by Setup not being able to over-write a critical system DLL, OLEAUT32.DLL (this is a shared file installed by the operating system as a service provider for 32-bit Object Linking and Embedding Automation) with a much older version that was actually designed to operate under Windows 95 through Windows 2000. But that, if it had actually succeeded in over-writing it, would have been a very bad thing for your system. Fortunately, operating systems now-a-days are more picky about what it allows to be upgraded in its system kernel. Microsoft currently maintains a updated VB6 Support Statement titled “Support Statement for Visual Basic 6.0 on Windows Vista, Windows Server 2008, Windows 7, Windows 8 and Windows 8.1, Windows Server 2012, and Windows 10”, which you can find at https://msdn.microsoft.com/en-us/vstudio/ms788708.aspx. In its Executive Summary, they state “The Visual Basic team is committed to “It Just Works” compatibility for Visual Basic 6.0 applications on the following supported Windows operating systems: Windows Vista, Windows Server 2008 including R2, Windows 7, Windows 8 and Windows 8.1, Windows Server 2012 including R2, and Windows 10.” Microsoft also provides support summaries for each operating system. For Windows 10, they state: Since the initial release of this support statement, the Windows 10 operating system has been announced. This document has been updated to clarify Microsoft’s support for VB6 on Windows 10. VB6 runtime will ship and will be supported in Windows 10 for the lifetime of the OS. Visual Basic 6.0 runtime files continue to be 32-bit only and all components must be hosted in 32-bit application processes. Developers can think of the support story for Windows 10 being the same as it is for Windows 8.1. David Ross Goben February 2016
  11. 11. Enhancing Visual Basic .NET Beyond the Scope of Visual Basic 6.0 – David Ross Goben Page –11– Introduction Transitioning from Microsoft Visual Basic 6.0 (VB6) to Microsoft Visual Basic .NET (VB.NET1 ), at first glance, may look to be an intimidating endeavor. After all, you have likely heard or read through copious magazines and blogs that there are huge differences between these two developmental platforms. Though some of those differences are real, most of them are simply imagined, engendered by nothing more than unapprised conjecture. Of the real platform deviations, most are simply due to them having to be expressed differently; plainly because VB.NET more diligently follows a stringent pattern of language syntax, which is something VB6 was not always very good at. Hence, a programming language feature may have to be implemented under VB.NET using sometimes radically different invocation rules than the way it may have been realized under VB6. Other disparities, some seen as much more profound, actually end up being VB6 features that VB.NET does in fact support, but, again, due to tight Dot NET platform architectural specifications, VB.NET could not support them in an identical manner, but by necessity had to utilize non-VB6-style invocation rules. Nevertheless, by employing some simple user-defined helper functions, such as those that will be provided throughout this tome, you can easily emulate such “lost” VB6 commands, or, in most cases, make their functionality more accessible through simpler syntax. Regardless, you will find that, overall, VB.NET supports all these many differences, both major and minor, in but different forms, and in all it also implements much more robust2 techniques to apply that functionality. Many of the “major” differences bemoaned by many VB6 purists3 no longer exist; having existed only in Beta releases of VB.NET, but being addressed by the time of the initial product launch, or, in more complex cases, in later releases. See the article, “VB6 Aficionado Complaint Department (116 VB6 User Complaints against VB.NET Answered)”, on page 316 to examine these numerous charges many VB6 devotees held against VB.NET, and how all but a pittance of them are groundless. And of those few that are not groundless, they can still be quite easily resolved, rendering as petty the remainder of those complaints. Instead of simply adding some slick Dot NET features to VB6 and calling it VB7 (they basically did this with their Microsoft Interop Forms Toolkit 2.0, http://msdn.microsoft.com/en-us/vstudio/aa701257.aspx, allowing a step-wise transition of VB6 apps to VB.NET), after long debate Microsoft chose the much more difficult task of reengineering VB from the ground up, making it fully Dot NET- and OOP-compliant. Considering the monumental work required to accomplish such a task (consider the transition from VB.NET Beta to VB2008), this could not have been an easy decision. For example, VB.NET now sports two powerful forms packages called Windows Forms and Web Forms; a new and more powerful version of ADO to easily access disconnected data sources; a more logical, much more powerful and feature- rich language that also removes or replaces many legacy or ‘hacked’ commands that no longer had meaning or had a complicated or convoluted structure; greatly improved type safety; exposing low-level data that advanced developers need to access; and made it easier to write distributed applications. This bounty of new VB.NET features opened all the doors that had previously been closed to VB6 developers. With Web Forms and ADO.NET, one can quickly develop scalable Web sites. With inheritance, the language now fully supports object-oriented programming. Windows Forms fully support accessibility and visual inheritance; and deploying applications is now as easy as copying your executables and components from directory to directory, often referred to as ‘XCOPY deployment’, so 1 VB.NET is pronounced V-B-Dot-Net; just as .NET is pronounced Dot Net, and VB6 is pronounced V-B-Six. I have also heard them pronounced Vib-Net and Vib-Six, though this seems to be confusing and not as “cool” as their purveyors might think of it as being. 2 Robust: Bullet-proof; bug-proof. This usually implies sturdy code that is written to avoid errors, using strong types and error-trapping. 3 I find the term VB6 Purists to be humorous, because VB6 is not a pure language by any measure, but rather a mongrel mix of really cool features and concepts, added to by a hodge-podge of hacks and fixes, starting with VB1, chiseled together with brilliance, tricks, hacks and work-arounds to provide a GUI and windows forms to what was otherwise DOS-level QuickBasic. Even so, VB6 was for years my personal favorite. But the point remains that its language is structurally convoluted, often clumsy, and its program structure precluded much more modern programming concepts.
  12. 12. Enhancing Visual Basic .NET Beyond the Scope of Visual Basic 6.0 – David Ross Goben Page –12– you no longer need to worry about DLL versioning issues. With VB.NET, this versioning danger and the resulting intense aggravation (often referred to as “DLL Hell4 ”) is a thing of the past. As importantly, VB.NET fully integrates with the other Microsoft Visual Studio .NET languages. You can even develop application components in different programming languages, and your classes can now inherit from classes written in those other languages, and visa versa, using cross-language inheritance. With a unified debugger, you can now debug multiple language applications, irrespective of whether they are running locally or on remote computers. Whatever Dot NET language you use, the Dot NET Framework provides a rich set of Application Programming Interfaces (APIs) for Microsoft Windows® and the Internet that are now, in the Dot NET world, commonly referred to as P/Invokes or Pinvokes; meaning Platform Invokes5 or Processor Invocations. Why Is VB.NET Not 100% Compatible with VB6? Why does VB.NET not fully support VB6 code, as written, just as VB6 and previous editions were generally able to support previous editions of code (with minimal redesign)? Because VB6 code is not supportive of OOP (Object-Oriented Programming). Many of the features VB6 users bemoan the loss of in VB.NET are features that: 1) are dangerous to the operating system, so safer means under Dot NET were implemented, 2) are not applicable to an OOP paradigm6 , so Dot NET-compliant implementations were introduced, or 3) invited the development of less robust, bug-prone code (for example: As Any). VB1 through VB6 were procedural programming languages, which execute linearly, featuring simple procedural calls to functions and subroutines. VB.NET, however, is a fully Object-Oriented Programming Language (OOPL), which consists of objects that interact with one-another, each encapsulating their own methods and data. These paradigms, procedural and object-oriented, are vastly different. I find it amazing that VB.NET can in fact use as much original VB6 code as it does. Previous to VB.NET, an object-oriented language often required colossal source code re-tinkering to upgrade a procedural version of its language. A case in point is the procedural language C versus the object-oriented language C++. Granted, you could compile and execute straight C code, for the most part, using a C++ compiler and successfully execute it, but it would still run as a procedural program. To convert it to use objects as VB.NET requires, entailing form objects, control objects and such, necessitates monumentally exceptional feats of code restructuring. But the VB.NET Upgrade Wizard (available through VB2008, but sadly missing in later editions, though you can still install VB2008 Express to take advantage of it) does a dazzling job. See my free companion document, “Navigating Your Way Through Visual Basic 6.0 to Visual Basic .NET Application Upgrades” (refer to the link on page 651), to learn how to address most every upgraded VB6 program code issue. There were two options that Microsoft had to consider when designing VB.NET: they could simply retrofit the existing code base to run on top of the Dot NET Framework, but it would still be stuck with being a procedural language, even though it would be able to run VB6 code right off the bat, or they could rebuild VB from the ground up, not taking any shortcuts, not sacrificing even one Dot NET feature, and also take complete advantage of a fully functional object-oriented platform. To deliver the features that were most demanded by their customers, such as inheritance and threading, to provide full and uninhibited access to the platform and to other platform languages, and to ensure that VB moved forward into the next generation of Web applications, the right, though vastly more difficult decision was to build VB from scratch on the Dot NET platform (and no, it is not a modified version of C#). 4 DLL Hell: When an older version of a DLL overwrites a newer DLL, and suddenly previously working applications start blowing up because they cannot find entry points in the DLL that had previously existed in the newer version of that DLL. This also includes newer DLLs that dropped older entry points, which clearly should be a developmental cardinal sin in professional-grade applications. 5 P/Invoke or Pinvoke terms are used for two reasons: 1) because API is common to the reference “API Calls”, and 2) it refers to invoking the system processor, which implies something outside of the managed space, which is exactly what it is. Further, these invocation processes are likewise referred to as “Signatures”, replacing the API Declaration term; tying in with Method Delgates or Method Signatures, which are like C/C++ Prototype Declarations. 6 Paradigm: Organized method of performing a task.
  13. 13. Enhancing Visual Basic .NET Beyond the Scope of Visual Basic 6.0 – David Ross Goben Page –13– For example, many, but not all the new features found in the Windows Forms package could have been added to the VB6 code base as new controls or as additional properties. However, this would have been to tremendous cost to all the other great features inherent to Windows Forms, such as security and visual inheritance, not to mention that VB.NET would have lost the powerful Web Forms package entirely, which allows your users to access and run code behind your forms directly from your web page without needing to install driver code onto their own machines first, as VB6 required. Also see ASP.NET. Once on this tract, one of Microsoft’s principal goals was to ensure that VB.NET code could fully interoperate with methods and classes written in other languages, such as Microsoft Visual C# or Microsoft Visual C++ (and visa versa), without caveats or being forced to implement hidden helper code. Another goal was to enable the VB.NET developer to harness the full power of the .NET Framework simply and with absolutely no impediments, and all without having to resort to internal support workarounds, which were traditionally required just to make Windows P/Invokes work with VB6. An example of such a hack was the code used to work around the inability of VB6 to employ method overloading (also known as function overloading), by introducing the messy and potentially dangerous “As Any” functionality to API Declarations. Method overloading, an essential feature common to Object-Oriented Programming, allows different methods to employ the very same method name, but each would utilize different parameter counts and/or types. As a result, when you invoke the method name, the compiler looks at your method parameter list, referred to as a signature or delegate, to determine which same-named method to invoke. This eliminates entirely the need to use an “As Any” cheat. Method overloading is easy and will be demonstrated in several examples within this document. VB.NET now has the same variable types, arrays, user-defined types, enumerations, classes, and interfaces as does Visual C++ and any other language that targets the .NET CLR (Common Language Runtime). As a result, they also had to redact features that did not play well with the .NET paradigm, such as fixed-length strings and non-zero-based arrays from the VB language, even though this document will show you with detailed examples how to still implement them (both of these features can be easily emulated using super-quick coding techniques, or by very simple user-defined classes). Why .NET? Though the .NET Common Language Runtime operates on Microsoft Windows® and Linux platforms, this will expand. As of this writing, development of support for other platforms such as UNIX (which Linux is modeled after) and iMac7 are either in the works, or are being conceptualized (considering that .NET’s F# runs on the Mac, it may already have a working CLR). The result of this will be that you can write code in .NET and run that code on various platforms and CPUs without changing the code or even needing to recompile. This is the core purpose behind Dot NET; to be a multi-platform development environment that can compile on one platform, but execute on many. This sounds almost like the much slower Java scripting language and its philosophy of “write once, run anywhere.” Unlike previous editions of Visual Studio, Dot NET compiles its code into an MIL (Machine Independent Language, and also referred to as Microsoft Intermediate Language, or just as IL). This MIL was carefully designed around advanced CPU (Central Processing Unit) architecture, crafted to be as close as possible to the instruction sets for most 32- and 64-bit CPUs. This MIL is technically an actual machine language, yet one for a hypothetical, though ideal CPU, but which can almost instantly be translated to native code with its built-in Just-In-Time Compiler. Soon you may be able to write an application on one platform and then execute it on another without change. This MIL is instantly compiled into native machine code on the target platform by the CLR’s just-in-time compiler. Hence, as 7 The iMac’s OsX is a Unix-based operating system modeled after Carnegie Mellon University’s Mach microkernel, which was in turn an upgrade/replacement for BSD’s FreeBSD and NETBSD implementations of UNIX. BSD is presently devoting heavily into research and development in the Dot NET direction.
  14. 14. Enhancing Visual Basic .NET Beyond the Scope of Visual Basic 6.0 – David Ross Goben Page –14– long as a platform has a Microsoft .NET CLR, your code can run on that platform. Granted, to many this may almost appear to perhaps be an interpreted or a tokenized p-code8 language; it most definitely is not, because its code is not being interpreted at all. It is even rumored that such institutions as Intel and AMD may even be playing with the idea of developing a CPU or an add-on hardware device that will be able to execute MIL code directly, without the need for just-in-time compiling. What is Dot NET? The Dot NET environment is filled with terminology, such as the above, which might be unfamiliar to most new Dot NET programmers. Understanding this terminology and what they imply in the scheme of things will go a long way toward making sense of it, and turn people into Dot NET experts. Rest assured that you do not need to fully understand most of it when you first get started, and you can most probably get along by knowing virtually nothing about it, to start. The great thing about it is that you can start developing code without having to understand every little stinking thing before you can write a program. Obviously, a fuller understanding of it is immensely helpful, but you can safely relegate such comprehension to periods when you have time to do so. Picking this stuff up will also present you with some really cool tricks that you can use to spiff up your code. But trying to absorb everything all at once will only result in you forgetting most of it, and causing you anxiety due to information over-load. Basically, the entire Dot NET environment is wrapped within by a thing called the .NET Framework. This framework must, like any technology, be installed on a system before one can use it. Before anyone complains, this approach is no different – though nowhere nearly as complicated – as requiring someone to install a Windows Operating System prior to them being able to run applications designed for a particular Windows environment. If you have been using computers long enough, you might remember saving your pennies to get the Level II BASIC upgrade for the TRS-80 Model I or Apple computer so you could write “real” programs beyond their default and primitive Tiny BASIC. Presently, all recent versions of Windows have come with the .NET Framework pre-installed (or you can download them free of charge), just as it is standard for computers to come with an Operating System installed. What is the .NET Framework? In a nutshell, the .NET Framework is a runtime execution environment that manages applications, though it might appear to us mortals as a tree-like structure that is filled with classes, where each branch consists of a Namespace class (see later) that is populated by sub-classes, and many of those sub-classes in turn are other Namespaces that are populated by more sub-classes, and so on. At the very core of this structure is a single root class named Object. From this primordial class all other classes in Dot NET are derived, even our own, though we might not even notice it. Each more complex class object often inherits a simpler base class as its foundation. This progression builds until you have truly complex classes the bear little resemblance to their ancestral roots, but none-the-less share, as a part of its bag of tricks, the interfaces of all its ancestral classes. Normally, however, constructing most classes seems no different from constructing any other ordinary class. I had just mentioned that the .NET Framework is filled with classes. Indeed, it is filled with nothing but classes. This is the first thing that you should know about Dot NET – everything in its environment, even forms and modules, is actually a class or an instance of one. Variables are even class objects, albeit a variation of it known as abstract classes, but nonetheless they can feature properties and methods. Even your regular VB Module files are classes, where all exposed members are treated as Shared, and the module is automatically internally imported so that you do not need to fully qualify a method or property within it by referencing the module class name in order to access it, though you certainly can if you so desire. Still sound strange or confusing? No worries; we will clarify these points soon enough. 8 P-code: Pseudo-code. This is an intermediate, tokenized version of a program, popular with many in-house development languages, which, though still interpreted on many platforms, it also runs much faster than interpreting text source code because the code is already in an intermediate state between the source code and ready-to-run code. Microsoft DOS BASIC was such a tokenized language. Microsoft BASIC80 in fact ran scores of times faster than non-tokenized versions. As a result it became an instant monster hit among users.
  15. 15. Enhancing Visual Basic .NET Beyond the Scope of Visual Basic 6.0 – David Ross Goben Page –15– NOTE: The difference between a Concrete and Abstract class is this: Concrete classes must be instantiated using the New keyword and associated variables do not actually contain their data, but point to them. During assignment they will transfer just a reference to that data. Abstract classes are not instantiated but contain their data, and they also automatically clone themselves (make new copies) when assigned to a different variable. This makes them a bit messy because they can make copies of themselves all over the place, but they do clean up quite easily when they each go out of scope (accessibility). I said that the structure of the .NET Framework was like a tree, thus implying branches and leaves. It is formatted much like the directory structure of a disc drive, where each broad branch, usually defined as a special non-inheritable class, is referred to as a Namespace. It in turn envelopes a collection of related classes, where certain of these classes comprise additional Namespace branches, but containing their own embedded child classes, all layered within this onionskin-like framework. This is on top of the fact that any class in this framework can also become a branch of its tree. Indeed, Dot NET Namespaces simply organize classes into groups of subclasses that are usually expected to work together. The structure of the .NET Framework is comprised of terms like Namespaces, Application Domains, Assemblies, Solutions, and Projects. Let us take a brief look as these from an outsider’s perspective. What is a Namespace? Namespaces contain classes that provide programming interfaces. Everything within the .NET Framework, to include every program that you develop, are also wrapped inside a wrapper class known as a Namespace, though most new Dot NET developers might not even be aware of it. When you create a new project or suite of projects, one of their properties is a Namespace. By default, the name given the namespace is the same as the first—and often the only—project. However, if you have multiple classes defined in separate projects that are related to each other, you might wish to change the default namespace for each to be identical if these projects will be working closely with each other. A namespace is actually a non-inheritable class wrapper that envelops classes or a project. When you import a namespace, that namespace is auto-instantiated, and all of its non-private members, which may be classes, enumerations, properties, or methods, are marked as Shared to referencing files, which can be accessed by the whole application, or, if you wish, just by selected source files if the namespace had been specifically imported into them. However, it is inaccessible from outside applications, if, for example, your project is a DLL. Again, a namespace is non-inheritable; you are thus prevented from instantiating a namespace to an object (this would be pointless, anyway). In the most simple of terms: adding a namespace is just like adding a non-visible VB Module file to your application. Namespaces do not follow any stringent organizational rules regarding the classes that can be defined within them. It is simply a convenience for the developer that related classes can be declared in them, just like with a disc folder – sure, you can put anything into them, but it makes more sense to place things that have something to do with each other, or is considered a part of a suite of solutions for something. Hence, grouping of classes within a namespace is a bit of an esoteric art. But keeping related classes together is just common sense. It is like defining properties and methods for a class; you normally define only properties and methods for a class that actually have something to do with that class. Anything else is useless and poor design. Likewise, a namespace would hold classes that have something to do with each other. For example, there is a namespace named Microsoft.VisualBasic. The VisualBasic namespace is a child namespace of the Microsoft namespace (there are basically two root namespaces – System and Microsoft – and everything else, in-as-far as the .NET Framework goes, branches from them as sub-classes (yes, you can declare classes within other classes in Dot NET, exactly like you can Structures, which are Abstract Classes)). The VisualBasic namespace holds classes relating to VB.NET. For examples, the Constants and ControlChars enumerations are children of the VisualBasic namespace. Within the VisualBasic namespace you will find most classes, methods, enumerations, constants, and properties relating to VB.NET (you therefore will of course not find language-specific syntax keywords there, such as If, Then, Else, etc.).
  16. 16. Enhancing Visual Basic .NET Beyond the Scope of Visual Basic 6.0 – David Ross Goben Page –16– You can bring up the Object Browser from the View menu and explore these namespaces and classes for yourself. A great hint for VB2008 users is to have the Dynamic Help tab open and in view (found in the VB2008 Help menu, but sadly gone as of VB2010 because apparently it ate too many resources, even though it was helpful beyond words), so as you click items in the Object Browser, you can use the Dynamic Help to explore them in exhaustive detail. Dynamic Help should be one of your new best friends for VB2008, and can help you find answers to anything that you find of interest. Unlike Visual Studio 6, the Dot NET Help System is not mostly directed at C++, but is directed at all CLR languages, of which VB.NET is now a full member, and includes VB examples for all related features. A cool trick, if you are writing code in C# or Managed C++, is that you can actually access the Visual Basic classes and invoke their functionality. This is really handy when there is a VB-only method that you want to take advantage of from non-VB language code. Conversely, if your VB.NET code needs to use something like pointer manipulation, where you would change data through pointers (pointers are often used to target actual memory locations), then you can write such code in C# or C++ and invoke it from VB.NET, even though you can in fact do such from VB.NET by using deeper Dot NET features and processor invocations, as will also be demonstrated later within this manual. We will briefly discuss how to access namespaces (referencing and importing) when we take a look at the structure of code. Suffice it to say for now that there are four types of objects that can be created at the namespace level: Classes, Modules, Structures, and Enumerations. Also, each can be defined with a scope of Private, Public, Friend, or Protected. Private members will be visible only to within the structure or code block they are declared within. Public members can be accessed from outside the class, to include by other applications that can access its parent, such as a DLL. Friend members are treated by the application as if Public, but as Private to all outside applications that could otherwise access its parent. Protected specifies that the item is accessible only from within its own, or a derived class. Enumerations should already be familiar, but a much-welcomed enhancement in Dot NET is the ability to declare them with a storage class (storage type). Instead of their values being generic, slow, Variant- type expressions, you can declare the values of an Enum to provide Singles, Doubles, Integers, and such. Structures, unlike the very primitive User-Defined Types of VB6, can also include methods and properties. For certain, structures are classes, except that they are what is called a value-type object (an abstract class, in Object-Oriented lingo), as opposed to reference-type objects (a concrete class) that most classes resolve to. We will be looking deeper into these two types a little later. Modules, by appearance, are treated just like VB6 Modules. However, there is an important internal difference that perhaps you need not worry yourself about, but is a very cool bit of trivia: VB.NET modules are actually classes. The key distinction of a module is that it, unlike a regular class, cannot be instantiated as an object simply because a module is auto-imported into a project, being treated as a non- inheritable namespace. As such, non-private methods and variables in the module are handled within the application as Shared. These treatments were done so that VB6 developers migrating over to Dot NET would not suffer a grand mal seizure because they no longer had Modules available. I have heard a number of C# developers complaining that they cannot likewise define C# modules. Well, technically they can. All they have to do is to declare a class as non-inheritable, declare all of the non-private variables and methods that they want to be accessible to the application as Shared, and to import this class so that they do not have to declare the module name when they wish to access a variable or method within the module, though this can never hurt in-as-far as self-documentation is concerned.
  17. 17. Enhancing Visual Basic .NET Beyond the Scope of Visual Basic 6.0 – David Ross Goben Page –17– What is an Application Domain? An Application Domain is a solution or group of solutions that work together, sharing memory, but are completely separate from each other in managed memory by the CLR. This process separation, which is a great feature of Dot NET, guarantees that components cannot interfere with each other, which had previously been a nightmare for those who had multiple executables that shared data space. Granted, most of you will never have to worry about this, focusing instead on single executable applications, but those who do write such complex programs, the headaches have been marginalized, especially the pain of trying to quash circular references in released objects that somehow kept resurrecting themselves, as had been a “feature” under VB6. Again, this is a concept that, in the end, is quite helpful, though you really do not have to bother your head with even knowing that it exists. The fact is that most of you could have gone through the rest of your careers without thinking about it even once. What is a Solution/Assembly? Solutions are how we author, package, and maintain our software projects. An Assembly is a collection of resources that forms a logical unit of functionality. I tend to put Solutions and Assemblies together, because from the outside they seem to be the same thing, and to most users these terms appear interchangeable. It all comes down to perspective, though their differences might appear a bit gray. Instead of pulling out diagrams and cracking thick tomes to explain them, suffice it to say that when we talk about a Solution or an Assembly, we are talking about pretty much the same thing. A Solution is the final result; the wrapper that can hold one or more projects, such as an EXE and supporting DLL files. An Assembly describes that Solution, defining the Solution's fingerprint, its auto-generated Globally Unique Identification number (GUID), its list of resources, and its version number. Note that older VB.NET Solutions could only hold one EXE, and the other optional projects could produce only non- EXE files, such as DLLs. Later VB.NET releases and the command-line compiler can compile solutions with more than one EXE, though there is generally little need for it. By default, the name of the solution will be the same as the name that you provide for the first, and usually the only project you created. Frankly, usually the only time you personally need to be concerned with an Assembly is when you want to edit the application description, version number, title, and such. In this case you can simply open the AssmeblyInfo.vb file, found in the Solution Explorer, or open the project properties and select the Assembly Information button to edit this file through a much safer dialog interface, and modify the entries (if you do not understand what I mean, simply access it and look for yourself – it will then become quite obvious). Personally, I think of the whole thing as a Solution, and I associate the idea of an Assembly as this single AssemblyInfo file, and forget about their real technical descriptions. What is a Project? A project is the executable/control/DLL you are developing. Each project contains only one compiled object, whether it is an EXE, a DLL, or some other object. When you create a new project in VB.NET, it also creates a thing that wraps around the Project called a Solution, giving it the same name as the initial or only project (a Solution is simply an organizing wrapper around a project or group of projects – see below), as well as a Namespace that can wrap itself around one or more Solutions (also see below) with the same name as the initial or only project. Indeed, when you go about creating new applications, Dot NET will be prompting you for a new project, which will also create a like-named Solution and Namespace. You should set these in the creation dialog if you will in fact require them to be different from the default, but you can just as easily change them later. Although it would at first seem logical to first create a namespace, then to create solution(s) within it, and within the solution(s) to finally create their project(s), most applications do not need to work this way or even to worry about it at all, and this latter approach would therefore be nothing more than a peevish bother than a help in most development projects. This somewhat cut-to-the-chase approach is a well-received feature for most developers. Beside, the solution and namespace can be redefined later with absolute ease.
  18. 18. Enhancing Visual Basic .NET Beyond the Scope of Visual Basic 6.0 – David Ross Goben Page –18– Object-Oriented Programming VB.NET, as opposed to VB6, is a full-fledged Object-Oriented Programming Language. Everything in VB.NET, to include simple variables, is derived from class definitions. Although people new to OOP design might not imagine much practical use for OOP, preferring instead linear, procedural languages, such as VB6, even a basic introduction will clarify the tremendous advantages it has over conventional programming that had spawned the development of maddeningly confusing “spaghetti” code and “half-cocked” programming. The introduction of structured programming by languages such as Pascal, ADA, Algol, and C, for example, tried to straighten this problem out, but failed miserably in that it was too easy to work around. Objects, on the other hand, promote and almost force structured design, where each object is a self-contained building block that is plugged into and link together by invoking each others’ program code. Because these objects are like black boxes9 , the need for developing a design paradigm is critical to application development. Anyone who has ever been involved in a large and complex project realizes (the unlucky ones realized it after the fact) that breaking a project down into smaller self-contained modules is highly beneficial, and also lends itself greatly to a development team environment, where each member of the team can work on a separate module, test it and debug it individually, before it is plugged into the main application. The typical flow of an OOP project is to break each task or class down into more primitive classes or methods to consolidate common features, which, when grouped together, will define the complex outer class that a primary program thread manages. Each sub-class has a particular set of tasks to perform. Each module can be further broken down into simpler separate classes that in turn perform even simpler tasks. Again, these smaller classes are self-contained and can be separately tested. The VB2008 edition of VB.NET worked around most incompatibilities between an OOPL like VB.NET and a procedural language like VB6, to include making the new Integrated Development Environment (IDE) reasonably familiar and compatible to that of VB6. A great example of this, as discussed earlier, is VB Modules, which are files whose public contents were accessible from other files as though that code was written within the invoker’s file. In VB.NET, VB modules are actually classes that are automatically imported into the IDE (see the Imports command), which allows developers to use these convenient module classes just the as they did under VB6. Another development in VB.NET are control and form containers, allowing developers to access these containers like collections, just as they were used to doing under VB6. If new to object-oriented programming, the following terms and concepts will help you get a head start in gaining a basic understanding of the Object-Oriented Programming Language paradigm. Just keep reminding yourself that it is a whole lot easier to do than it is to explain. Classes and Objects It is critically important that you fully comprehend the idea of objects, the classes that describe them, and how they are incorporated within Dot NET. If you have written lots of classes, this is old news to you, but I keep running into many self-proclaimed advanced developers who have authored only a few classes, and some none at all, or were not exactly sure how classes were actually handled internally. A full understanding of a Class and the Objects instantiated from it is critical to mastering Dot NET. A class describes an object, such as a form, and even each button and control that are contained by the form. The class defines the fields, properties, methods, and events by which the ‘personality’ of object instances of it is established. An object is an individual instance of the class; a tangible manifestation of the class that is accessible from code external to it, such as the portion of your program that will use it. Each object instance contains only data; it does not contain a copy of its class’s source code. Each instance shares a single block of class code with all other instances of the same class. Truth is, most of this gobblety-gook will be invisible to you as you go about writing control events, functions, and subroutines just as you did under VB6. 9 Black Boxes: Predictable widgets, though their inner workings may be unseen or not known except by its developer. However, when known data is input, predictable known output results are guaranteed, allowing their working content to be ignored by all, except for those whose job it is to develop, provide, and service those widgets.

×