create pdf thumbnail image c# : Add forms to pdf software application dll windows html asp.net web forms AccessTutorial7-part966

Fig 5.1B  Addressing the objects
frmFindStay
txtName
subStayList
+ fsubStayList
current record
Ctrl+G: Open the 
Immediate window
we look for the SourceObject property of subStayList. 
The result is the name of the fsub. (Notice that our pre-
fix rules help us distinguish between the subform con-
trol and the fsub connected to this control).   
19. Try setting SourceObject to nothing (an empty text 
in quotes): 
Forms!frmFindStay!subStayList. SourceObject = ""
The subform in the user window becomes blank. 
Try setting it back again (it is a text, so remember 
the quotes.) 
As soon as we set SourceObject, Access closes the 
previous subform and opens the new one. The Source-
Object property is a dialogue variable, so a change will 
not survive close and open. 
Form property. Above we looked at the SourceObject 
property, which is a text - the name of the fsub. But a 
subform has another interesting property, Form. It is a 
reference to the open form that is shown in the subform 
area. You cannot see this property in the property box 
because it is not a text, but a pointer that only exists in 
user mode. However, you can use the Form property in 
VBA.  
20. Try this command in the Immediate window: 
?Forms!frmFindStay!subStayList. Form!name
It should print the name of the guest selected in the 
subform area. The first part is the reference to sub-
StayList on frmFindStay. Now comes a dot saying that 
we look for the Form property of subStayList. The re-
sult is a reference to the open form that is shown in the 
subform area.  
Next comes a bang and a reference to the name field, 
i.e. the address of a guest. Now which guest? The sub-
form shows many records - which of the addresses will 
we get? The address in the currently selected record. 
Was this what you got? Try selecting another record on 
the list and repeat the command. 
Bang versus dot 
21. Try using a dot instead of a bang before name
?Forms!frmFindStay!subStayList. Form. name
It doesn't print the name of the guest, but the name of 
the subform. Because of the dot, the statement asks for 
the name property of the form.  
When you use the bang, you ask for a control on the 
fsub - or a field in the bound record behind the fsub. 
Abbreviations. Above we have used the full address 
expressions, but Access allows various abbreviations. 
For instance you may refer to the guest control of the 
subform in any of these ways: 
Dot instead of bang 
Forms!frmFindStay!subStayList. Form. address1 
This works only because there is no address1 property 
in a form. 
Form omitted 
Forms!frmFindStay!subStayList!guest
However, you cannot omit Form and use a dot at the 
same time. Access will believe that you ask for a prop-
erty of the sub-control. 
Warning. The bang mechanism works only in Visual 
Basic. It doesn't work in SQL. For instance you have to 
write 
... JOIN ON tblGuest.guestID = tblStay.guestID
If you write 
tblGuest!guestID
, the system gives an error 
message. 
5. Access through Visual Basic 
71
Add forms to pdf - C# PDF Field Edit Library: insert, delete, update pdf form field in C#.net, ASP.NET, MVC, Ajax, WPF
Online C# Tutorial to Insert, Delete and Update Fields in PDF Document
change font on pdf form; change font size in pdf fillable form
Add forms to pdf - VB.NET PDF Field Edit library: insert, delete, update pdf form field in vb.net, ASP.NET, MVC, Ajax, WPF
How to Insert, Delete and Update Fields in PDF Document with VB.NET Demo Code
pdf form change font size; adding text field to pdf
5.2 Event procedures (for text box) 
Above, we have executed VBA statements through the 
Immediate window, but when the user uses the system, 
we need another way to activate VBA. We want the 
system to respond to user actions, for instance the user 
clicking a button, typing something in a text box, etc. 
These user actions are called events. You can write a 
VBA procedure for each kind of event.  
AfterUpdate event 
We will now write an event procedure that makes 
txtName respond when the user has entered a search 
criterion. 
1.  Open frmFindStay, select the txtName search cri-
terion, and view the property box. (In Access 97 
you can only do this in Design mode.) 
2.  Look at the Event tab. It has a list of the events 
that the control can respond to (Figure 5.2A). The 
event we are interested in is AfterUpdate. It hap-
pens when the user has finished entering the text in 
the control.  
3. Create event procedure. Choose AfterUpdate, the 
three dots, and Code Builder. This creates the 
event procedure for AfterUpdate. 
You are now in the Visual Basic window. You may 
make the window smaller so that you can see frmFind-
Stay too. Also make the Access window smaller so that 
you can see the two windows side by side.  
Inside the Visual Basic window you see the event pro-
cedure for AfterUpdate (Figure 5.2A, right). The first 
line reads  
Private Sub 
txtName_AfterUpdate
It shows that it is the AfterUpdate subroutine (proce-
dure) for the txtName control. 
4.  The body of the procedure is initially empty. Now 
enter this statement: 
Me!subStayList . Requery
Me. The word Me means the open form where this 
control is placed - in this case the same as 
Forms!frmFindStay
. We ask Access to find the 
subStayList control. Finally we ask Access to call the 
procedure Requery in this control. The result is that 
subStayList recomputes the query behind the subform. 
Since the query gets its where-condition from txtName, 
the stay list should change. 
Omitting Me. In most cases you can omit Me. You 
may for instance write 
subStayList . Requery
The exception is when some built-in function or 
property has the same name as the control. In the 
following sections we will sometimes write Me for 
emphasis, sometimes omit it. 
When is the AfterUpdate procedure called? Whenever 
the user shows that he has finished entering the text, for 
instance when he clicks on another control in the same 
form, tabs to another field, or hits Enter. Try it: 
5.  Enter a criterion in the name field, for instance "a". 
Click Enter. The stay list should now shrink ac-
cording to the new criterion. Enter another crite-
rion and use Tab. The system should respond.  
6.  Change the criterion and then - without using En-
ter, etc. - click in another window, for instance the 
property box. The stay list should not change be-
cause txtName still has the focus and Access as-
sumes that the user hasn't finished the field. Now 
click another field on FindStay. The stay list 
should respond. 
5.2.1 More text box properties 
We will now make txtName respond each time the user 
hits a key. To do this, we need to act on another event, 
OnChange. This event happens whenever the user 
types something in the text box or deletes a character. 
When Access calls this event procedure, the situation is 
a bit complex because several properties of the text box 
are involved: 
Value: This property is the value before the user 
started editing the text box. Note that Value is the 
default property for a text box, so if you don't spec-
ify another property in your address expression, 
VBA will use Value. When the Value property is 
empty, it has the value Null, similar to a database 
field 
Text: The value the user enters, but hasn't finished yet. 
This is the text the user sees on the screen, but it is 
not yet stored in Value. You can only access this 
property when the text box has the focus. At other 
times, the Text variable doesn't exist at all. When 
the Text property is empty, it is a zero-length text 
with the value "", similar to a VBA string variable. 
OldValue: The value before the user started editing the 
text. For bound controls (bound to a field in the 
database), this is the same as the value in the 
database. When the entire record is complete, 
Access transfers Value to OldValue. OldValue is 
useful when the editing must be undone for some 
reason. For unbound controls, OldValue and Value 
are always the same.
72 
5. Access through Visual Basic 
C# PDF: PDF Document Viewer & Reader SDK for Windows Forms
Viewer in C#. In this section, we offer detailed guidance for you to create and add a PDF document viewer & reader in Windows Forms application using C# code.
adding form fields to pdf files; add fillable fields to pdf online
C# PDF: How to Create PDF Document Viewer in C#.NET with
The PDF document manipulating add-on from RasterEdge ASP.NET web service application, Windows Forms application and The PDF document viewer & reader created by
cannot save pdf form; changing font size in pdf form field
Fig 
5.
2A  An event procedure
Click three dots.
Select Code Builder
Form
Form
module
Important Textbox attributes
Value:
Last value completed by user (default attribute)
Text:
What user sees during editing
OldValue:Value saved in database
Change event 
We will now make txtName respond to each keystroke. 
Proceed in this way: 
7.  On the event tab for txtName, choose OnChange 
and the three dots. You now see the event proce-
dure for the Change-event. 
8.  Write these statements in the procedure body (Fig-
ure 5.2A): 
Me.txtName = Me.txtName.Text
Me.subStayList.Requery
Me.txtName.SelStart = 100
9.  Try it in user mode. As soon as you enter some-
thing in the text box, the stay list changes accord-
ingly. 
The first procedure line copies Text to the Value of the 
control. As a result, Value becomes what the user has 
entered until now. Then the program recomputes the 
stay list. During this it gets the search criterion from 
the value of txtName. This is why we moved Text to 
Value. 
The last procedure line is more of a mystery. If you try 
using the system without this line, the entire text box 
becomes selected whenever you enter something. This 
seems to be an undocumented side-effect of setting the 
Value. To compensate for it, we let the program define 
what is selected. We define the selection start point 
(SelStart) to be character 100 of the text. Since the text 
is much shorter, Access interprets it as being the end of 
the text. 
This solution works, but not very well. If you for in-
stance try to change a few characters in the middle of 
the search criterion, the system annoyingly moves the 
cursor to the end of the text. We could repair it by 
storing the position before we set the Value, and set it 
back afterwards. This is messy, and in the next section 
we will show a more professional solution.
5. Access through Visual Basic 
73
C# PDF Converter Library SDK to convert PDF to other file formats
Various image forms can be converted from PDF document, including Jpeg, Png, Bmp, Gif images, .NET Graphics, and REImage. C#.NET PDF to Image Forms Conversion.
add an image to a pdf form; pdf form maker
VB.NET PDF Converter Library SDK to convert PDF to other file
As this VB.NET PDF converting control add-on encodes mature VB.NET PDF converting APIs into several compact dlls Conversion of Image Forms to PDF.
create a pdf form from excel; create a fillable pdf form from a pdf
5.2.2 Computed SQL and live search 
We will now the professional solution. We don't 
change Value at all, but compute the SQL-statement to 
be used for the stay list. Let us first assume that the 
user has entered the search criterion john. The event 
procedure could then compute the list of stays in this 
way: 
Me.subStayList.Form . RecordSource = _ 
"select * from qryStayList where name like ( '*john*' );" 
This is one long Visual Basic statement split into two 
lines by means of the space and underscore at the end 
of the first line. 
Now, what does the statement do? The first line refers 
to the open form in subStayList. The form has a record 
source property, which defines the records to display. 
We had bound the form to qryStayList, so the record 
source was "qryStayList".  
Now the procedure changes the record source to the 
SQL statement in the second line. This statement takes 
all records in qryStayList where the name contains 
john. And it selects all attributes from the records. This 
is what we need. 
Notice that the SQL statement is a text surrounded by 
double quotes. Inside the statement we have another 
text string '*john*'. This text string is surrounded by 
single quotes to distinguish it from the large text. We 
haven't cared to write SELECT etc. with caps. The 
SQL engine accepts the statement anyway. 
The only problem is that john should be the text that 
the user has entered. So the event procedure has to 
compose the SQL statement from three parts, like this: 
"select * from qryStayList where name like ('*" & _ 
Me.txtName.Text & "*');" 
Note: Some developers don't use single quotes for the 
text inside the text. They use double quotes for the 
inner text. So instead of 
" . . . like ('*" &  
they would write 
" . . . like (""*" & 
The rule is that inside a text string, the characters "" 
mean a single ". 
Try it out 
You may try the solution right away, but take care. The 
next time you open frmFindStay and try to search, 
Access remembers the SQL statement your program 
has set. It uses this statement as the initial query for the 
future. (I would call this an error.) 
To avoid problems do as follows: 
1.  In qryStayList, remove the user criterion that we 
defined earlier (like . . . ). We don't need it any-
more. 
2.  In fsubStayList, the record source is qryStayList
Change it to select * from qryStayList; 
3.  Change the event procedure and try it out (see 
Figure 5.2B). 
You should now have a live search similar to the one 
used in the real system. 
(If Access still remembers the previous search crite-
rion, open frmFindStay in design mode and set once 
more the Source Object of subStayList to fsubStayList.) 
Computed SQL may seem very cumbersome. Yes - it 
is, no doubt! However, when we need complex user 
criteria, for instance a combination of name and/or 
phone and/or date, the easiest way is to let the program 
compute the SQL statement. In general, computed SQL 
is the professional way to make complex systems. 
In the next section we will use computed SQL to deal 
with combinations of search criteria, some of them live 
and some lazy.  
74 
5. Access through Visual Basic 
VB.NET PDF File & Page Process Library SDK for vb.net, ASP.NET
there is a newly created page, you may need to add it into PDFDocument instance contains all documentation features and information that forms a PDF document
create a form in pdf from word; create a fillable pdf form
VB.NET PDF: VB Code to Create PDF Windows Viewer Using DocImage
document files (TIFF, PDF and Word) within single or multiple safe threaded .NET platform project(s), including C#.NET, VB.NET, ASP.NET and .NET Windows Forms.
add picture to pdf form; pdf forms save
Fig 5.2B  Computed SQL and live search
Define new 
record source
To make it work properly:
Remove the old user criterion from qryStayList.
Set record source of fsubStayListto: select * from qryStayList; 
Change the event procedure as above. Try it out.
Compute SQL from
part1 & part2 & part3
Note the single quotes around 
text strings that end up in SQL:
(
'*"
& . . . & 
"*'
); "
5. Access through Visual Basic 
75
C# PDF Convert to Images SDK: Convert PDF to png, gif images in C#
Besides raster image Jpeg, images forms like Png, Bmp, Gif, .NET Graphics C#.NET DLLs Solution for Converting Images to PDF in C#.NET. Add necessary references:
add fields to pdf; pdf form creator
C# PDF Page Insert Library: insert pages into PDF file in C#.net
processing control SDK, you can create & add new PDF page(s) to current target PDF document in both web server-side application and Windows Forms project using
pdf form save with reader; allow saving of pdf form
5.2.3 Composite search criteria 
Figure 5.2C shows an example where the user can use 
one or more criteria in any combination - composite 
search criteria. The figure also shows the programmer 
names of the various controls. The name criterion is 
called txtName, the booked criterion chkBooked, etc. 
The user may fill in part of the guest's name, and/or 
parts of his address, etc. The user may also restrict the 
search to booked stays, and/or checked-in stays, etc. 
To achieve this, the program must generate a suitable 
SQL statement for each combination of criteria. The 
pattern in the final SQL should be this, with optional 
parts shown in square brackets: 
SELECT * FROM ... WHERE TRUE  
[ AND name Like( "*john*") ]  
[ AND address1 Like( "*buf*") ]   
[ AND phone Like( "*3700*") ]  
[ AND arrival = #21-10-02# ] 
AND (FALSE [ OR state=1 ] [OR state=2 ] 
[ OR state>2 OR ISNULL(state) ] ); 
Notice that we start with a useless TRUE before the 
optional AND's, and a useless FALSE before the 
optional OR's. This is a trick that makes the program 
far simpler. Each piece of the program doesn't have to 
care whether it adds the first element to an AND/OR 
list, or a later element.  
The figure shows the program that generates the SQL 
statement. It gradually builds up the SQL-statement in 
the string variable s. First it puts SELECT * . . . TRUE 
into s. Next it tests whether the name criteria holds 
something. If so, it appends AND name Like . . . to s. 
And so on. Finally, it stores the SQL statement as the 
records source of the stay list. 
In the places where the pattern has john, buf, etc., the 
program inserts the value from the appropriate text 
box.  
Notice how we have written SQL parts in caps. 
Professionals do so to make the SQL pattern stand out 
more clearly. We explain the details below. 
Shared procedure 
When should this tricky piece of program be executed? 
If the screen used an ordinary Search button, the 
program should be the event procedure for the button. 
However, we want to make a live search. In this case 
the program must be executed whenever one of the 
criteria changes value, i.e. for a whole bunch of event 
procedures.  
The solution is to make the program piece a separate 
procedure. It starts with Private Sub and ends with End 
Sub (see more on procedures in section 6.2). The 
appropriate event procedures call this procedure as 
shown for txtName_Change, txtArrival_AfterUpdate 
and chkBooked_AfterUpdate
Live search criteria 
In order to make a live search, the program must 
respond whenever the user has typed something. The 
partially finished criteria are used for the search, and 
the stay list shrinks gradually. While the user types, the 
result is not in the box's Value, but in the temporary 
variable Text. The other text box values are in Value.  
It would complicate the search procedure to deal with 
this too. The solution is to let the event procedures 
store the current criteria in the variables copyName, 
copyStreet and copyPhone. The event procedure 
txtName_Change shows how. The search procedure 
uses these copies to generate the SQL statement. 
Note how we have declared the copy variables in the 
first line of the form (see more in section 6.2). 
Lazy search criteria 
Some of the search criteria should not be live. The 
check boxes, for instance, are either true or false. It is 
sufficient to let their AfterUpdate procedure call the 
search procedure and let it use the checkbox values. No 
copy is needed. 
The arrival date might be live, but while the user types 
the date, the intermediate value has little meaning. The 
stay list would just flicker and confuse the user. For 
this reason, the arrival date reacts only at AfterUpdate. 
Date comparison 
In Figure 5.2C, the arrival date is a text box control 
with the format property short date. Access will check 
that the text corresponds to a valid date. It will show 
the date according to the format property, but it will 
store it as a Double number - the number of days since 
the end of 1899 (see page 11).  
When generating the SQL statement, the program uses 
the CDbl function (Convert to Double) to show the 
date as a number: 
" AND arrival = " & CDbl(txtArrival) 
This would generate an SQL fragment like this: 
AND arrival = 37550 
Later, the SQL engine will compare the dates in their 
number form, and everything works fine. 
Why all this fuzz? Couldn't we simply write: 
" AND arrival = " & txtArrival 
When Access appends txtArrival, it converts it to text 
format by means of the CStr function. This function 
produces a date in the regional date format set up in 
MS Windows. With a European date format, we would 
get this SQL fragment: 
AND arrival = 21-10-07 
SQL would reject it since dates have to be enclosed by 
# #. So what about this: 
" AND arrival = #" & txtArrival & "#"
76 
5. Access through Visual Basic 
VB.NET Image: Professional Form Processing and Recognition SDK in
your forms before using form printing add-on. for ASP.NET AJAX, Silverlight, Windows Forms as well powerful & profession imaging controls, PDF document, image
adding text fields to a pdf; create a pdf form
C# TIFF: C#.NET Code to Create Windows TIFF Viewer | Online
Add buttons to complete other Windows TIFF Viewer ASP.NET AJAX, Silverlight, Windows Forms as well powerful & profession imaging controls, PDF document, image
best way to create pdf forms; add jpg to pdf form
Fig 5.2C Composite criteria 
txtName
Dim copyName As String, copyStreet As String, copyPhone As String
Private Sub search()
Dim s As String
s = "SELECT * FROM qryStayList WHERE TRUE "
If copyName <> "" Then s = s & "AND name Like( '*" & copyName & "*' ) "
If copyStreet <> "" Then s = s & "AND address1 Like( '*" & copyStreet & "*' ) "
If copyPhone <> "" Then s = s & "AND phone Like( '*" & copyPhone & "*' ) "
if txtArrival > 0 Then s = s & "AND arrival = " & CDbl(txtArrival)
s = s & "AND (FALSE "
If chkBooked Then s = s & " OR state = 1 "
If chkCheckedIn Then s = s & " OR state = 2 "
If chkOther Then s = s & " OR state > 2 OR ISNULL(state) "
s = s & ");"
Me.subStayList.Form.RecordSource = s
End Sub
Private Sub txtName_Change()
copyName = txtName.Text
Call search
End Sub
Private Sub txtArrival_AfterUpdate()
Call search
End Sub
Private Sub chkBooked_AfterUpdate()
Call search
End Sub
frmFindStay3
txtStreet
txtPhone
chkBooked
chkCheckedIn
chkOther
Sub search doesn't know whether criteria 
are in Value or Text. So they are always here.
SELECT * FROM qryStayList WHERE 
TRUE AND name Like('*joh*') . . .
AND (FALSE OR state = 1 . . .
. . . );
txtArrival
Now we would get this fragment: 
" AND arrival = #21-10-07#
Looks all right, but unfortunately, SQL expects dates in 
the US format. In this case it would reject 21 as a non-
existing month, in other cases produce a wrong result.  
Fortunately, the Access database engine can treat dates 
as double numbers, but other databases may not. In 
such cases you would have to generate the dates with 
an explicit US-format, for instance in this way: 
" AND arrival = #" & Format(txtArrival, "mm/dd/yyyy") & "#"
Empty texts 
An empty field in the database has the value Null for 
all types of fields. The same applies for the Value in an 
empty text box. To test for an empty field , we would 
ask for IsNull(f). In a VBA string variable, an empty 
text is a zero-length text with the value "". Since 
copyName is a string variable, we ask whether the text 
is different from "". 
Null values 
Notice how the program deals with Other stays, i.e. 
stays that are neither booked nor checked-in. These 
stays include those with state > 2 and those without a 
state (a NULL state). Stays with a NULL state are not 
real stays, but records generated by the outer join for 
guests that don't have a stay. 
Initialize the form 
A final touch is to make the Find Guest screen 
initialize itself properly: 
Let the three checkboxes have a mark initially. 
Otherwise, the stay list will be empty initially and 
the user may panic. To do this, set the initial value 
of the boxes through their property sheet. 
Let the Form's Load event procedure call the 
search procedure in order to make the stay list 
match the initial criteria: 
Private Sub Form_Load() 
Call search 
End Sub 
Try it out 
You should try to make the solution work in practice. It 
is a challenge, but fun. Make a copy of frmFindStay 
and use it for the experiment. 
5. Access through Visual Basic 
77
5.2.4 Event sequence for text box 
We have now looked at two events for the text box, 
Change and AfterUpdate. However, there are many 
more, as you can tell from the Event tab in the property 
box. (Select the event procedure and click F1 to get an 
explanation of the event.) Figure 5.2D shows typical 
event sequences for a text box. We will explain what 
happens. 
User clicks in the text box. First, the text box's Form 
object may get a Current event. This happens if the 
text box is in a record that wasn't selected before.  
Next, the text box receives two events, Enter and 
GotFocusEnter signals that now the control is 
active. Before calling the Enter event-procedure, 
Access creates the Text property and sets it to the 
current Value of the text box. GotFocus signals that 
typing will now go to this control.  
Then the textbox receives this series of events: 
MouseDown, MouseUp, Click and maybe also a 
DblClick. 
User types an Ascii character. The text box receives 
four events: KeyDown, KeyPress, Change, KeyUp 
(plus mouse events if the mouse is used). KeyDown 
occurs when the user depresses any key. The event 
procedure has parameters that give details of the 
physical key and other keys depressed at the same 
time, for instance Shift and Ctrl. KeyPress occurs 
when the key has generated an Ascii character, for 
instance a letter, digit, space, tab or backspace. All 
of these correspond to characters in the Ascii al-
phabet. 
The Change event occurs when the visible content 
of the control has changed, for instance that a char-
acter was added to the text or a character was de-
leted. Before calling this event procedure, Access 
updates the Text property so that it contains what 
the user sees. 
The KeyUp event occurs when the user releases the 
key. If the user keeps the key down to generate for 
instance a whole sequence of x's, each x generates 
KeyDown, KeyPress and Change. The KeyUp oc-
curs only when the user releases the key. 
User types a non-Ascii character, for instance Arrow 
left or F6. This generates only the KeyDown-event 
(and the KeyUp). Nothing happens to Text or 
Value, and no Change event is generated. 
User types Delete. Delete is not an Ascii character, so 
no KeyPress-event occurs. However, one or more 
characters may be deleted, and then a Change event 
occurs. KeyDown and KeyUp occur too. 
User tabs to the next field. Access generates several 
events. KeyDown occurs since the user pressed the 
Tab key. BeforeUpdate shows that the user has fin-
ished the field, but it is not yet accepted. Before 
calling the event procedure, Access has copied Text 
to Value. BeforeUpdate may check the value, and 
in case something is wrong reject the update. 
Rejecting the update means that focus remains on 
the text box and no AfterUpdate event is generated 
yet. The user may edit the field or click Esc to set 
the value back to its old value. 
If it is an unbound control (not connected to a 
database record), Access will also copy Text to 
OldValue before calling the procedure. This is quite 
illogical because OldValue is intended for letting 
the program restore an erroneous field. This is not 
possible for unbound controls. 
Next comes the AfterUpdate-event. The value has 
been checked and the procedure may act on it. In 
the example above we used this opportunity to re-
compute the stay list. If it is a bound control, the 
value will not yet be stored in the database, nor will 
OldValue be changed. Storing the value in the 
database doesn't happen until the user moves to 
another record or explicitly saves the record with 
Shift+Enter (or Records -> Save Record).  
Next comes the Exit event. It signals that the field is 
not active anymore. Finally, LostFocus occurs and 
signals that typing will go to another control. When 
both events have occurred, the Text property disap-
pears.  
What about KeyUp? It happens in the next field, 
which accordingly receives the KeyUp event. 
Before that, the next field receives Enter and 
GotFocus - in the same way as if the user clicked in 
the next field. 
What about errors in what the user has typed, for 
instance an incorrect date? Access shows an error 
message to the user instead of calling Before-
Update, and the cursor remains in the field. Can't 
the program interfere before this error message? 
Yes it can. The form receives a Form_Error event, 
which may take action and cancel the error message 
that Access was about to show (see section 5.5.10). 
User clicks in next field. Access does almost the same 
as when the user tabs to the next field. The only dif-
ference is that there is no KeyDown event. 
User moves to next record. First the text box in focus 
will receive the same events as if the user moved to 
another control in the same record.  
Next, the Form object receives three events. 
BeforeUpdate signals that the record is about to be 
saved and that the program may check that values 
are correct and consistent with each other. The Be-
78 
5. Access through Visual Basic 
Fig 5.2D Event sequence, textbox
User action
Events
Property changes before call
Click in textbox
(Form: Current)
Enter.
Text = Value, OldValue = Value
GotFocus.
MouseDown, MouseUp
Click, (DblClick).
Type Ascii character KeyDown, KeyPress.
(letter,digit, tab . . . ) Change.
Text = Modified text
KeyUp.
Type ArrowLeft or F6 KeyDown, KeyUp.
Type Delete
KeyDown.
Change.
Text = Modified text
KeyUp.
Tab to next field
KeyDown.
in same record
BeforeUpdate.
Value = Text. Unbound controls
(or Form: Error)
also have OldValue = Text
(Program may cancel update)
AfterUpdate.
Exit, LostFocus.
Text property disappears
Next field gets: Enter,
GotFocus,KeyUp.
Click in next field
As tab to next field,
but no KeyDown event.
Move to next record
Form: BeforeUpdate.
(Program may cancel update)
Form: AfterUpdate.
All bound controlsin the form: 
Database = OldValue = Value
Form: Current.
Click outside form
LostFocus.
(no action)
Click in form again
GotFocus.
(no action)
Click outside Access (no event)
foreUpdate procedure may cancel further event 
processing so that the database is not updated.  
If everything is okay, Access stores all the bound 
control values in the database and in OldValue, 
then calls the AfterUpdate procedure. Finally, 
Access calls the Current procedure to signal that a 
new record is selected. 
User clicks outside the form, but inside the same 
Access window. Access generates a LostFocus 
event to show that typing will go to another object 
in Access. In this case the Text property does not 
disappear.  
User clicks in form again. The active text box 
receives a GotFocus event. The Text property has 
survived. 
User clicks outside Access. The text box does not re-
ceive any events (except for MouseMove events). 
All properties survive. When the user clicks on the 
Form again - even on the title bar - focus will be 
back at the text box, but it receives no events at that 
point. 
The OldValue property allows the program to undo 
changes to bound controls until the moment when the 
form receives an AfterUpdate event. To undo a change, 
the program sets Value=OldValue. 
Key Preview. In some cases we want a key or key 
combination to perform the same thing no matter 
which control is selected. One example is function 
keys. For instance we may want F2 to mean Reset 
Criteria no matter where in the form the cursor is. This 
can be handled by letting the Form look at the key 
before any control gets to know about it. See section 
5.5.9 for this Key Preview function.
5. Access through Visual Basic 
79
5.3 Visual Basic tools 
Before we go on writing more complex event proce-
dures, we will show some tools that Visual Basic of-
fers.  
1. Open a form in Design mode. Now click the Code 
icon on the toolbar (close to the Toolbox icon).  
You are now in the Visual Basic window. (You might 
also get there by choosing an event procedure in the 
property box, as we did above.) 
Docking and undocking, Access 2000 and 2003 
The Visual Basic window may contain many frames. In 
Access 2000 and 2003, they may be docked inside the 
window or undocked, i.e. floating as separate small 
windows. By accident you may dock or undock them, 
and it may be very frustrating trying to get them back 
where you want. So better learn how to deal with it: 
2.  Make sure the Visual Basic window occupies only 
part of the screen. 
3.  Make sure the Docking settings are all on: Go to 
Tools -> Options -> Docking and make sure that all 
the checkboxes are set. Close the option box. 
4.  Click the Project Explorer icon. The window may 
now look like Figure 5.3A with a list of forms at the 
left (the Explorer frame) and some program code at 
the right. However, it may also show only the Ex-
plorer frame, or show the Explorer frame as a small, 
floating window. 
5.  Drag the Explorer frame to somewhere outside the 
Visual Basic window. The Explorer frame is now 
undocked. 
6.  Drag the Explorer frame to somewhere inside the 
Visual Basic window. The frame will dock some-
where along a side of the window. Where it docks 
does not depend on where the frame is when you 
release the mouse button. It depends on where the 
mouse pointer is when you release the button. 
7.  Try dragging the frame around in the Visual Basic 
window. Notice that when the mouse pointer is 
close to one of the sides, the frame changes to a thin 
line showing the new shape of the frame. Release 
the button to dock the frame accordingly. 
8.  Try double-clicking the title bar of the frame. The 
frame toggles between docked and undocked. 
Leave it docked as on Figure 5.3A. 
Project Explorer 
To the left you see a list of all forms in the database. In 
object-oriented terminology, each form is a class. The 
class has a code module with event procedures for the 
controls on the form. When you double-click a form on 
the list, you will see the code module to the right in the 
Visual Basic window. 
The database may also contain code modules (classes) 
that are not forms. They are shown at the bottom of the 
Project Explorer list. 
All code modules may contain procedures and declare 
variables. VBA offers three kinds of modules: 
Form module. A form module has event procedures 
for all controls on the form, and it may have ordi-
nary procedures too. It may declare variables. 
When you open a form, you get an object based on 
the form class. The object is a visible form and it 
has a set of variables corresponding to the declara-
tions.  
You cannot open several versions of the form just by 
clicking multiple times in the database window, but 
you may do it from Visual Basic. Then you get more 
form objects, appearing as other open copies of the 
form. Each copy has its own variables, but the same 
code. When the code uses addresses such as 
Me.txtName, it refers to the controls and variables of 
this particular copy of the form.  
When you create a form, you don't get its form module 
until you create its first event procedure. 
Class module. A class module corresponds to a class 
in other object-oriented languages. It has proce-
dures and declares variables, and you can create 
multiple objects based on the class, each with their 
own variables. The only difference between form 
modules and class modules is that the latter are not 
visible to the user and have no controls. 
See section 5.7 on how to create modules. 
Module (simple). A simple module is similar to a class 
but there is only one object based on the module. 
The system creates this object automatically. The 
first versions of Visual Basic had no class modules, 
only simple modules. 
Code window 
To the right in the Visual Basic window, you see the 
code window with the Visual Basic program. Figure 
5.3A shows the code module for frmFindStay. You see 
three event procedures for the txtName control. You 
can scroll to other event procedures and controls, or 
you can select them by means of the two combo boxes 
at the top. 
Creating an event procedure. Initially, the event pro-
cedures are not in the code, but if you select one of 
them by means of the combo boxes, Visual Basic cre-
ates it. The same thing happens if you select an event 
procedure through the control's property window. 
However, Access doesn't always coordinate these two 
things. You may experience that you have created an 
event procedure in the code window, but it doesn't 
appear in the property box. As a result, Access never 
calls the event procedure. This may for instance happen 
80 
5. Access through Visual Basic 
Documents you may be interested
Documents you may be interested