- Start a new project with its default form
- Save it in a new folder named FastFood1
- Save the unit as Exercise and save the project as FastFood
- Open Image Editor. Design a 32 x 32 and 16 x 16 icon as follows:
- Save it as FastFood in the folder of the current project
- Create a new 16 x 16 size bitmap and design it as follows:
- Save it as Ingredients in the folder of the current project
- In the project options (Project -> Options), access the Application tab. Set the Title to Fast Food Corner and sect the icon to the above FastFood icon
- Change the form’s following properties:
BorderStyle: bsDialog
Caption: Fast Food Restaurant – Customer Menu
Name: frmMain
Position: poScreenCenter
- Design the dialog box as follows:
|
Control |
Name |
Caption |
Other Properties |
GroupBox |
|
Bread |
|
RadioButton |
rdoBun |
B&un |
Alignment: taLeftJustify |
RadioButton |
rdoRoll |
&Roll |
Alignment: taLeftJustify
Checked: true |
Group Box |
|
Meat |
|
Radio Button |
rdoBeefPatty |
Bee&f Patty |
Alignment: taLeftJustify
Checked: true |
Radio Button |
rdoGrilledChicken |
&Grilled Chicken |
Alignment: taLeftJustify |
Radio Button |
rdoChickedBreast |
C&hicken Breast |
Alignment: taLeftJustify |
GroupBox |
|
Ingredients |
|
|
- Save All
- On the Standard toolbar, click the New button . In the New Items dialog box, click Dialogs and double-click Standard Dialog (Vertical)
- Save it as Ingredients
- Change its Name to dlgIngredients
- Change its Caption to Ingredients Selection
- Design the dialog box as follows:
|
Control |
Name |
Caption |
Other Properties |
CheckBox |
chkLettuce |
&Lettuce |
Alignment: taLeftJustify
Checked: true |
CheckBox |
chkOnion |
&Onion |
Alignment: taLeftJustify |
CheckBox |
chkTomato |
&Tomato |
Alignment: taLeftJustify
Checked: true |
CheckBox |
chkPickles |
&Pickles |
Alignment: taLeftJustify |
|
- Display the main form (View -> Forms… -> frmMain -> OK)
- Complete its design as follows:
|
Control |
Name |
Caption |
Other Properties |
CheckBox |
chkRegulars |
&Regulars |
Alignment: taLeftJustify
AllowGrayed: true |
CheckBox |
chkSweetener |
&Sweetener |
Alignment: taLeftJustify
Checked: true |
CheckBox |
chkCheese |
Ch&eese |
Alignment: taLeftJustify |
CheckBox |
chkBacon |
B&acon |
Alignment: taLeftJustify |
GroupBox |
|
Options |
|
BitBtn |
btnIngredients |
&Ingredients |
Glyph: Ingredients |
RadioButton |
rdoMayonnaise |
&Mayonnaise |
Alignment: taLeftJustify
Checked: true |
RadioButton |
rdoKetchup |
&Ketchup |
Alignment: taLeftJustify |
RadioButton |
chkMustard |
Mus&tard |
Alignment: taLeftJustify |
Bevel |
|
|
Shape: bsFrame |
BitBtn |
|
|
Kind: bkClose |
Label |
|
Total Price: |
|
Edit |
edtTotalPrice |
$2.35 |
|
|
- On the main form, double-click the Ingredients button and implement its
OnClick() event as follows:
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Exercise.h"
#include "Ingredients.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TfrmMain *frmMain;
//---------------------------------------------------------------------------
__fastcall TfrmMain::TfrmMain(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TfrmMain::btnIngredientsClick(TObject *Sender)
{
dlgIngredients->ShowModal();
}
//---------------------------------------------------------------------------
|
- Test the application. Close it and return to Bcb
- Save All
- If the user completely removes the check mark on the Sweetener check box, this suggests that the customer does not want this item on the sandwich. Consequently, the radio buttons in the Options group should be disabled. When the user clicks a check box, whether the control was already checked or not, the OnClick() event fires. Therefore, in this case, the first thing you should do it to check the state of the check button and then implement a behavior accordingly.
Display the main form and double-click the Sweetener check control
- Implement its OnClick event as follows:
//---------------------------------------------------------------------------
void __fastcall TfrmMain::chkSweetenerClick(TObject *Sender)
{
// If the sweetener check box is not checked
if( chkSweetener->Checked == False )
{
// Disable the Options radio buttons
rdoMayonnaise->Enabled = False;
rdoKetchup->Enabled = False;
rdoMustard->Enabled = False;
}
else
{
// Otherwise, enable the Options radio buttons
rdoMayonnaise->Enabled = True;
rdoKetchup->Enabled = True;
rdoMustard->Enabled = True;
}
}
//---------------------------------------------------------------------------
|
- To keep track of the user’s selection of ingredients, we will use four global variables that each represents a check box from the Ingredients dialog.
In the header file of the main form, declare four private Boolean variables as follows:
private:
Boolean bLettuce, bOnion, bTomato, bPickles;
|
- In the constructor of the main form, initialize the variables with a false value each:
//---------------------------------------------------------------------------
__fastcall TfrmMain::TfrmMain(TComponent* Owner)
: TForm(Owner)
{
bLettuce = False;
bOnion = False;
bTomato = False;
bPickles = False;
}
//---------------------------------------------------------------------------
|
- When the user clicks the Regulars check box, we will update the global variables appropriately.
On the form, double-click the Regulars check box and implement its OnClick() event as follows:
//---------------------------------------------------------------------------
void __fastcall TfrmMain::chkRegularsClick(TObject *Sender)
{
// If the Regulars check box is completely unchecked
if( chkRegulars->State == cbUnchecked )
{
// Set the global Boolean variables to false each
bLettuce = False;
bOnion = False;
bTomato = False;
bPickles = False;
}
// If the Regulars check box is completely checked
else if( chkRegulars->State == cbChecked )
{
// Set the global Boolean variables to true each
bLettuce = True;
bOnion = True;
bTomato = True;
bPickles = True;
}
// Otherwise, refer to the state of the check boxes
// from the Ingredients dialog box. Whatever they are
else
{
bLettuce = dlgIngredients->chkLettuce->Checked;
bOnion = dlgIngredients->chkOnion->Checked;
bTomato = dlgIngredients->chkTomato->Checked;
bPickles = dlgIngredients->chkPickles->Checked;
}
}
//---------------------------------------------------------------------------
|
- When the Regulars check box is not checked at all, no basic ingredient is selected. When this control is checked, all ingredients will be added to the sandwich. If at least one ingredient is selected and at least one ingredient is not selected, the Regulars check box should appear grayed.
When the user clicks the Ingredients button, we will display the Ingredients Selection dialog box and allow the user to select the ingredients. If the user clicks OK to dismiss the dialog box, we will
apply the above scenario.
On the form, double-click the Ingredients button and change its OnClick event as
follows:
//---------------------------------------------------------------------------
void __fastcall TfrmMain::btnIngredientsClick(TObject *Sender)
{
// Before displaying the dialog box, synchronize its
// check boxes with the global variables
dlgIngredients->chkLettuce->Checked = bLettuce;
dlgIngredients->chkOnion->Checked = bOnion;
dlgIngredients->chkTomato->Checked = bTomato;
dlgIngredients->chkPickles->Checked = bPickles;
// Call the Ingregients Selection dialog box for the user
// If the user clicked OK when closing the dialog box,
dlgIngredients->ShowModal();
if( dlgIngredients->ModalResult == mrOk )
{
// If the user clicks OK, update the global values of the check boxes
bLettuce = dlgIngredients->chkLettuce->Checked;
bOnion = dlgIngredients->chkOnion->Checked;
bTomato = dlgIngredients->chkTomato->Checked;
bPickles = dlgIngredients->chkPickles->Checked;
// if no check box is checked
if( (bLettuce == False) &&
(bOnion == False) &&
(bTomato == False) &&
(bPickles == False) )
chkRegulars->State = cbUnchecked; // then uncheck this one
// if all check boxes are checked
else if( (bLettuce == True) &&
(bOnion == True) &&
(bTomato == True) &&
(bPickles == True) )
chkRegulars->State = cbChecked; // then check this one
else // if at least one check box is checked and at one is unchecked
chkRegulars->State = cbGrayed; // then set this one as indeterminate
}
// If the user clicked Cancel, don't do nothing
}
//---------------------------------------------------------------------------
|
- Now we can calculate the price of the sandwich.
In the header file of the main form, declare a private member function of type
void __fastcall named EvaluatePrice
- Implement the method as follows:
//---------------------------------------------------------------------------
void __fastcall TfrmMain::EvaluatePrice()
{
//TODO: Add your source code here
double PriceBread, PriceMeat,
PriceCheese, PriceBacon, TotalPrice;
// The price of bread is $0.85
PriceBread = 0.85;
// To get the price of the meat, find out what button
// is selected in the Meat group box
if( rdoBeefPatty->Checked == True )
// The beef patty is $1.50
PriceMeat = 1.50;
else if( rdoGrilledChicken->Checked == True ||
rdoChickenBreast->Checked == True )
// Cheicken breast and grilled chicken are $1.80 each
PriceMeat = 1.80;
else // Just in case
PriceMeat = 0.00;
// There is no extra cost for the Regular ingredients
// and nothing to add for the sweetener
// On the other hand,
// if the customer wants cheese, $0.30 is added to the price
if( chkCheese->Checked == True )
PriceCheese = 0.30;
else // otherwise, the customer don't want no cheese
PriceCheese = 0.00;
// If the customer wants bacon, $0.45 is added to the price
if( chkBacon->Checked == True )
PriceBacon = 0.45;
else
PriceBacon = 0.00;
// Now, we can calculte the total price
TotalPrice = PriceBread + PriceMeat + PriceCheese + PriceBacon;
edtTotalPrice->Text = FloatToStrF(TotalPrice, ffCurrency, 8, 2);
}
//---------------------------------------------------------------------------
|
- To update the price and its display live whenever the user makes a new selection, double-click the following controls: Beef Patty, Grilled Chicken, Chicken Breast, Cheese, and Bacon
- In the body of each, simply call the above EvaluatePrice() method:
//---------------------------------------------------------------------------
void __fastcall TfrmMain::rdoBeefPattyClick(TObject *Sender)
{
EvaluatePrice();
}
//---------------------------------------------------------------------------
void __fastcall TfrmMain::rdoGrilledChickenClick(TObject *Sender)
{
EvaluatePrice();
}
//---------------------------------------------------------------------------
void __fastcall TfrmMain::rdoChickedBreastClick(TObject *Sender)
{
EvaluatePrice();
}
//---------------------------------------------------------------------------
void __fastcall TfrmMain::chkCheeseClick(TObject *Sender)
{
EvaluatePrice();
}
//---------------------------------------------------------------------------
void __fastcall TfrmMain::chkBaconClick(TObject *Sender)
{
EvaluatePrice();
}
//---------------------------------------------------------------------------
|
- Test the application:
- Close it and return to Bcb
- Heighten the form and add the following controls to the top section
Control |
Name |
Caption/Text |
Other Properties |
Label |
|
Processed By: |
|
Edit |
edtClerk |
|
|
Label |
|
Order Date: |
|
MaskEdit |
edtOrderDate |
|
EditMask: !99/99/0000;1;_ |
- Save All
|
|