Beginning REALbasic - From Novice To Professional (2006)
.pdf156 |
C H A P T E R 5 ■ S T O R I N G A N D R E T R I E V I N G A P P L I C A T I O N D A T A |
Next, add 19 button controls to the window, as shown in Table 5-4, and modify the Name property for each control.
Table 5-4. Property Modifications RBCalculator PushButton Controls
Object |
Property |
Value |
PushButton1 |
Name |
Button1 |
|
Caption |
1 |
PushButton2 |
Name |
Button2 |
|
Caption |
2 |
PushButton3 |
Name |
Button3 |
|
Caption |
3 |
PushButton4 |
Name |
Button4 |
|
Caption |
4 |
PushButton5 |
Name |
Button5 |
|
Caption |
5 |
PushButton6 |
Name |
Button6 |
|
Caption |
6 |
PushButton7 |
Name |
Button7 |
|
Caption |
7 |
PushButton8 |
Name |
Button8 |
|
Caption |
8 |
PushButton9 |
Name |
Button9 |
|
Caption |
9 |
PushButton10 |
Name |
Button0 |
|
Caption |
0 |
PushButton11 |
Name |
DecimalButton |
|
Caption |
. |
PushButton12 |
Name |
NegativeButton |
|
Caption |
- |
PushButton13 |
Name |
PlusButton |
|
Caption |
+ |
PushButton14 |
Name |
MinusButton |
|
Caption |
- |
PushButton15 |
Name |
MulitiplicationButton |
|
Caption |
* |
C H A P T E R 5 ■ S T O R I N G A N D R E T R I E V I N G A P P L I C A T I O N D A T A |
157 |
Object |
Property |
Value |
PushButton16 |
Name |
DivisionButton |
|
Caption |
/ |
PushButton17 |
Name |
EqualsButton |
|
Caption |
= |
PushButton18 |
Name |
OffButton |
|
Caption |
Off |
PushButton19 |
Name |
ClearButton |
|
Caption |
Clear |
|
|
|
The next step in creating the RBCalculator application is to design its menu system. Doubleclick the menu bar item located on the Projects screen to open the MenuBar Editor. Delete the Edit menu. Then, modify the menu system for Menubar1 by adding a Help menu, and then add an About menu item beneath it. Assign &Help and &About as the value of the Text properties for each respective control.
At this point, the user interface for the RBCalculator application is finished. Now, you are ready to begin writing the code statements required to make the application work.
Supplying Application Code
Let’s start adding the code statements associated with the Help menu’s About menu item. To do so, open the application’s window in the REALbasic Code Editor and switch over to code view. Click the Add Menu Event Handler button located on the Window Editor toolbar. A menu handler entry is added to the left-hand browser area in the Code Editor. Select the entry for the HelpAbout menu item from the drop-down list for the MenuItem Name field and enter the following program statement.
MsgBox("RBCalculator - Written By Jerry Ford - 2006")
This statement uses the MsgBox function to display information about the application’s author in a preformatted pop-up dialog window. Now that the application’s menu system is ready to go, it’s time to provide the code associated with each of the application’s PushButton controls.
For starters, add the following code statement to the method belonging to each of the PushButton controls that represents a numeric calculator button, as well as to the button representing a toggle value (for example, the PushButtons labeled 0–9 and -).
OutputField.Text = OutputField.Text + Me.Caption
This statement, when executed, adds the number of the appropriate PushButton control to the EditField control. For example, if the user clicks the PushButton control representing the number 5, this statement takes the value of that PushButton control’s Caption (for example 5), which it gets from Me.Caption, and appends it to whatever text is currently displayed in the EditField control.
158 |
C H A P T E R 5 ■ S T O R I N G A N D R E T R I E V I N G A P P L I C A T I O N D A T A |
Next, add the following statements to the method belonging to the DecimalButton control.
Dim intResult As Integer
If intResult = Instr(OutputField.Text, ".") Then
OutputField.Text = OutputField.Text + Me.Caption
End If
The first statement defines a local variable named intResult. The If…Then block that follows uses the Instr function to determine whether a decimal has already been entered before appending a decimal character to whatever text is stored in the EditField control. In other words, because a number can only have a maximum of 1 decimal, the If…Then statement prevents the user from accidentally entering a second decimal when keying in a number.
Likewise, add the following code to the PushButton controls representing plus, minus, multiplication, and division buttons.
OutputField.Text = OutputField.Text + " " + Me.Caption + " "
PlusButton.Enabled = False
MinusButton.Enabled = False
DivisionButton.Enabled = False
MultiplicationButton.Enabled = False
The first statement adds a plus (+) character to the string displayed in the EditField control. Note, this statement also adds a blank space before and after the plus character. The next four statements disabled the buttons representing the plus, minus, division, and multiplication buttons. Remember, the RBCalculator only supports one calculation at a time, which is enforced by disabling these buttons as soon as the user clicks one of them. These buttons are reenabled later when the user clicks the Clear button to allow a new equation to be entered. Another limitation of the RBCalculator is that is only lets you work with one decimal number as a time.
Next, add the following code statements to the PushButton control representing the equals button.
Dim dblResult As Double
If InStr(OutputField.Text, "+") > 0 Then
dblResult = Val(OutputField.Text.Left(Instr(OutputField.Text, _ " + "))) + Val(OutputField.Text.Mid(Instr(OutputField.Text, _ "+") + 2))
End If
C H A P T E R 5 ■ S T O R I N G A N D R E T R I E V I N G A P P L I C A T I O N D A T A |
159 |
If InStr(OutputField.Text, " - ") > 0 Then
dblResult = Val(OutputField.Text.Left(Instr(OutputField.Text, _
"- "))) – Val(OutputField.Text.Mid(Instr(OutputField.Text, _
"- ") + 2))
End If
If InStr(OutputField.Text, " * ") > 0 Then
dblResult = Val(OutputField.Text.Left(Instr(OutputField.Text, _
"* "))) * Val(OutputField.Text.Mid(Instr(OutputField.Text, _
"* ") + 2))
End If
If InStr(OutputField.Text, " / ") > 0 Then
dblResult = Val(OutputField.Text.Left(Instr(OutputField.Text, _
"/ "))) / Val(OutputField.Text.Mid(Instr(OutputField.Text, _
"/ ") + 2))
End If
OutputField.Text = Str(dblResult)
Button1.Enabled = False
Button2.Enabled = False
Button3.Enabled = False
Button4.Enabled = False
Button5.Enabled = False
Button6.Enabled = False
Button7.Enabled = False
Button8.Enabled = False
Button9.Enabled = False
Button0.Enabled = False
DecimalButton.Enabled = False
NegativeButton.Enabled = False
The first statement declares a variable named intResult with a data type of Double to ensure the calculator can handle nearly any number the user might enter. The next four sets of statements are If…Then blocks, each of which is designed to handle a particular operation.
The first If…Then block is set up to look for the presence of a + character in the equation entered by the user. If present, then the following statement is executed.
dblResult = Val(OutputField.Text.Left(Instr(OutputField.Text, " + "))) + Val(OutputField.Text.Mid(Instr(OutputField.Text, "+") + 2))
160 |
C H A P T E R 5 ■ S T O R I N G A N D R E T R I E V I N G A P P L I C A T I O N D A T A |
This statement uses a series of REALbasic functions to process the equation the user enters. Here is a step-by-step breakdown of what happens when this statement executes.
1.The Instr function is used to locate the position of the + character in the equation.
2.This information is then fed to the Left function, which uses it to extract all the characters from the beginning of the text string to the + character.
3.The Val function is used to convert the remaining value to a number.
4.The Instr function is again used to locate the position of the + character in the equation.
5.The Mid function is then used to extract the remainder of the text in the EditField, starting two character positions to the right of the + character.
6.The Val function is then used to convert the remaining value to a number.
7.Finally, the numeric value extracted from step 3 is added to the numeric value extracted in step 6 and assigned to the intResult variable.
■Note Refer to REALbasic’s online reference (Help Language Reference) for detailed explanations of the syntax for various REALbasic functions.
The remaining If…Then blocks are designed to perform a similar set of steps for the subtraction, multiplication, and division operations. The first statement following the last If…Then block converts the value of intResult to a String and displays the results in the EditField control (named OutputField). The remaining statements disable all the PushButton controls on the application, except for the PushButtons representing the Equals, Off, and Clear operations.
Now, add the following statement to the PushButton control representing the Off button.
Quit
As you can see, this statement simply terminates the application when this PushButton control is clicked. Finally, add the following statements to the PushButton control representing the Clear button.
OutputField.Text = ""
PlusButton.Enabled = True
MinusButton.Enabled = True
DivisionButton.Enabled = True
MultiplicationButton.Enabled = True
C H A P T E R 5 ■ S T O R I N G A N D R E T R I E V I N G A P P L I C A T I O N D A T A |
161 |
Button1.Enabled = True
Button2.Enabled = True
Button3.Enabled = True
Button4.Enabled = True
Button5.Enabled = True
Button6.Enabled = True
Button7.Enabled = True
Button8.Enabled = True
Button9.Enabled = True
Button0.Enabled = True
DecimalButton.Enabled = True
NegativeButton.Enabled = True
These statements reenable the application’s PushButton controls to let the user enter a new equation.
Testing RBCalculator
If you have not done so yet, go ahead and save your application, and then compile it and see how it operates. Double-check your typing if any errors are flagged. Once everything is working properly, compile a standalone copy of your application, pass it on to your friends, and ask them to test it as well.
Summary
In this chapter, you learned the fundamentals of storing and retrieving data in REALbasic applications. This included learning how to work with variables, arrays, dictionaries, and constants. You were introduced to the concept of variable scope. You learned how to document your applications by adding comments and notes. On top of all this, you learned about different data types and how to convert data from one data type to another.
C H A P T E R 6
■ ■ ■
Making Decisions with
Conditional Logic
To create truly useful applications, you need to provide your programs with the capability to analyze data, and then make logical decisions based on the results of that analysis. This is
achieved through the execution of conditional statements that work with mathematical, comparison and logical operators to define conditional tests and the courses of action to take, based on the results of the test. By applying conditional programming techniques demonstrated in this chapter, you can develop REALbasic applications that react dynamically to different data and provide users with an interactive experience.
Specifically, you learn how to
•Test between two or more conditions
•Alter the logical flow of your program code
•Generate random numbers
•Apply operating system-specific conditional logic
Implementing Conditional Logic
By default, REALbasic executes code statements in a sequential order. For example, if you specified a set of ten code statements to be executed when the user clicks a PushButton control, REALbasic executes each statement, one at a time, in the order the statements were written. This type of execution works just fine much of the time.
In some situations, though, you might want to conditionally execute a block of statements. For example, suppose you wrote an application that continually writes text to a log file. Before writing to the log file, you would want to add logic to your program to make sure the log file exists. If the log file does not exist, then you would want to tell REALbasic to create the file first. In this scenario, the code statement that checks for and creates a new log file only runs when the application determines that a log file does not already exist. Otherwise, these statements are skipped. Adding this type of conditional check to your application can help prevent errors by ensuring the application always has a log file to write to.
Conditional logic within a computer program is only a matter of determining whether a condition evaluates to either True or False and specifying what actions to take based on the results of the test. REALbasic provides you with three sets of programming statements that you
163
164 |
C H A P T E R 6 ■ M A K I N G D E C I S I O N S W I T H C O N D I T I O N A L L O G I C |
can use to implement conditional logic, each of which is designed to handle different situations. These statements include the following:
•If…Then. Tests a specific condition and conditionally executions code statements based on the results of the test.
•Select…Case. Tests different conditions against a specific value, and then executes code statements for the first matching condition.
•#If…#EndIf. Conditionally executes code statements based on the operating system (OS) on which the application is executing.
Working with the If…Then Statement
The If…Then statement provides you with the capability to test a single condition, and then evaluate the results to conditionally execute code statements based on the results of the test. The If…Then statement is so important, it is almost impossible to develop an application of any complexity without it.
The following outlines the syntax of the If…Then statement.
If Condition Then statements
ElseIf condition Then statements
Else statements
End If
Condition is a placeholder that represents a condition that evaluates to either True of False. Statements are placeholders representing executed code statements based on the results of the tests. The If…Then statement is extremely flexible and supports numerous variations, including the following:
•Single line If…Then statements
•Multiple line If…Then blocks
•The If…Then…Else Blocks
•The If…Then…ElseIf blocks
■Note If…Then, Select…Case, and #If…#EndIf statements, and any programming statement you embed within them, are sometimes referred to as code blocks.
C H A P T E R 6 ■ M A K I N G D E C I S I O N S W I T H C O N D I T I O N A L L O G I C |
165 |
Single Line If…Then Statements
In many cases, all you need to set up a conditional test is a single line If…Then statement. For example, each of the following statements is a single line If…Then statement.
If strUserName = "Molly" Then MsgBox("Hello Molly") If strUserName = "Molly" MsgBox("Hello Molly")
If strUserName = "Molly" Then MsgBox("Hello Molly") Else MsgBox("Hello")
In the first example, the value of strUserName is tested to see if it is equal to “Molly” and if it is (for example, if the test result evaluates to True), the MsgBox function that follows the Then keyword is executed. However, if the result of the text is False, the MsgBox function is not processed. The second statement shown in the previous code is almost identical to the first statement, except the Then keyword is omitted. The Then keyword is optional on single line If…Then statements.
The third example shown in the previous code demonstrates how to provide an alternate course of action in case the test result is False. In this example, if strUserName equals “Molly”, then MsgBox(“Hello Molly”) is executed and the rest of the statement is skipped. However, if strUserName does not equal “Molly”, then the first instance of the MsgBox function is skipped and the second instance is executed (for example, MsgBox(“Hello”).
■Note When using the single line form of the If…Then statement, the closing End If statement, which normally follows an If…Then statement, is omitted.
Multiple Line If...Then Blocks
In most cases, you won’t be able to fit everything on one line that you want to achieve with an If…Then statement. In these cases, you can set up an If...Then code block, as the following shows.
If blnExitApp = True Then
MsgBox("You have elected to close the application.")
Quit
End If
As this example shows, you can embed more than one statement inside an If…Then block. In this example, if the value assigned to the blnExitApp variables is equal to True, then all of the statements in between the opening If…Then statement and the closing End If statement are executed. However, if the value assigned to blnExitApp is equal to False, then the code statements inside the If…Then block are skipped and program execution continues with the next programming statement following the If…Then block.
■Tip Good programming practice is to use code blocks in place of single line If…Then statements. This way, if you have to come back later and insert additional code statements, the necessary structure will already be in place.