Before I end this example, I should show you how to test the application without having to wait
forever. I ran the application at 1:57 
P
.
M
., and the value printed by the first statement in the Tick
events was 10,900 or so (the numbe r of seconds to five o’clock). Then I stopped the application,
changed the value 120 in the code to a value a little smaller than the one in the Output window
(10,850), and restarted the application. A few moments later, the event was fired (it took more than
10 seconds, so I was sure the code was working properly). If you’re running the application after five
o’clock, the values will be negative, so adjust the comparison accordingly.
You have the basics for writing classes to fire alarms at specified intervals, a specific time, or even
a time interval after a certain operation. You can also use this class (with some modifications) to
monitor the system and raise an event if certain things happen. You could check a folder periodically
to see if a file was added or deleted. There’s no reason to write code for this, because the Framework
exposes the FileSystemWatcher class, which does exactly that (the FileSystemWatcher class is dis-
cussed in Chapter 13). But you may wish to monitor a printer, know when a new user logs in, or
keep track of any other operation or action you can detect from within your code.
Passing Parameters through Event Arguments
Events usually pass some information to the routine that processes them. The TeaTime event is a
trivial example that doesn’t include any information, but in most cases there will be some informa-
tion you’ll want to pass to the application. The arguments of an event are declared just like the argu-
ments of a procedure. The following statement declares an event that’s fired when the class
completes the download of a file. The event passes three parameter values to the application that
intercepts it:
Public Event CompletedDownload(ByVal fileURL As String, _
ByVal fileName As String, ByVal fileLength As Long)
The parameters passed to the application through this event are the URL from which the file was
downloaded, the path of a file where the downloaded information was stored, and the length of the
file. To raise this event from within a class’s code, call the RaiseEvent statement as before, passing
three values of the appropriate type, as shown next:
RaiseEvent CompletedDownload(“http://www.server.com/file.txt”, _
“d:\temp\A90100.txt”, 144329)
In the following section, you’ll find actual examples of events that pass arguments to the applica-
tion that uses the class. You will also see how you can cancel an asynchronous operation from within
your application by setting one of the arguments of the event.
Progress Events
Progress events can be fired in two ways. If you know the duration of the operation, you can fire
progress events when every five or ten percent of the operation completes. If the operation takes place
from within a loop, you can fire the progress event after a certain number of iterations. A more com-
plicated case is when you don’t know in advance how long the operation may take. This may happen
when you download a file of unknown size. In this case, you can fire progress events every so many
seconds and report the number of bytes downloaded, or some other indication that might help the
application display some form of progress. Reporting the progress as a percentage of the total work
Chapter 8 BUILDING CUSTOM CLASSES
350
Copyright ©2002 SYBEX, Inc., Alameda, CA
www.sybex.com
Best pdf to tiff converter - Convert PDF to tiff images in C#.net, ASP.NET MVC, Ajax, WinForms, WPF
Online C# Tutorial for How to Convert PDF File to Tiff Image File
.net pdf to tiff converter; pdf to tiff converter for
Best pdf to tiff converter - VB.NET PDF Convert to Tiff SDK: Convert PDF to tiff images in vb.net, ASP.NET MVC, Ajax, WinForms, WPF
Free VB.NET Guide to Render and Convert PDF Document to TIFF
convert pdf to single page tiff; pdf to tiff open source
done is out of the question, so this progress event isn’t of much help to the developer or to the user of
the application. It simply tells the user that the class is running in the background, not much more.
To demonstrate progress events, I’ve prepared an application (DirScanner on the companion
CD) that goes through an entire drive and adds up the sizes of all files. This is a lengthy operation
even on the fastest Pentium system, so it will give you a chance to monitor the progress events. Since
the class has no way of knowing the total number of folders (or files) on the disk ahead of time, it
can only report the number of folders scanned so far.
The following code scans recursively all folders on the hard drive. The process of scanning a
folder, including its subfolders, is quite simple—if you’re familiar with recursion, that is. The code is
discussed in detail in Chapter 18, but don’t worry about understanding how it works right now. Just
focus on the ScanProgress event, which is fired each time a new folder has been scanned. The applica-
tion that receives the event can update a display with the total number of folders scanned so far, which
is a good indication of the progress of the operation. It’s not an indicator of the time left to complete
the operation, but sometimes this is all you can do. When you search for a specific file with the Find
utility, for example, all you get is a list of folders scanned so far at the bottom of the window.
The DirScanner class (shown in Listing 8.16) calls the ScanFolder() function, which accepts as
argument the name of the folder to be scanned and returns the total size of all the files in this folder.
ScanFolder() scans the files in the folder passed as argument. Then it goes through the subfolders
under the same folder and does the same. To do so, it calls itself by passing each subfolder’s name as
argument. By the time it’s done, the totalSizelocal variable holds the sum of the sizes of all files under
the initial folder.
Listing 8.16: The DirScanner Class
Imports System.IO
Imports System.IO.Directory
Public Class DirScanner
Public Event ScanProgress(ByVal foldersScanned As Integer)
Private totalSize As Long
Private nFolders As Integer
Public Function ScanFolder(ByVal folder As String) As Long
Dim file, dir As String
Dim FI As FileInfo
For Each file In Directory.GetFiles(folder)
FI = New FileInfo(file)
totalSize = totalSize + FI.Length
Next
For Each dir In Directory.GetDirectories(folder)
nFolders = nFolders + 1
RaiseEvent ScanProgress(nFolders)
ScanFolder(dir)
Next
Return totalSize
End Function
End Class
351
BUILDING THE MINIMAL CLASS
Copyright ©2002 SYBEX, Inc., Alameda, CA
www.sybex.com
Online Convert PDF file to Tiff. Best free online PDF Tif
Online PDF to Tiff Converter. Download Free Trial. Convert a PDF File to Tiff. Just upload your file by clicking on the blue button
create tiff file from pdf; how to convert pdf into tiff
Online Convert PDF file to Word. Best free online PDF Conversion
Online Tiff to PDF Converter. Download Free Trial. Convert a Tiff/Tif File to PDF. Just upload your file by clicking on the blue button
bulk pdf to tiff converter; pdf to multipage tiff converter
The ScanProgress event is declared at the Class level (outside the ScanFolder() procedure), and it
passes an Integer value to the calling application; this is the number of folders scanned so far. The
ScanFolder() function maintains two private variables, where it stores the number of folders scanned
so far (the nFoldersvariable) and the total size of the files. The nFoldersvalue is reported to the appli-
cation through the event’s argument. The code of the ScanFolder() function is straightforward,
except for the line that raises the event. The event is raised every time the function runs into a new
folder and before it starts scanning it.
To test the DirScanner class and its event, add a button on the test form and enter the code of
Listing 8.17 in its Click event handler.
Listing 8.17: Testing the DirScanner Class
Dim WithEvents objDirScanner As DirScanner
Protected Sub Button1_Click(ByVal sender As Object, _
ByVal e As System.EventArgs)
Dim folder As String
objDirScanner = New DirScanner()
folder = “C:\Program Files”
MsgBox(“Your files occupy “ & _
objDirScanner.ScanFolder(folder).Tostring & “ bytes on the drive”)
End Sub
The application calls the ScanFolder() method and, while the method is executing, it receives
progress events. The last statement in this subroutine will be executed after the ScanFolder() method
completes its execution and returns control to the Click event handler. In the meantime, the events
raised by the class are processed by the objDirScanner_ScanProgress handler, which is shown in the
following code. To program this event handler, select the name of the objDirScannervariable in the
object list and the ScanProgress event in the event list of the editor’s window. The code shown here
uses the information passed through these events to update the caption on the application’s form.
Public Sub objDirScanner_ScanProgress(ByVal foldersScanned As System.Integer) _
Handles objDirScanner.ScanProgress
Me.Text = “Scanned “ & foldersScanned.ToString & “ folders so far”
End Sub
Another method of reporting the progress of a lengthy operation is to raise an event every so
often during the operation. The following pseudocode segment outlines the class’s code that raises
an event every eventDurationseconds:
If Now.TimeOfDay < (newInterval + eventDuration) Then
newInterval = Now.TimeOfDay
RaiseEvent Progress(foldersScanned)
End If
Chapter 8 BUILDING CUSTOM CLASSES
352
Copyright ©2002 SYBEX, Inc., Alameda, CA
www.sybex.com
Online Convert Excel to PDF file. Best free online export xlsx
Online Excel to PDF Converter. Download Free Trial. Convert a Excel File to PDF. Drag and drop your excel file into the box or click
online pdf to tiff conversion; convert pdf to grayscale tiff
Purchase RasterEdge Product License Online
Converter for .NET. Best file conversions for most common business files, including Adobe PDF, Microsoft Word, Excel, PowerPoint, HTML, Open Office ODF, Tiff,
pdf to grayscale tiff; how to convert pdf to tiff online
When an application initiates an operation that may take a while to complete, it usually provides
a Cancel button, which the user can click to interrupt the process. But how do we notify the class
that it must abort the current operation? This is done through the progress event, with the help of an
additional argument. Many event handlers include a Cancelargument, which the application can set
to True to indicate its intention to interrupt the execution of the current operation in the class. Let’s
revise our progress event in the DirScanner class to include a Cancelargument.
Tip Notice that the Cancelargument doesn’t pass information from the class to the application; it passes information the
other way. We want the class to be able to read the value of the Cancelargument set by the application, so we must pass this
argument by reference, not by value. If you pass the Cancelargument by value, its value won’t change. Even if the applica-
tion sets it to True, it’s actually setting the value of the copy of the Cancelvariable, and your class will never see this value.
Instead of revising the code of the existing ScanProgress event, we’ll add another event, the
ScanTimerProgress event. Add the event declaration and the ScanTimerFolder() function from List-
ing 8.18 to your class.
Listing 8.18: The ScanTimerFolder Method
Public Function ScanTimerFolder(ByVal folder As String) As Long
Dim file, dir As String
Dim FI As FileInfo
Dim interval As Double = 3000
If start = 0 Then start = Now.TimeOfDay.TotalMilliseconds
Dim cancel As Boolean
For Each file In Directory.GetFiles(folder)
FI = New FileInfo(file)
totalSize = totalSize + FI.Length
Next
For Each dir In Directory.GetDirectories(folder)
If Now.TimeOfDay.TotalMilliseconds > (start + interval) Then
RaiseEvent ScanTimerProgress(nFolders, cancel)
If cancel Then Exit Function
start = Now.TimeOfDay.TotalMilliseconds
End If
nFolders = nFolders + 1
ScanTimerFolder(dir)
Next
Return totalSize
End Function
The code is the same, except for the If statement that examines the value of the cancelargument. If
cancelis True, then the program aborts its execution. To test the new progress event, add a second
button on the form and enter the code of Listing 8.19 in its Click event handler.
353
BUILDING THE MINIMAL CLASS
Copyright ©2002 SYBEX, Inc., Alameda, CA
www.sybex.com
C# PDF Convert to Images SDK: Convert PDF to png, gif images in C#
Best PDF converter SDK for Visual Studio .NET for converting Support exporting PDF to multiple image forms, including Jpg, Png, Bmp, Gif, Tiff, Bitmap, .NET
program convert pdf to tiff; program to convert pdf to tiff
C# WPF PDF Viewer SDK to convert and export PDF document to other
Best PDF Viewer control as well as a powerful .NET Convert PDF to Microsoft Office Word (DOCX) document in Create multiple pages Tiff file from PDF document.
vb.net convert pdf to tiff; converting pdf to tiff
Listing 8.19: Initiating the Scanning of a Folder
Protected Sub Button2_Click(ByVal sender As Object, ByVal e As System.EventArgs)
Dim folder As Directory
objDirScanner = New DirScanner()
folder = New Directory(“D:\”)
MsgBox(“Your files occupy “ & _
objDirScanner.ScanTimerFolder(folder).Tostring & “ bytes on the drive”)
End Sub
The new event will be caught by the same object, the objDirScannerobject, in addition to the Scan-
Progress event. Delete (or comment out) the statements in the objDirScanner_ScanProgress event
handler and enter Listing 8.20’s lines in the new event’s handler.
Listing 8.20: The ScanTimerProgress Event
Public Sub objDirScanner_ScanProgress(ByVal foldersScanned As System.Integer, _
ByRef Cancel As Boolean) Handles objDirScanner.ScanProgress
Me.Text = “Scanned “ & foldersScanned.ToString & “ folders so far”
If foldersScanned > 3000 Then Cancel = True
End Sub
To test the Cancelargument, the program sets it to True to terminate the execution of the Scan-
Folder() method if it has already scanned more than 3,000 files. Normally, you should provide a
Cancel button on your form, which the user can click to terminate the execution of the method.
Check out the DirScanner project and experiment with other techniques for handling the Cancel
argument. If your 
Program Files 
folder contains fewer than 3,000 files, use a smaller value in the
code to terminate the process of scanning a folder prematurely. Notice that if the scanning operation
is interrupted prematurely, the corresponding method will not return the number of folders scanned
or the total number of bytes they occupy on disk.
Asynchronous Operations
An asynchronous operationis an operation you initiate from within your code and then continue with
other tasks, without waiting for the operation’s completion. When you start the download a file in
Internet Explorer, for example, you can continue surfing while the file is being downloaded in the
background. The more operations you can perform in the background, the more responsive your
application appears to be.
When the operation completes, the class must notify the application that it’s done, and this takes
place through an event. These events are similar to the progress events discussed in the previous sec-
tion, and we won’t discuss them in this chapter.
Shared Properties
When you instantiate a class, its code is loaded into memory, its local variables are initialized, and
then the New subroutine is executed. This happens the first time you instantiate a variable of the
Chapter 8 BUILDING CUSTOM CLASSES
354
Copyright ©2002 SYBEX, Inc., Alameda, CA
www.sybex.com
Online Convert PDF to HTML5 files. Best free online PDF html
Online PDF to HTML5 Converter. Download Free Trial. Convert a PDF file to HTML. Just upload your file by clicking on the blue button
pdf to tiff file conversion; save pdf to tiff
Online Convert PDF to Jpeg images. Best free online PDF JPEG
Online PDF to JPEG Converter. Download Free Trial. Convert a PDF File to JPG. Drag and drop your PDF in the box above and we'll convert the files for you.
convert pdf file to tiff online; file converter pdf to tiff
class’s type. If the class has already been instantiated (that is, if you have already created a variable of
the same type), the code isn’t loaded again. Instead, a new copy of each local variable is created. The
same code acts on different data, and it appears as if you have multiple instances of the class loaded
and running at the same time. Each instance of the class has its own properties; the values of these
properties are local to each instance of the class. If you declare two variables of the Minimal type in
your application, thus:
Dim obj1, obj2 As Minimal
then you can set their Ageproperty to different values:
obj1.property1 = 10
obj2.property2 = 90
The two expressions are independent of one another, as if there were two instances of the class in
memory at the same time.
There are situations, however, where you want all instances of a class to see the same property
value. Let’s say you want to keep track of the users currently accessing your class. You can declare a
method that must be called in order to enable the class, and this method signals that another user has
requested your class. This could be a method that establishes a connection to a database or opens a
file. We’ll call it the Connect method. Every time an application calls the Connect method, you can
increase an internal variable by one. Likewise, every time an application calls the Disconnect method,
the same internal variable is decreased by one. This internal variable can’t be private, because it will
be initialized to zero with each new instance of the class. You need a variable that is common to all
instances of the class. Such a variable is called sharedand is declared with the Shared keyword.
Let’s add a shared variable to our Minimal class. We’ll call it LoggedUsers,and it will be read-only. Its
value is reported with the Users property, and only the Connect and Disconnect methods can change its
value. Listing 8.21 is the code you must add to the Minimal class to implement a shared property.
Listing 8.21: Implementing a Shared Property
Shared LoggedUsers As Integer
ReadOnly Property Users() As Integer
Get
Users = LoggedUsers
End Get
End Property
Public Function Connect() As Integer
LoggedUsers = LoggedUsers + 1
{ your own code here }
End Function
Public Function Disconnect() As Integer
If LoggedUsers > 1 Then
LoggedUsers = LoggedUsers - 1
End If
{ your own code here }
End Function
355
BUILDING THE MINIMAL CLASS
Copyright ©2002 SYBEX, Inc., Alameda, CA
www.sybex.com
C# PDF Print Library: Print PDF documents in C#.net, ASP.NET
Word, VB.NET Excel, VB.NET PowerPoint, VB.NET Tiff, VB.NET NET PDF Document Printer A best PDF printer control for Visual Studio .NET and compatible with C#
how to save pdf to tiff; pdf to tiff converter online
To test the shared variable, add a new button to the form and enter Listing 8.22 in its Click event
handler. (The lines in bold are the values reported by the class; they’re not part of the listing.)
Listing 8.22: Testing the LoggedUsers Shared Property
Protected Sub Button5_Click(ByVal sender As Object, _
ByVal e As System.EventArgs)
Dim obj1 As New Minimal()
obj1.Connect()
Console.WriteLine(obj1.Users)
1
obj1.Connect()
Console.WriteLine(obj1.Users)
2
Dim obj2 As New Minimal()
obj2.Connect()
Console.WriteLine(obj1.Users)
3
Console.WriteLine(obj2.Users)
3
Obj2.Disconnect()
Console.WriteLine(obj2.Users)
2
End Sub
If you run the application, you’ll see the values displayed under each 
Console.WriteLine
state-
ment in the Output window. The values in bold are not part of the listing; I’ve inserted them in the
listing to help you match each item of the output to the statement that produces it. As you can see,
both obj1and obj2variables access the same value of the Users property. Shared variables are com-
monly used in classes that run on a server and service multiple applications. In effect, they’re the
class’s Global variables, which can be shared among all the instances of a class. You can use shared
variables to keep track of the total number of rows accessed by all users of the class in a database,
connection time, and other similar quantities.
A “Real” Class
In this section, I’ll discuss a more practical class that exposes three methods for manipulating 
strings. I have used these methods in many projects, and I’m sure many readers will have good use
for them—at least one of them. The first two methods are the ExtractPathName and ExtractFile-
Name methods, which extract the file and path name from a full filename. If the full name of a file 
is 
“c:\Documents\Recipes\Chinese\Won Ton.txt”
, the ExtractPathName method will return the
substring 
“c:\Documents\Recipes\Chinese\”
and the ExtractFileName method will return the sub-
string 
“Won Ton.txt”
.
Chapter 8 BUILDING CUSTOM CLASSES
356
Copyright ©2002 SYBEX, Inc., Alameda, CA
www.sybex.com
Note You can use the Split method of the String class to extract all the parts of a delimited string. Extracting the path
name and filename of a complete filename is so common in programming that it’s a good idea to implement the correspon-
ding functions as methods in a custom class. You can also use the Path object, which exposes a similar functionality. The
Path object is discussed in Chapter 13.
The third method is called Num2String; it converts a numeric value (an amount) to the equiva-
lent string. For example, it can convert the amount $12,544 to the string “Twelve Thousand, Five
Hundred And Forty Four.” No other class in the Framework provides this functionality, and any
program that prints checks can use this class.
Parsing a Filename String
Let’s start with the two methods that parse a complete filename. These methods are implemented as
public functions, and they’re quite simple. Start a new project, rename the form to TestForm, and
add a Class to the project. Name the class and the project StringTools. Then enter the code of List-
ing 8.23 in the Class module.
Listing 8.23: The ExtractFileName and ExtractPathName Methods
Public Function ExtractFileName(ByVal PathFileName As String) As String
Dim delimiterPosition As Integer
delimiterPosition = PathFileName.LastIndexOf(“\”)
If delimiterPosition > 0 Then
Return PathFileName.Substring(delimiterPosition + 1)
Else
Return PathFileName
End If
End Function
Public Function ExtractPathName(ByVal PathFileName As String) As String
Dim delimiterPosition As Integer
delimiterPosition = PathFileName.LastIndexOf(“\”)
If delimiterPosition > 0 Then
Return PathFileName.Substring(0, delimiterPosition)
Else
Return “”
End If
End Function
These are two simple functions that parse the string passed as argument. If the string contains no
delimiter, it’s assumed that the entire argument is just a filename.
The Num2String method is far more complicated, but if you can implement it as a regular func-
tion, it doesn’t take any more effort to turn it into a method. The listing of Num2String is shown in
Listing 8.24. First, it formats the billions in the value (if the value is that large), then the millions,
thousands, units, and finally the decimal part, which may contain no more than two digits.
357
A “REAL” CLASS
Copyright ©2002 SYBEX, Inc., Alameda, CA
www.sybex.com
Listing 8.24: Converting Numbers to Strings
Public Function Num2String(ByVal number As Decimal) As String
Dim biln As Decimal, miln As Decimal, thou As Decimal, hund As Decimal
Dim ten As Integer, units As Integer
Dim strNumber As String
If number > 999999999999.99 Then
Num2String = “***”
Exit Function
End If
biln = CInt(number / 1000000000)
If biln > 0 Then strNumber = FormatNum(biln) & “ Billion” & Pad()
miln = Int((number - biln * 1000000000) / 1000000)
If miln > 0 Then _
strNumber = strNumber & FormatNum(miln) & “ Million” & Pad()
thou = Int((number - biln * 1000000000 - miln * 1000000) / 1000)
If thou > 0 Then _
strNumber = strNumber & FormatNum(thou) & “ Thousand” & Pad()
hund = Int(number - biln * 1000000000 - miln * 1000000 - thou * 1000)
If hund > 0 Then strNumber = strNumber & FormatNum(hund)
If Right(strNumber, 1) = “,” Then _
strNumber = Left(strNumber, Len(strNumber) - 1)
If Left(strNumber, 1) = “,” Then _
strNumber = Right(strNumber, Len(strNumber) - 1)
If number <> Int(number) Then
strNumber = strNumber & FormatDecimal(CInt((number - Int(number)) * 100))
Else
strNumber = strNumber & “ dollars”
End If
Num2String = Delimit(SetCase(strNumber))
End Function
Each group of three digits (million, thousand, and so on) is formatted by the FormatNum()
function. Then, the appropriate string is appended (“Million”, “Thousand”, and so on). The
FormatNum() function, which converts a numeric value less than 1,000 to the equivalent string, is
shown in Listing 8.25.
Listing 8.25: The FormatNum() Function
Private Function FormatNum(ByVal num As Decimal) As String
Dim digit100 As Decimal, digit10 As Decimal, digit1 As Decimal
Dim strNum As String
digit100 = Int(num / 100)
If digit100 > 0 Then strNum = Format100(digit100)
digit10 = Int((num - digit100 * 100))
If digit10 > 0 Then
If strNum <> “” Then
Chapter 8 BUILDING CUSTOM CLASSES
358
Copyright ©2002 SYBEX, Inc., Alameda, CA
www.sybex.com
strNum = strNum & “ And “ & Format10(digit10)
Else
strNum = Format10(digit10)
End If
End If
FormatNum = strNum
End Function
The FormatNum() function formats a three-digit number as a string. To do so, it calls the For-
mat100() to format the hundreds, and the Format10() function formats the tens. The Format10()
function, as you may have guessed, calls the Format1() function to format the units. I will not show
the code for these functions; you can find it on the CD in the StringTools project. You’d probably
use similar functions to implement the Num2String method as a function. Instead, I will focus on a
few peripheral issues, like the enumerations used by the class as property values.
To make the Num2String method more flexible, the class exposes the UseCase, UseDelimiter,
and UsePadding properties. The UseCase property determines the case of the characters in the string
returned by the method. The UseDelimiter method specifies the special characters that may appear
before and after the string. Finally, the UsePadding property specifies the character that will appear
between groups of digits. The values each of these properties may take on are shown here:
UsePadding
UseDelimiter
UseCase
clsToolsCommas
clsToolsNone
clsToolsCaps
clsToolsSpaces
clsTools1Asterisk
clsToolsLower
clsToolsDashes
clsTools3Asterisks
clsToolsUpper
The actual numeric values are of no interest. The values under each property name are imple-
mented as enumerations, and you need not memorize their names. As you enter the name of prop-
erty followed by the equal sign, the appropriate list of values will pop up and you can select the
desired member.
Listing 8.26 presents the clsToolsCase enumeration and the implementation of the UseCase
property:
Listing 8.26: The clsToolsCase Enumeration and the UseCase Property
Enum clsToolsCase
clsToolsCaps
clsToolsLower
clsToolsUpper
End Enum
Private varUseCase As clsToolsCase
Public Property UseCase() As clsToolsCase
Get
Return (varUseCase)
End Get
359
A “REAL” CLASS
Copyright ©2002 SYBEX, Inc., Alameda, CA
www.sybex.com
Documents you may be interested
Documents you may be interested