Смекни!
smekni.com

Учебно-методическое пособие для студентов физико-математических специальностей вузов Балашов (стр. 7 из 18)

Если в предыдущем примере использовать компоненты ComboBox
с теми же значениями свойства Items, то окно приложения после запуска будет иметь вид, представленный на рисунке 17.

Рисунок 17

Процедура обработки будет:

procedure TForm1.Button1Click(Sender: TObject);

Const g=9.81;

Var h,t : Real;

Begin

h:=StrToFloat(edit1.Text);

if ComboBox1.Text='метры' then t:=sqrt(2*h/g);

{Высота задается в метрах}

if ComboBox1.Text='сантиметры' then t:=sqrt(2*h/100/g);

{Высота задается в сантиметрах}

if ComboBox1.Text='дюймы' then t:=sqrt(2*h*2.54/100/g);

{Высота задается в дюймах}

edit2.Text:=FloatToStr(t);

end;

Выбор между компонентами RadioGroup и ComboBox во многом зависит от вкусов программистов, поскольку они выполняют одинаковую роль, а имеют различные внешний вид и применение. Необходимо отметить, что в языке Delphi есть большое количество компонентов, имеющих одинаковую область применения, однако отличающихся некоторыми частными внешними особенностями и доступными для применения методами.

Рассмотрим пример.

Пример 2 (психологический тест)

Пусть имеется заданный набор из n, заранее фиксированного числа вопросов. На каждый из вопросов может быть выбран один из трех ответов: «да», «нет», «не знаю». После ответов на все вопросы должен выдаваться результат. Предположим, что необходимо выдавать только количество первых, вторых и третьих ответов, хотя в реальных тестах, как правило, происходит подсчет баллов, на основании некоторого принципа.

Для решения данной задачи поместим на форму компонент Edit, в котором будет выдаваться очередной вопрос, а следовательно, свойству ReadOnly придадим значение True. Компонент RadioGroup служит для задания вариантов ответов, которые в данном случае будут «да», «нет», «не знаю», при этом начальное значение свойства ItemIndex должно быть равно единицы. Компонент Label1 будет необходим для выдачи результатов тестирования.

В модуле опишем константу n для задания количества вопросов и целочисленные переменные i, i1, i2, i3, в первой из которых будет содержаться номер вопроса, а в остальных — количество ответов каждого
варианта. Необходимо отметить, что это только общий вид решения задачи, поскольку можно задать более совершенный способ генерации вопросов и более интересный способ подсчета баллов.

В данной задаче нельзя воспользоваться событием OnClick для самого компонента RadioGroup, поскольку не всегда на следующий вопрос будет выбираться другой ответ. Следовательно, на форму необходимо поместить два компонента Button. При нажатии на первую кнопку происходит начало тестирования, т. е. обнуляются соответствующие переменные,
и выводится первый вопрос. При нажатии на вторую кнопку происходит анализ выбранного ответа и выдача следующего вопроса. Форма может иметь вид, представленный на рисунке 18.

Рисунок 18

В модуле опишем дополнительную функцию, которая на основании целочисленного значения формировала соответствующий вопрос. Для создания реального теста эту функцию необходимо доработать в соответствии со способом задания вопросов, например, вопросы можно читать из файла.

Тогда программа может иметь вид:

Const n=5;

Var i,i1,i2,i3:Integer;

function Query(i:integer):String ;

begin

Query:='Вопрос'+IntToStr(i);{Функция формирования очередного вопроса}

end;

procedure TForm1.FormCreate(Sender: TObject);

begin

i:=1;

Edit1.Text:=Query(1)

end;

procedure TForm1.Button1Click(Sender: TObject);

begin

i:=1; i1:=0; i2:=0; i3:=0;

Edit1.Text:=Query(1);

Label1.Caption:='';

end;

procedure TForm1.Button2Click(Sender: TObject);

begin

i:=i+1;

Case RadioGroup1.ItemIndex of

0:i1:=i1+1;

1:i2:=i2+1;

2:i3:=i3+1;

end;

if i<=n then

Edit1.Text:=Query(i)

else

begin

Label1.Caption:=' " Да" '+IntToStr(i1)+

' "Нет" '+IntToStr(i2)+ ' "Не знаю" '+IntToStr(i3);

Label1.Visible:=True;

end;

end;

Переключатель с независимой фиксацией (выключатель) предназначен для задания одного из двух (трех) состояний. Во включенном состоянии
в этот прямоугольник помещается символ «галочка», а в выключенном — прямоугольник пуст. В нейтральном состоянии, если оно доступно, «галочка» имеет серый цвет.

К ним можно отнести компоненты CheckBox со страницы Standat, CheckListBox со страницы Additional и компонент ListBox, который может выполнять функции переключателя. Основное свойство AllowGrayed определяет, может ли опция находиться в двух или трех состояниях (включена, выключена и включена частично). В случае, если опция может находиться в двух различных состояниях, логическое свойство Checked определяет, выбрана или нет данная опция. Если имеются три различных варианта, необходимо применять свойство State, значение которого может быть cbUnChecked — опция выключена, cbChecked — опция включена, cbGrayed — опция включена, однако изображается серым цветом.

