Hour 11

Additional Controls

Now that you've added several programming statements to your Visual Basic language repertoire, you can learn about additional controls to add new features to your applications and to take advantage of some of the more powerful commands you now know. As you learn about new controls, your programming ability grows by leaps and bounds because your programs become richer in functionality and user interaction.

You'll learn about the selection controls, how to program scrollbars, and how to set the Timer control to let your application know when a predetermined amount of time has passed.

The highlights of this hour include

Option Buttons

Figure 11.1 shows an application with four option buttons. An option button gives your user a choice. By clicking the option button or by sending the focus to the option button and pressing the Spacebar to choose the option, the user selects or deselects an option button. The option button has a black center inside its option button circle when selected.

Figure 11.1. A form with four option buttons.

Option buttons act in a mutually exclusive fashion. Only one option button can be selected at any one time. Therefore, in Figure 11.1, the user could not select two or more of the options. If the user were to click Texas, the California option would no longer be selected. You don't have to do anything special to ensure that only one option button is selected at any one time; Visual Basic takes care of removing the former option's selection when the user selects a subsequent option button.


NOTE: Option buttons are sometimes called radio buttons. Many car radios used to have five or six buttons that selected preset stations. The listener could only select one station; as soon as the listener pushed a button, the previous station's button popped out.

The option button supports several of the properties you're already familiar with, such as the Appearance and Alignment properties. The Alignment property determines whether the option button text resides to the left or right of the option button. Figure 11.2 shows the option buttons with their Alignment property set to 2-Right Justify. The alignment you set depends on where the option buttons are to fall in relation to other controls.

Figure 11.2. These option buttons have a right-justified Alignment property.


TIP: An option button control array makes setting option button properties, such as the Alignment property, simple. Several option buttons almost always appear together and the control array lets you set only one's property and the others will receive the same property settings. If you do not create an option button control array, you can change all the option button properties at once, even without a control array, by first selecting all the option button controls and then setting the properties for all of them at once.

The Value property is perhaps the most important option button property because the Value property changes at runtime and determines whether the option button is currently selected. By the way, the user can select only one option button at a time, but the application may start up without any option buttons being set if you don't set any in the Properties window or in code.

Frames and Option Buttons

