

Лабораторные работы по информатике для специальности «Моделирование и исследование операций в организационно-технических системах»
Лабораторная работа № 16
Стандартные компоненты. TCheckBox. TRadioGroup. TRadioButton. TPanel. TGroupBox.
Введение
В лабораторной работе рассмотрены некоторые стандартные компоненты с вкладки
Standart. Рассмотрены компоненты TCheckBox, TRadioButton, TPanel, TGroupBox, TRadioGroup. Приведены примеры программ использующие рассмотренные компоненты.
Компонент TCheckBox
Компонент TCheckBox находится на вкладке Standart палитры компонентов (рисунок 1).
Рисунок 1 – Расположение компонента TCheckBox в палитре компонентов
Компонент TCheckBox предназначен для того, чтобы пользователь мог указать свое решение типа да/нет или да/нет/не уверен (в последнем случае флажок устанавливается, выглядит блеклым, см. рисунок 2). Это решение отражается в свойстве State компонента, доступном как для чтения, так и для записи. В составе диалогового окна может быть несколько компонентов TCheckBох причем состояние любого из них никак не зависит от состояния остальных, поэтому такие переключатели называются независимыми.
Рисунок 2 – Различные состояния независимого переключателя
Наиболее важные свойства компонента TCheckBox представлены в таблице 1.
Таблица 1 – Свойства компонента TCheckBox
Свойство |
Описание |
|
|
type TLeftRight = (taLeftJustify, |
Определяет положение текста: taLeftJustify с |
taRightJustify); |
левой стороны компонента; taRightJustify с правой |
property Alignment: TLeftRight; |
стороны |
|
|
property AllowGrayed: Boolean; |
Разрешает/запрещает использование состояния |
|
cbGrayed (не уверен) |
property Caption: String; |
Содержит связанный с компонентом текст |
|
|

Лабораторные работы по информатике для специальности «Моделирование и исследование операций в организационно-технических системах»
Свойство |
Описание |
||
|
|
||
property Checked: Boolean; |
Содержит значение, соответствующее выбору |
||
|
пользователя. Состоянию cbChecked |
||
|
соответствует значение True. Состояния |
||
|
cbUnChecked и cbGrayed отражаются как False. |
||
type TCheckBoxState = (cbUnChecked, |
Содержит состояние компонента: |
||
cbChecked, cbGrayed); |
− |
cbUnchecked – нет; |
|
property State: TCheckBoxState; |
− |
cbChecked – да; |
|
− cbGrayed – не уверен |
|||
|
|||
|
|
|
Как и для компонента TButton, свойство Color компонента фактически игнорируется, а свойства Height и Width определяют размеры прямоугольника, в котором выводится связанный с флажком текст, и никак не влияют на размеры самого флажка. Текст указывается в свойстве Caption.
Во время прогона программы при щелчке на компоненте он циклически изменяет свое состояние.
Для этого компонента обычно используется только обработчик события OnClick. В этом обработчике анализируется текущее состояние переключателя и выполняются некоторые действия. Типичное тело обработчика OnClick для компонента TCheckBox имеет следующий вид:
procedure TForm1.CheckBox1Click(Sender: TObject);
begin
if CheckBoxl.Checked then ...
else ...
end;
или для трехпозиционного переключателя (свойство AllowGrayed=true)
procedure TForm1.CheckBox1Click(Sender: TObject); begin
case CheckBoxl.State of cbChecked : ...; cbUnСhecked: ...; cbGrayed : ...;
end;
end;
В качестве примера рассмотрим программу расчета стоимости покупки с учетом скидки на сумму покупки. Будем считать что покупатель может получить две скидки, а именно скидку 10% если идет распродажа и скидку 30% как постоянный покупатель. Одна скидка не зависит от другой и дается на всю сумму.
Создайте новую форму и поместите на нее два компонента TEdit, два TCheckBox, два TButton и один компонент TLabel. Расположите компоненты как показано на рисунке 3.
Установите значения свойств компонентов как указано в таблице 2.

Лабораторные работы по информатике для специальности «Моделирование и исследование операций в организационно-технических системах»
Рисунок 3 – Вид главной формы программы «Сумма покупки» Таблица 2 – Свойства компонентов
Свойство |
Caption |
AutoSize |
WordWrap |
|
|
|
|
edtCount |
– |
– |
– |
edtPrice |
– |
– |
– |
btnCalc |
Вычислить |
– |
– |
btnExit |
Выход |
– |
– |
chbPermament |
Постоянный покупатель |
– |
– |
chbAction |
Распродажа |
– |
– |
frmTovar |
Сумма покупки |
– |
– |
lbResult |
– |
False |
True |
|
|
|
|
Создайте обработчик события OnClick для кнопки btnCalc (листинг 1). В этом обработчике осуществляется расчет суммы покупки с учетом скидок и вывод результатов расчета в компонент lbResult.
Листинг 1 – Процедура обработки события OnClick компонента btnCalc
procedure TfrmTovar.btnCalcClick(Sender: TObject); var Price, //цена единицы товара
Count, //количество товара
Summa, //cумма Discount:real; //размер скидки
begin
Discount:=1.0;//нет скидок
{получение данных из строк ввода} Price:=StrToFloat(edtPrice.Text); Count:=StrToFloat(edtCount.Text);
//вычисление скидки //скидка как постоянному покупателю 30%
if chbPermanent.Checked then Discount:=Discount*0.7; //скидка при распродаже 10%

