- •Введение
- •1Алгоритм. Разработка алгоритмов. Блок-схемы
- •3Операторы языка Delphi
- •3.1Оператор присваивания
- •3.2Оператор ввода-вывода
- •3.3Составные операторы
- •3.4Условный оператор
- •3.7Цикл с параметром (счетчик)
- •3.8Массивы
- •3.5Цикл с предусловием
- •3.6 Цикл с постусловием
- •3.9Строки
- •3.10Записи
- •3.11Множества
- •4Отладчик программы Debugger
- •5Среда Delphi
- •6Создание интерфейса приложения
- •7Подпрограммы
- •7.1Процедуры
- •7.2Функции
- •7.3Параметры и аргументы
- •8Особенности объектно-ориентированного программирования
- •9Работа с кнопкой
- •10Работа с текстом
- •10.1Работа с надписью
- •10.2Функции преобразования числа в строку и строки в число
- •10.3Работа в однострочном редакторе (Edit, LabeledEdit)
- •10.4Работа с многострочным редактором Memo
- •11Диалоги, сообщения
- •11.1Процедура ShowMessage
- •11.2Процедура MessageDlg
- •11.3Процедура InputBox
- •11.4Процедура InputQuery
- •11.5Стандартные диалоги
- •12Работа с компонентом StringGrid
- •13Построение графика функции
- •14Файлы
- •15Работа со списками и переключателями
- •15.1 Компонент ChekBox
- •15.2Компонент RadioButton
- •16Исключительные ситуации
- •17Работа с несколькими модулями
- •18Работа с формой
- •Содержание
- •Список использованных источников
15Работа со списками и переключателями
Переключатели позволяют выбрать необходимое значение из определенного множества. Они могут находиться во включенном или выключенном состоянии. По текущему состоянию переключателя программа может выполнять соответствующие действия.
Delphi предлагает следующие компоненты для работы с переключателями: ChekBox, RadioButton и RadioGroup. Переключатели можно разделить на зависимые (RadioButton) и независимые переключатели (ChekBox).
15.1 Компонент ChekBox
Переключатель ChekBox представляет собой прямоугольник с надписью, в который можно поставить галочку (переключатель установлен) или снять ее. Если используется множество таких переключателей, то обычно состояние одного переключателя никак не сказывается на состоянии остальных, поэтому такие переключатели относят к группе независимых.
Для анализа состояния переключателя используется свойство Checked типа Boolean. По умолчанию оно имеет свойство False (переключатель не установлен). Во время выполнения приложения пользователь может поменять состояние переключателя щелчком мыши. Если переключатель был сброшен, то после щелчка мыши он установится и, наоборот:
CheckBox1.Checked:=true; // установка включенного состояния
// переключателя
……………………………
if CheckBox1.Checked then ………. //анализ состояния
//переключателя (делать что-то, если переключатель установлен)
Кроме двух состояний (включен/ выключен) переключатель может находиться в отмененном состоянии. В этом состоянии цвет галочки в прямоугольнике - серый. Если программист желает иметь у своего переключателя данное состояние, то необходимо свойству AllowGrayed типа Boolean установить в значение True.
Для анализа и установки состояния переключателя используется свойство State типа TCheckBoxState, которое может принимать следующие значения:
cbUnchecked – переключатель сброшен
cbChecked – переключатель установлен
cbGrayed – переключатель запрещен
На рисунке 32 представлена форма с тремя возможными состояниями переключателя.
Рисунок 32 - Состояние переключателя CheckBox
При выборе пользователем текущего переключателя возникает событие onClick.
15.2Компонент RadioButton
Переключатели с зависимой фиксацией – компонент RadioButton, также называется кнопкой выбора. Данный компонент представляет собой надпись с кругом слева, в который можно поставить точку. Обычно кнопки выбора располагаются по отдельным группам. Выбор переключателя является взаимоисключающим, т.е. при выборе одного переключателя все остальные сбрасываются (становятся невыбранными). Для формирования групп переключателей используются такие компоненты как форма Form, панель Panel, группа GroupBox и специализированный контейнер RadioGroup.
Для того, чтобы объединить переключатели в группу, достаточно положить их на соответствующий компонент. При использовании компонента RadioGroup этого делать не нужно, чтобы добавить или удалить элемент, необходимо использовать свойство Items типа TStrings в Инспекторе объектов или программно. Данное свойство содержит строки, которые отображаются как названия переключателя. Обращение в программе к конкретному элементу доступно через свойство ItemIndex типа Integer, нумерация которого начинается с нуля. Рекомендуется установить начальные значения для данного компонента, например, выбрав нужный переключатель в методе формы onShow, иначе ни один из переключателей не будет выбран до того, как пользователь не установит его, а свойство ItemIndex будет равно -1.
Для управления количеством столбцов используется свойство Columns, имеющее по умолчанию значение 1.
Пример 16. Рассчитать значения функции на интервале [а,b] с шагом h. В зависимости от выбора пользователя, результаты расчета поместить в таблицу, нарисовать график или записать в файл. (продолжение примера 15)
Преобразуйте форму, разработанную для примера 15 в форму, представленную на рисунке 33 (под компонентом Chart находится компонент StringGrid).
Рисунок 33 - Внешний вид приложения
В начале работы приложения на форме не должно быть видно окно результатов расчета (ни график, ни таблица) и выбрана первая позиция в компоненте RadioGroup, поэтому добавим метод формы OnShow следующим кодом:
procedure TForm1.FormShow(Sender: TObject);
begin
// начало такое же, как и в примере 15
Form1.StringGrid1.Visible:=false;
Form1.Chart1.Visible:=false;
Form1.RadioGroup1.ItemIndex:=0;
end;
Программа расчета с учетом всех обновлений выглядит так:
procedure Clear; // процедура очистки
var
i:integer;
begin
for i:=1 to Form1.StringGrid1.RowCount-1 do
begin
Form1.StringGrid1.Cells[0,i]:='';
Form1.StringGrid1.Cells[1,i]:='';
end;
Form1.Chart1.SeriesList.Series[0].Clear;
end;
procedure TForm1.BitBtn1Click(Sender: TObject);
var
a,b,y:real;
i:integer;
Raschet:TextFile;
begin
a:=StrToFloat(Form1.LabeledEdit1.Text);
b:=StrToFloat(Form1.LabeledEdit2.Text);
if a>=b then
begin
Mr:=MessageDlg('Данные введены неверно.
Ввести заново?', mtConfirmation,
[mbYes, mbNo,mbCancel],0);
if Mr=mrYes then
Form1.FormShow(Sender);
exit;
end;
h:=StrToFloat(InputBox('Ввод шага
расчета','Введите шаг','1'));
Form1.StringGrid1.Cells[0,0]:=' x ';
Form1.StringGrid1.Cells[1,0]:=' y ';
i:=1;
Clear;
case Form1.RadioGroup1.ItemIndex of
0:begin
Form1.StringGrid1.Visible:=true;
Form1.Chart1.Visible:=false;
end;
1:begin
Form1.StringGrid1.Visible:=false;
Form1.Chart1.Visible:=true;
end;
2:begin
Form1.StringGrid1.Visible:=false;
Form1.Chart1.Visible:=false;
if Form1.SaveDialog1.Execute then
begin
AssignFile(Raschet,
Form1.SaveDialog1.FileName);
Rewrite(Raschet);
end;
end;
end;
while a<=b do
begin
y:=a*a;
case Form1.RadioGroup1.ItemIndex of
0:
begin
if i>Form1.StringGrid1.RowCount
then Form1.StringGrid1.RowCount:=
Form1.StringGrid1.RowCount+1;
Form1.StringGrid1.Cells[0,i]:=
FloatToStr(a);
Form1.StringGrid1.Cells[1,i]:=
FloatToStr(y);
end;
1: Form1.Chart1.SeriesList.Series[0].
AddXY(a,y,'',clRed);
2: WriteLn(Raschet,FloatToStr(a)+
' '+FloatToStr(y));
end;
a:=a+h;
inc(i);
end;
if Form1.RadioGroup1.ItemIndex=2
then CloseFile(Raschet);
end;