Figure 11.3 shows an application called Controls that comes in the VB Samples folder. (Load the Controls.VBP project and run the application to select the Option Buttons command button and display Figure 11.3's window.) This option button application lets you select a computer type and operating system. Figure 11.3 seems to violate the option button's primary rule: More than one option button is selected at the same time (the Pentium option button and the Windows 95 option).

Sometimes a form will need several sets of option buttons, just like the form in Figure 11.3. In each set the user should be allowed to select only one option button, but one option button should be set from each set at the same time. Therefore, you must revise the previous rule, which states that only one option button can be set at one time. The truth is that only one option button inside a frame can be set at one time.

Figure 11.3. Two option buttons are set.

New Term: A frame is a rectangular region on a form that holds other controls and groups the controls into a single set.

A frame is a control that holds other controls. The frame is a rectangular outline with an optional title. When you want to place multiple sets of option buttons on a form, first place the frame or frames onto the form. (You can place any control on a frame, but the frame especially helps group option buttons so you can offer multiple option button sets.)


NOTE: The form acts as a default frame. Therefore, two sets of option buttons reside on Figure 11.3's form: One set resides in a frame and the other set resides on the form itself so you consider them framed as well, even though no specific frame control surrounds them.

The frame control does support properties that determine the frame's look and caption and a frame does support a few events, but most programmers use the frame as a holding place to group other controls. Once you place controls in a frame, you can move the frame and all the frame's controls move with it. Therefore, adjusting framed controls is relatively easy to do.


WARNING: Always place a frame on the form before putting controls in the frame. If you simply move controls from elsewhere on the form to the frame, the controls will not be in the frame but will exist simply on top of the frame. Visual Basic will not consider them framed together. To add additional controls to a frame with controls, click one of the framed controls before adding the new control.

Figure 11.4 shows an application that contains three frames that determine how text appears inside a label. The user can select only one option button inside each frame. As soon as the user changes one of the options, the option button's Click() event responds to the change and sets the Label property accordingly. Listing 11.1 contains the complete form module code that takes care of the user's action. The label is initialized in the Form_Load() event procedure (the procedure that executes right before the user sees the form) and the remaining event procedures are the responses to various user clicks on the form's controls. The controls are named well enough so that you will know where the controls appear in Figure 11.4.

Figure 11.4. A form with three frames.

Listing 11.1. The framed option button code.



Private Sub Form_Load()

  ` Initialize the label's text

  Dim strLabel1 As String

  Dim strLabel2 As String

  Dim strLabel3 As String

  Dim strLabel4 As String

  

  strLabel1 = "Use frames if you want "

  strLabel2 = "to group options together. "

  strLabel3 = "Each frame forms one set "

  strLabel4 = "of option buttons."

  

  lblFrames.Caption = strLabel1 & strLabel2 & _

                      strLabel3 & strLabel4

  

  ` Set the label's properties

  lblFrames.FontItalic = True

  optItalicTrue.Value = True

  

  lblFrames.FontUnderline = True

  optUnderTrue.Value = True

  

  lblFrames.ForeColor = vbBlue

  optBlue.Value = True

End Sub



Private Sub optItalicTrue_Click()

  lblFrames.FontUnderline = True

End Sub



Private Sub optItalicFalse_Click()

  lblFrames.FontUnderline = False

End Sub



Private Sub optRed_Click()

  lblFrames.ForeColor = vbRed

End Sub



Private Sub optBlue_Click()

  lblFrames.ForeColor = vbBlue

End Sub



Private Sub optGreen_Click()

  lblFrames.ForeColor = vbGreen

End Sub



Private Sub optUnderTrue_Click()

  lblFrames.FontItalic = True

End Sub



Private Sub optUnderFalse_Click()

  lblFrames.FontItalic = False

End Sub



Private Sub cmdExit_Click()

   Unload Me

   End

End Sub

Color Named Literals

Listing 11.1 demonstrates the use of named literals. The background colors assigned to the label are named literals that come with Visual Basic. Table 11.1 lists the named literal colors that you can use and assign to any property that uses color values such as the background and foreground colors of several controls. Given that Windows supports millions of possible colors, the eight colors that Table 11.1 lists represent a small number of colors you can possibly set. (Named literals do not exist for other color values.) Visual Basic supplies several ways to specify colors so that you can set a color from among the millions possible. For most situations, however, and for simplicity, Table 11.1's named literals work for most applications.

Table 11.1. The color named literals.
Literal Color
vbBlack Black
vbRed Red
vbGreen Green
vbYellow Yellow
vbBlue Blue
vbMagenta Magenta
vbCyan Cyan
vbWhite White

Check Boxes

Figure 11.5 shows a form with check boxes. The Check Box control works just like the option button, with two differences: A selected check box shows the selection with a checkmark, and check boxes are never mutually exclusive. Therefore, the user can select one or more check boxes even if those check boxes reside in the same frame or on the same form.

Figure 11.5. A form with two check boxes.


NOTE: Figure 11.5's application is from the Controls.VBP project included in VB's Samples folder.

The Check Box control supports the same fundamental properties as the option button except that the Value property determines not only if the box is checked (if 1) or unchecked (if 0), but a check box can also be grayed (if the Value property contains 2). Users sometimes use a grayed check box to determine whether part of a selected option is true. In addition, the programmer may gray out a box to show that the selection is unavailable under the current conditions.

Visual Basic version 5 added a new Style value to the Check Box control's property list. The available Style property values are 0-Standard and 1-Graphical. The graphical style value makes the check box look a lot like a command button that stays pressed (when selected) or unpressed (when not selected).

Figure 11.6 shows a form that illustrates the various check box property options available to you.

Figure 11.6. Some Check Box control property options.

Scrollbars

Scrollbars let users control value changes. Rather than type specific values, the user can move the scrollbars with the mouse to specify relative positions within a range of values. The toolbox includes both a Horizontal Scrollbar and a Vertical Scrollbar control.

Table 11.2 contains a list of important scrollbar properties that determine the behavior of the scrollbar.

Table 11.2. Fundamental scrollbar properties.
Property Description
LargeChange Specifies the amount that the scrollbar changes when the user clicks within the scrollbar's shaft area.
Max Indicates the maximum number of units that the scrollbar value represents at its highest setting. The range is from 1 to 32767 (the default Max value).
Min Indicates the minimum number of units the scrollbar value represents at its lowest setting. The range is from 1 (the default Min value) to 32767.
SmallChange Specifies the amount that the scrollbar changes when the user clicks an arrow at either end of the scrollbar.
Value Contains the unit of measurement currently represented by the position of the scrollbar.

When you place a scrollbar on a form, you must decide at that time what range of values the scrollbar is to represent. The scrollbar's full range can extend from 1 to 32767. Set the Min property to the lowest value you want represented by the scrollbar. Set the Max property to the highest value you want represented by the scrollbar.

When the user eventually uses the scrollbar, the scrollbar arrows control small movements in the scrollbar's value determined by the SmallChange property. Clicking the empty part of the shaft on either side of the scrollbox produces a positive or negative change in the value represented by the LargeChange property. The user can drag the scrollbox itself to any position within the scrollbar shaft to jump to a specific location instead of changing the value gradually.

Suppose, for example, that a horizontal scrollbar represented a range of whole dollar amounts from $5 to $100. When the user clicks the scroll arrows, the scrollbar's value changes by $1. When the user clicks the empty shaft on either side of the scrollbox, the scrollbar's value changes by $5. Here are the property values that you would set that determine how VB interprets each click of the scrollbar: Min: 5, Max: 100, SmallChange: 1, and LargeChange: 5.

The physical size of the scrollbar has no bearing on the scrollbar's returned values when the user selects from the scrollbar. Adjust the scrollbars on your form so that the scrollbars are wide enough or tall enough to be appropriately sized for the items that they represent.

New Term: A thumb is the scrollbar's moving scrollbox (the elevator-like box).

Figure 11.7 shows an application that uses a vertical scrollbar to change the size of a label's font size. As the user clicks the top scrollbar arrow, the font size shrinks by the SmallChange value. As the user clicks the bottom scrollbar arrow, the font size increases by the SmallChange value. (The application's SmallChange property value is 1.) If the user clicks in the scrollbar's shaft on either side of the scrollbar's thumb, the LargeChange property value of 5 is either added to or subtracted from the font size.