Лабораторные работы по информатике для специальности «Моделирование и исследование операций в организационно-технических системах»
if chbAction.Checked then Discount:=Discount*0.9;
//вычисление суммы покупки
Summa:=Price*Count*Discount;
//вывод результата lbResult.Caption:='Сумма покупки '+
FloatToStrF(Summa, ffFixed, 6, 2) + ' руб.';
//передать фокус ввода следующему компоненту btnExit.SetFocus;
end;
Последняя строка btnExit.SetFocus в обработчике события необходима для передачи фокуса ввода следующему компоненту, кнопке «Выход».
Обратите внимание, что обход компонентов с помощью клавиши <Tab> может происходить в неправильном порядке. Для изменения порядка обхода компонентов вызовите из контекстного меню диалоговое окно «Edit Tab Order» (рисунок 4).
Рисунок 4 – Вызов диалогового окна "Edit Tab Order"
В диалоговом окне «Edit Tab Order» с помощью кнопок и
установите требуемый порядок обхода компонентов (рисунок 5).
Рисунок 5 – Диалоговое окно "Edit Tab Order"

Лабораторные работы по информатике для специальности «Моделирование и исследование операций в организационно-технических системах»
Установите порядок обхода компонентов с помощью клавиши <Tab> как показано на рисунке 5, если это необходимо.
Кроме указанной процедуры обработки события нажатия на клавишу «Вычислить» необходимо также создать обработчики событий для фильтрации ввода чисел в компоненты TEdit, а также не которые другие. Полный листинг программы приведен ниже.
Листинг 2
unit UTovar;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
type
TfrmTovar = class(TForm) edtCount: TEdit; edtPrice: TEdit; btnCalc: TButton; chbPermanent: TCheckBox; chbAction: TCheckBox; btnExit: TButton; lbResult: TLabel;
procedure btnCalcClick(Sender: TObject);
procedure edtCountKeyPress(Sender: TObject; var Key: Char); procedure btnExitClick(Sender: TObject);
procedure chbPermanentKeyPress(Sender: TObject;
var Key: Char); procedure chbActionKeyPress(Sender: TObject; var Key: Char); procedure FormCreate(Sender: TObject);
private
{Private declarations } public
{Public declarations } end;
var
frmTovar: TfrmTovar;
implementation
{$R *.dfm}
//нажатие кнопки "Вычислить"
procedure TfrmTovar.btnCalcClick(Sender: TObject); var Price, //цена единицы товара
Count, //количество товара
Summa, //cумма Discount:real; //размер скидки
begin
Discount:=1.0;//нет скидок
{получение данных из строк ввода} Price:=StrToFloat(edtPrice.Text); Count:=StrToFloat(edtCount.Text);

Лабораторные работы по информатике для специальности «Моделирование и исследование операций в организационно-технических системах»
//вычисление скидки //скидка как постоянному покупателю 30%
if chbPermanent.Checked then Discount:=Discount*0.7; //скидка при распродаже 10%
if chbAction.Checked then Discount:=Discount*0.9;
//вычисление суммы покупки
Summa:=Price*Count*Discount;
//вывод результата lbResult.Caption:='Сумма покупки '
+ FloatToStrF(Summa, ffFixed, 6, 2)+ ' руб.';
//передать фокус ввода следующему компоненту btnExit.SetFocus;
end;
procedure TfrmTovar.edtCountKeyPress(Sender: TObject; var Key: Char);
begin
case Key of '0'..'9',#8:;
'.', ',': if pos(DecimalSeparator, (Sender as TEdit).Text)<>0 then Key:=#0
else Key:=DecimalSeparator; #13://передать фокус ввода следующему компоненту begin
if Sender=edtCount then edtPrice.SetFocus;
if Sender=edtPrice then chbPermanent.SetFocus; end;
else Key:=#0;
end;{case} end;
//нажатие кнопки "Выход"
procedure TfrmTovar.btnExitClick(Sender: TObject); begin
Close;
end;
//нажатие "Enter" для переключателя "Постоянный покупатель" procedure TfrmTovar.chbPermanentKeyPress(Sender: TObject; var Key: Char);
begin
//если нажата клавиша Enter, то передаем фокус ввода следующему компоненту
if Key=#13 then chbAction.SetFocus; end;
//нажатие "Enter" для переключателя "Распродажа"
procedure TfrmTovar.chbActionKeyPress(Sender: TObject; var Key: Char);
begin
//если нажата клавиша Enter, то передаем фокус ввода следующему компоненту
if Key=#13 then btnCalc.SetFocus; end;