10 Week Files, Printing, and Structures

advertisement
Week
10
Files, Printing, and
Structures
Introduction





Saving data to sequential text files
Reading the data back into an application
Using the OpenFileDialog, SaveFileDialog,
ColorDialog, and FontDialog controls
Using the PrintDocument control to print reports
from your application
Packaging units of data together into structures
2
Using Files
A File Is a Collection of Data Stored
on a Computer Disk
Information Can Be Saved to Files
and Later Reused
The Life Span of Data



Thus far, all of our data has been stored in
controls and variables existing in RAM
This data disappears once the program stops
running
If data is stored in a file on a computer disk, it can
be retrieved and used at a later time
4
Three Steps in Using a File
1. The file must be opened
If it does not yet exist, it will be created
2. Data is read from or written to the file
3. The program closes the file
5
Reading and Writing to a File




Data must be retrieved from disk and put in
memory for an application to work with it
Data is transferred from disk to memory by:
 Reading it from an input file
 Placing it in variables or control properties
Data is transferred from memory to disk by:
 Writing it to an output file
 Getting it from variables or control properties
Data is frequently placed in the text property of a
control
6
File Types/Access Methods

Text file type



Binary file type



Character based text
Contents can be viewed by Notepad
Pure binary form
Contents cannot be viewed with a text editor
Access Methods



Sequential access – a continuous stream of data
written and read as a whole from beginning to end
Random access – access in any order with data written
to or read from specific places in the file
Like the difference between a casette tape and a CD
7
Creating Files with StreamWriter Objects


Add Imports System.IO before class declared
 Makes StreamWriter classes available in code
A StreamWriter object is used to create a
sequential text file in the following way:
 Declare an object variable of type StreamWriter
Dim phoneFile As StreamWriter

Call CreateText method passing the filename
phoneFile = File.CreateText(“phonelist.txt”)
Method returns a StreamWriter object
 Object is assigned to a StreamWriter variable
Variable phoneFile now defines a stream of data
that can be written to phonelist.txt


8
Appending Text with StreamWriter

A StreamWriter object is used to append data to a
sequential text file in the following way:
 Declare an object variable of type StreamWriter
Dim phoneFile As StreamWriter

Call AppendText method passing the filename
phoneFile = File.AppendText(“phonelist.txt”)
Method returns a StreamWriter object
 Object is assigned to a StreamWriter variable
Variable phoneFile now defines a stream of data
that can be added to the end of phonelist.txt


9
File Paths

Filename can include the file path
 Can be a complete file path with drive letter
“C:\WordProc\memo.txt"

Refer to a file in the default drive root directory
"\pricelist.txt"

Or include no path information at all
"mytext.txt“

If no path information specified, the bin folder of
the current project is used
10
Writing Data to a File

The WriteLine method of a StreamWriter object
actually writes data to the file
ObjectVar.WriteLine(Data)
Streamwriter object identified by ObjectVar
 The method’s Data argument consists of
constants or variables with data to be written
WriteLine appends an invisible newline character
to the end of the data
Omit argument to write a blank line to a file



ObjectVar.WriteLine()
11
Writing Data to a File Example
Dim studentFile As StreamWriter
studentFile = File.CreateText("StudentData.txt")
studentFile.WriteLine("Jim")
studentFile.WriteLine(95)
The
studentFile.WriteLine("Karen")
Resulting
Jim
studentFile.WriteLine(98)
File,
95
studentFile.WriteLine("Bob")
StudentData.txt
Karen
studentFile.WriteLine(82)
98
studentFile.Close()
Bob
82
12
The StreamWriter Write Method
ObjectVar.Write(Data)


The Write method writes an item of data without
writing a newline character
Usually need to provide some sort of delineation
or delimiter between data items
 A blank space could be used
 Comma is a more common delimiter
13
Closing a StreamWriter Object


Should close files when finished with them
 Avoids losing data
 Data is initially written to a buffer
 Writes unsaved data from the buffer to the file
The Close method of a StreamWriter object
clears the buffer and closes the file
ObjectVar.Close()

Streamwriter object identified by ObjectVar
14
Appending to a File



If opening an existing file with CreateText
 Existing contents are removed
 New text overwrites the old text