Figure 11.7. The vertical scrollbar determines the label's font size.

Listing 11.2 shows the code behind Figure 11.7. The code is not lengthy because the scrollbar's Click() event procedure must change only the label's text font size and the label that displays the current font size. Any time the user changes the scrollbar, the scrollbar's Click() event procedure executes.

Listing 11.2. The code behind the scrollbar application.



Private Sub vsbHeight_Change()

  lblScroll.FontSize = vsbHeight.Value

  lblFontHeight.Caption = vsbHeight.Value

End Sub

VBs Clock: The Timer Control

The Timer control acts unlike any other control you've seen so far. The Timer control always works in the background and the user never sees the timer on the form. You will see the Timer control during design time because you need to be able to select the control and change its properties. Nevertheless, the timer's purpose is to work in the background, triggering an event every once in a while according to the clock ticks.

Your computer has an internal clock to keep things running smoothly. The hardware requires an accurate clock for memory refreshes and CPU cycle coordination efforts. Software, such as Visual Basic, can tap into the internal clock and utilize its timing to control certain time-based events that your application may need to perform.

Figure 11.8 shows the Timer control as it appears when you place the control on a form. The Timer control supports only seven properties because the Timer control never appears on the form at runtime. Therefore, the control has no need for many of the style and size properties used for other controls the user sees.

Figure 11.8. The Timer control appears on the form only at design time.

You can place the timer out of the way of your form's other controls since its physical location is trivial. Once you place the timer on the form, you should set its Interval property because Interval is the most important timer property. The Interval property contains a value that must range from 1 to 65535. The value is in milliseconds (or thousandths of a second), so an Interval value of 500 would equate to half a second. The Timer control generates only one event: the Timer event. The Timer control triggers a Timer event after each interval of time goes by. Therefore, if you named a Timer control tmrClock, and if you set the control's Interval property to 1000, Visual Basic would execute the tmrClock_Timer() event procedure approximately every second.

New Term: A millisecond is one-thousandth of a second.


WARNING: The Timer control is not a perfect timer, just a good timer. Other processes occurring inside your computer can cause the Timer control to be off by a few milliseconds. The smaller the Interval value, the more likely the Timer event will be off. Fortunately, the Timer control works without much of a timing hitch, especially given today's faster computers.

Figure 11.9 shows the Alarm sample application that comes with Visual Basic in the Samples\PGuide folder. The Timer's Interval property value is set to 500 and the time of day updates every half-second (the time is shown in full seconds; the half-second update helps correct timing problems that might occur every few half-seconds). Therefore, if you run the Alarm application, a Timer event will occur every one-half second.