Пример 3

Необходимо на основании курса подсчитать, сколько лет еще необходимо учиться.

Для решения данной задачи поместим на экран компонент CheckBox, свойству AllowGrayed придадим значение True. В этом случае данный компонент может имееть три состояния, что соответствует трем возможным вариантам ответа: включена — имеется высшее образование, выключена — нет высшего образования, частично включена — неполное высшее. Поместим на форме компонент RadioGroup, в котором посредством свойства Item зададим возможные варианты курсов: первый, второй
и т. д. Свойству Visible придадим значение False, чтобы при начальном исполнении программы данного компонента на экране не было. В компоненте Label будем выдавать ответ.

Проанализируем два различных события: нажатие на компоненты CheckBox1 и RadioGroup1. При первом событии происходит анализ его состояния, если он включен частично, то на экран выводится группа переключателей, во всех других случаях данную группу убираем с экрана,
и в зависимости от того, включена или выключена данная опция, выдается соответствующее сообщение. При частично включенной опции происходит анализ нажатия клавиши на группе переключателей, и в зависимости от выбранной альтернативы выдается подсчитанное количество лет.

Вся программа может иметь следующий вид:

procedure TForm1.CheckBox1Click(Sender: TObject);

begin

If CheckBox1.State=cbGrayed

Then

begin

RadioGroup1.Visible:=True;

RadioGroup1.ItemIndex:=-1;

Label1.Caption:=’’

end

Else

begin

RadioGroup1.Visible:=False;

If CheckBox1.State=cbChecked

Then Label1.Caption:=’Есть высшее образование’

Else Label1.Caption:=’Нет высшего образования’

end;

end;

procedure TForm1.RadioGroup1Click(Sender: TObject);

begin

Label1.Caption:=’Еще учиться’+IntToStr(5-RadioGroup1.ItemIndex)

end;

Рассмотрим компоненты, которые могут задавать несколько опций,
т. е. компоненты ListBox и CheckListBox, с дополнительной закладки компонентов Addition. Начальное значение опций в обоих компонентах задается свойством Items инспектора объектов. При выполнении программы для проверки выбранных опций компонент CheckListBox может использоваться логическое свойство Checked[Index], которое выдает значение True, если опция выбрана. Для компонента CheckListBox смысл свойств AllowGrayed и State остается тем самым.

Пример 4

Выбрать все отмеченные опции из компонента CheckListBox в Memo. Данную задачу можно интерпретировать как составление счета, при условии, что список опций — это меню.

Поместим на экран компонент CheckListBox, в нем с помощью пункта Item зададим начальные опции (пункты, которые могут быть выбраны).
В компоненте Memo будем создавать список нажатием кнопки Button. Тогда процедура будет иметь вид:

procedure TForm1.Button1Click(Sender: TObject);

Var i:Integer;

begin

Memo1.Lines.Clear;

for i:=0 to CheckListBox1.Items.Count-1 do

begin

If CheckListBox1.Checked[i]

then

Memo1.Lines.Add(CheckListBox1.Items.Strings[i]);

end;

end;

Компонент ListBox предназначен для отображения на экране списка строк и в отличие от компонента CheckListBox, позволяющего включать или выключать опции, помогает выбирать некоторые строки из списка. На этапе проектирования, кроме свойства Item, рассмотрим два логических свойства MultiSelect и EnternetSelect. Если первое свойство имеет значение True, то можно выделять несколько строк, в противном случае выделяется только одна строка. Второе свойство определяет способ выделения строк. Если оно имеет значение True, то выбор нескольких рядом стоящих строк осуществляется с помощью клавиши Shift, а не рядом стоящих строк посредством клавиши Ctrl. Для проверки выбранных строк на этапе выполнения может использоваться целочисленное свойство ItemIndex, задающий номер единственной выбранной строки и логическое свойство Selected[Index], принимающее значение True, если соответствующая строка выбрана.

Задания:

1. Проверьте все примеры из лабораторной работы.

2. Доработайте пример 3 таким образом, чтобы имелась возможность вернуться на один вопрос назад.

3. Задана компонента ComboBox, в свойстве Items записаны различные цвета. Сделайте, чтобы при выборе определенного цвета, изменялся цвет формы. Данную задачу выполните и с RadioGroup.

Лабораторная работа 5. Компоненты-таблицы

Цель: изучить возможности обработки табличной информации, используя компоненты StringGrid и DrawGrid.

Для обработки табличных данных предусмотрены компоненты StringGrid, представляющий собой таблицу строк, и DrawGrid, являющийся таблицей более общего назначения, в ячейках которого может храниться произвольная информация произвольной природы, например, текст, числа, рисунок и т. д. Оба компонента находятся на странице Additional.