If opening an existing file with AppendText
 Existing contents are retained
 New text adds on to the end of the old text
If adding a new friend to friendFile, use:
friendFile = File.AppendText("MyFriends.txt")
15
Appending a File Example
‘Declare an object variable
Dim friendFile as StreamWriter
friendFile
‘Open the file
“After”
friendFile = File.AppendText(“MyFriends.txt”)
‘Write the data
friendFile.WriteLine(“Bill Johnson”)
Jim Weaver
friendFile.WriteLine(30)
30
friendFile.WriteLine(“36 Oak Street”)
P.O. Box 124
‘Close the file
Mary Duncan
Jim Weaver
24
friendFile.Close()
30
friendFile
“Before”
P.O. Box 124
Mary Duncan
24
47 Elm Street
Karen Warren
28
24 Love Lane
47 Elm Street
Karen Warren
28
24 Love Lane
Bill Johnson
30
36 Oak Street
16
StreamReader Objects


Use StreamReader objects to read from a file
Define and open similar to StreamWriter:
Dim ObjectVar As StreamReader
ObjectVar = File.OpenText(Filename)

Sample code:
Dim phoneFile As StreamReader
phoneFile = File.OpenText(“phonelist.txt")


Variable phoneFile now defines a stream of data
that can be read from phonelist.txt
Must have Imports System.IO before class
declaration as was done with StreamWriter
17
Reading Data from a File

The ReadLine method of a StreamReader object
actually reads data from the file
dataVar = ObjectVar.ReadLine()
Streamreader object identified by ObjectVar
 The result of the method, the data read from
the file, is assigned to string variable dataVar
Sample code:


Dim custFile As StreamReader
custFile = File.OpenText("customer.txt")
custName = custFile.ReadLine()


custName holds the data read from the file
StreamReader also has a Close method
18
Determining Whether a File Exists


The File.OpenText method issues a runtime
error if the file does not exist
Avoid this by using the File.Exists method
 Format is File.Exists(filename)

Returns a boolean result that can be tested:
If System.IO.File.Exists(filename) Then
' Open the file.
inputFile = System.IO.File.OpenText(filename)
Else
MessageBox.Show(filename & " does not exist.")
End If
19
Detecting the End of a File

The Peek method tests if you’ve reached end of
file (no more characters to read)
 Format is objectvar.Peek
 If no more characters, the value -1 is returned
Dim scoresFile As StreamReader
Dim strInput As String
scoresFile = File.OpenText("Scores.txt")
Do Until scoresFile.Peek = -1
strInput = scoresFile.ReadLine()
lstResults.Items.Add(strinput)
Loop
scoresFile.Close()
20
Read Method


Read method returns the integer code of the next
character in the file
 Chr function converts integer code to character
This loop appends one character at a time to input
until no more characters are in the file
Dim textFile As StreamReader
Dim strInput As String = String.Empty
textFile = File.OpenText("names.txt")
Do While textFile.Peek <> -1
strInput &= Chr(textFile.Read)
Loop
textFile.Close()
21
ReadToEnd Method



ReadToEnd method returns the rest of the file
from the current read position to end of file
Functions differently from ReadLine method
 ReadToEnd method ignores line delimiters
The statement
input = textFile.ReadToEnd
reads the file contents and stores it in strInput
Dim textFile As StreamReader
Dim strInput As String
textFile = File.OpenText("names.txt")
strInput = textFile.ReadToEnd
textFile.Close()
22
Write Then Read an Entire Array
Dim intValues(9)
-----------------------------------------------Dim outputFile as StreamWriter
outputFile = File.CreateText("values.txt")
For intCount = 0 To (intValues.Length – 1)
outputFile.WriteLine(intValues(intCount))
Next intCount
outputFile.Close()
-----------------------------------------------Dim inputFile as StreamReader
inputFile = File.OpenText("values.txt")
For intCount = 0 To (intValues.Length – 1)
intValues(intCount) = CInt(inputFile.ReadLine)
Next intCount
inputFile.Close()
23
The OpenFileDialog,
SaveFileDialog, FontDialog,
and ColorDialog Controls
Visual Basic Provides Dialog Controls That Equip
Your Applications With Standard Windows Dialog
Boxes for Operations Such As Opening Files,
Saving Files, and Selecting Fonts and Colors
OpenFileDialog and SaveFileDialog




Windows has a standard method of allowing a
user to choose a file to open or save
 These methods let users browse for a file
The OpenFileDialog and SaveFileDialog controls
provide this capability in VB
To use the OpenFileDialog control
 Double click on this tool in the Toolbox
 Appears in component tray
 Use ofd as standard prefix when naming
SaveFileDialog is used in a similar way
25
Displaying an Open Dialog Box

Display control with the ShowDialog method
ControlName.ShowDialog()


Method returns a value indicating which dialog
box button the user selects, either
 DialogResult.OK, or
 DialogResult.Cancel
For example:
If ofdOpenfile.Showdialog() = DialogResult.OK Then
MessageBox.Show(ofdOpenFile.FileName)
Else
MessageBox.Show(“You selected no file”)
End If
26
Dialog Box Filter Property


FileDialog controls have a Filter property
 Limits files shown to specific file extensions
 Specify filter description shown to user first
 Then specify the filter itself
 Pipe symbol (|) used as a delimiter
Following Filter property lets user choose:
 Text files (*.txt), displays all .txt files
 All files (*.*), displays all file extensions
ofdOpenFile.Filter = "Text files (*.txt)|*.txt|" & _
"All files (*.*)|*.*"
27
Other OpenFileDialog Properties

InitialDirectory property specifies folder to use
 Default if not specified is current folder
 To set dialog box initial directory to C:\Data:
ofdOpenFile.InitialDirectory = “C:\Data”

Title property specifies the text on the title bar
 Default title is Open if not specified
ofdOpenFile.Title = “Select a File to Open”

Filename property returns file selected from dialog
box by user, in this case to selectedFile
selectedFile = ofdOpenFile.Filename
28
Open Dialog Box Example




User may choose to display .txt files or all files
Files from Data folder of hard drive are shown
Dialog box title shows Select a File to Open
Variable inputFile holds file selected by user
' Configure the Open dialog box and display it.
With ofdOpenFile
.Filter = "Text files (*.txt)|*.txt|" & _
"All files (*.*)|*.*"
.InitialDirectory = "C:\Data"
.Title = "Select a File to Open"
If .ShowDialog() = DialogResult.OK Then
inputFile = System.IO.File.OpenText(.Filename)
End If
End With
29
Open Dialog Box Example

InitialDirectory property
Title property

Filter property

30
SaveFileDialog Control



SaveFileDialog uses the same methods:
 ShowDialog()
The same properties:
 Filter
 InitialDirectory
 Title
 Filename
And the same result constants:
 DialogResult.OK
 DialogResult.Cancel
31
The PrintDocument Control
The PrintDocument Control Allows You to
Print Data to the Printer
PrintDocument Control



Allows you to send output to the printer
To use the PrintDocument control
 Double click the tool in the Toolbox
 Appears in component tray
 Use pd as standard prefix when naming
PrintDocument control has a Print method
 This method starts the printing process
 Format is:
PrintDocumentControl.Print()

This triggers a PrintPage event
33
PrintPage Event Handler

The code in the PrintPage event handler
performs the actual printing
 Double click PrintDocument control in tray
 This creates the PrintPage event handler
 Insert your print code inside the event handler
 Basic format of event handler shown below:
Private Sub pdPrint_PrintPage(ByVal sender As System.Object, _
ByVal e As System.Drawing.Printing.PrintPageEventArgs) _
Handles pdPrint.PrintPage
‘Your print code inserted here
End Sub
34
DrawString Method


The DrawString method is used inside the
PrintPage event to:
 Specify data to send to the printer in string
 Set font, font size, and font style
 Determine horizontal position (HPos) of text
 Determine vertical position (VPos) of text
 Brushes.Black specifies output in black
DrawString method is formatted as follows:
e.Graphics.DrawString(String, _
New Font(FontName, Size, Style), _
Brushes.Black, HPos, VPos)
35
Specifying Fonts, Sizes, Styles



Fonts are specified with the string which names
the font to be used
 "Times New Roman"
 “Arial" , etc.
Sizes are specified with a number
 10, 12, etc.
Print effects are specified with provided constants
 FontStyle.Regular
 FontStyle.Bold
 FontStyle.Underline
36
Sample PrintPage Event Procedure
Private Sub pdPrint_PrintPage(ByVal sender As System.Object, _
ByVal e As System.Drawing.Printing.PrintPageEventArgs) _
Handles pdPrint.PrintPage
Dim inputFile As StreamReader
Dim intX As Integer = 10
‘Horizontal Position
Dim intY As Integer = 10
‘Vertical Position
inputFile = File.OpenText(strFilename)
Do While inputFile.Peek <> -1
e.Graphics.DrawString(inputFile.ReadLine, _
New Font("Courier", 10, FontStyle.Regular), _
Brushes.Black, intX, intY)
intY += 12
‘Increment Vert Pos
Loop
inputFile.Close()
End Sub
37
Printing Column Based Reports




Business reports typically contain a:
 Report header printed at the top of the page
 Report body with the data, usually in columns
 Optional footer, often totalling certain columns
Report header usually has column headings
Monospaced font used for column reports
 Each character takes same amount of space
 This allows columns to be aligned
String.Format used to align data along column
boundaries
38
String.Format Example
String.Format("{0, 7}{1, -10}{2, 7}", 50, "Arg1", 6)
Specifies
the argument
number
Argument 0
Argument 1
Argument 2
Specifies field width for arg
negative - left justified
positive - right justified
Results in the following output:
50Arg 1
7 spaces
10 spaces
Left Justified
6
7 spaces
39
Structures
Visual Basic Allows You to Create Your
Own Data Types, in Which You May
Group Multiple Data Fields
Structures vs. Arrays


Arrays:
 Multiple fields in one array
 All of the same data type
 Distinguished by a numerical index
Structures
 Multiple fields in one structure
 Can be of differing data types
 Distinguished by a field name
41
Syntax for Declaring a Structure
[AccessSpecifier] Structure StructureName
FieldDeclarations
End Structure


StructureName is a name that identifies the
structure itself
FieldDeclarations are the declarations of the
individual fields within the structure
42
Structure Declaration Example


Following declares a structure with six fields
intended to record employee payroll data
Structure name is EmpPayData
Structure EmpPayData
Dim intEmpNumber As Integer
Dim strFirstName As String
Dim strLastName As String
Dim sngHours As Single
Dim decPayRate As Decimal
Dim decGrossPay As Decimal
End Structure
43
Creating and Initializing a Structure

Using the EmpPayData structure just defined
 Define variable deptHead of type EmpPayData
 deptHead contains the six fields in the structure
 Access each field using varName.fieldName
Dim deptHead As EmpPayData
deptHead.strEmpNumber = 1101
deptHead.strFirstName = "Joanne"
deptHead.strLastName = "Smith"
deptHead.sngHours = 40
deptHead.decPayRate = 25
deptHead.decGrossPay = CDec(deptHead.sngHours) * _
deptHead.decPayRate
44
Passing Structure Variables
to Procedures and Functions


Structures can be passed to procedures and
functions like any other variable
The data type to use in the specification is the
name of the structure
Sub CalcPay(ByRef employee as EmpPaydata)
‘ This procedure accepts an EmpPayData variable
‘ as its argument. The employee’s gross pay
‘ is calculated and stored in the grossPay
‘ field.
With employee
.decGrossPay = .sngHours * .decPayRate
End With
End Sub
45
Structures Containing Arrays


Structures can contain arrays
Must ReDim after declaring structure variable
Structure StudentRecord
Dim strName As String
Dim sngTestScores() As Single
End Structure
Dim student As StudentRecord
ReDim student.sngTestScores(4)
student.strName = "Mary McBride"
student.sngTestScores(0) = 89
Student.sngTestScores(1) = 92
Student.sngTestScores(2) = 84
Student.sngTestScores(3) = 96
Student.sngTestScores(4) = 91
46
Arrays Containing Structures



Can declare an array of structures
Example below declares employees as an array
of type EmpPayData with 10 elements
Can refer to each field using the format
arrayName(index).fieldName
Dim employees(9) As EmpPayData
' Refer to the empNumber of the first employee
employees(0).empNumber = 1101
47
Download