Figure 11.9. The Timer control generates an event every few milliseconds.

Clicking on the Alarm application's small Form window produces an input box that asks you for an alarm time. The Timer() click procedure from then on compares the current time with the time that the user enters and, if the alarm time has been reached, the alarm goes off. The alarm displays Figure 11.10's dialog box, which informs the user that the alarm time is reached.

Figure 11.10. The Timer() event procedure determined that the alarm time was reached.


WARNING: Feel free to study the sample Alarm application's code, but be warned that the application uses a few built-in functions that you will not master until Hour 14, "Built-in Functions Save Time."

If you need an interval that's larger than the 65535 Interval value allows (this maximum Interval value provides only about a 10-second interval), insert some If logic at the top of the Timer() event procedure that checks to see if the required amount of time has passed since the last interval. (To do this, you will need some of the time functions described in Hour 14.)

Summary

In this hour you have learned about several new controls so you can begin adding more user interactivity to your applications. The option buttons and check boxes work almost exactly alike except that the option buttons are mutually exclusive and provide your users with single options from a selection. The scrollbars let your users select values based on a range using either a horizontal or vertical scrollbar. Finally, the Timer control keeps track of time passing during your application's execution and triggers a Timer event every time the Interval value of time has passed.

Hour 12, "Dialog Box Basics," builds further on your I/O skills by demonstrating how to create common dialog boxes. Your users will be able to use the dialog boxes to enter and select multiple values.

Q&A

Q Can I program check boxes to be mutually exclusive or do I have to use option buttons?

A
Check boxes are not mutually exclusive by design. Option buttons are. Therefore, a Visual Basic application's user can only select one option button at a time within any one frame or on the form. If you want to change the behavior of check boxes and make them act like option buttons, be warned that you are giving your users mixed signals. Your users are used to being able to select as many check boxes as they wish and your application can keep them from doing the usual, which, in many cases, makes the user dislike your application. Users feel comfortable when an application follows de facto standards. Nevertheless, you can make the check boxes act like option buttons, but you will have to put code in the check boxes' Click() event procedures to remove the check from the current check box when the user clicks another check box. The code is fairly trivial, but again, your users will adapt more easily to your application if you use option buttons in mutually exclusive cases.

Q How can I trust the Timer control if it is not accurate?

A
The Timer control is accurate, but your computer cannot always let Windows respond to events exactly when needed. A multitasking operating system such as Windows does a lot of things at once. If a Timer() event occurs, the operating system cannot always, at that exact millisecond, go back to the running application and signal that the event occurred. Therefore, your applications sometimes take a back seat to system operations. Today's fast computers have much less of a time-accuracy problem than in the past, so you should not worry too much about the potential millisecond miss now and then.

Workshop

The quiz questions and exercises are provided for your further understanding. See Appendix C, "Answers," for answers.

Quiz

1. True or false: Option button captions always appear to the right of the buttons.

2.
What happens if the user clicks an option button that is not currently selected?

3.
Why would you gray out a Check Box control?

4.
What happens if the user clicks a check box that is not currently selected?

5.
True or false: An application can begin with none of its option buttons or check boxes selected.

6.
What kind of control can you place on a frame?

7.
What is the difference between a scrollbar's Small Change property and a scrollbar's Large Change property?

8.
Which property changes when the user clicks one of the scrollbar's arrows?

9.
True or false: The Timer control works like an alarm clock ready to go off at a preset time of day.

10.
True or false: If you need a timer interval greater than approximately 10 seconds, you must use multiple Timer controls.

Exercises

1. Create an application that mimics the frame application used with Listing 11.1. Instead of using separate option buttons, use an option button array for each frame's option button, making a total of three option button arrays. Change Listing 11.1 to reduce the number of event procedures in the application. Use a Select Case statement based on the event procedure Index argument to set the appropriate label property.

2.
Change the application you wrote in exercise 1 so that no frames appear on the form. Remove the Underline and Italic option buttons (keep the Framed Color option buttons) and add these check box controls in their place: Underline and Italic. Change the code so that the text will appear underlined if the user clicks the Underline check box and so that the text will be italicized if the user clicks the Italic check box. Both or only one might be checked at any one time.

3.
Duplicate this lesson's scrollbar application that lets the user set the label's text size with the scrollbar. Completely remove the scrollbar, however, and add a Timer property. Every second, add 5 to the label's font size. When the font size grows to 70 or more points, send the size back down to 8 and start increasing the size once again.