- •Глава 4. Компоненты 30
- •Глава 5. Основы программирования 37
- •Часть I. Delphi и работа в Интегрированной Среде
- •Глава 1. Объектно-ориентированное программирование
- •1.1. Основные понятия и определения
- •1.2. Визуальное программирование интерфейса
- •1.3. Общие вопросы построения программ
- •Глава 2. Проекты Delphi
- •2.1.Файлы проекта
- •2.2.Структура файла головной программы
- •2.3. Окно Интегрированной Среды Разработки Delphi
- •2.4. Панель главного меню и всплывающие меню
- •2.5. Форма и компоненты
- •2.5.1.Окно формы
- •2.5.2. Окно Редактора Кода
- •2.5.3. Инспектор Объектов
- •2.6. Структура модуля приложения
- •Глава 3. Элементы языка Delphi
- •3.1.Типы данных
- •3.1.1. Целый тип
- •3.1.2.Вещественный тип
- •3.1.3. Символьный тип
- •3.1.4. Строковый тип
- •3.1.5. Логический тип
- •3.2. Переменная
- •3.3. Константы
- •3.3.1.Числовые константы
- •3.3.2. Строковые и символьные константы
- •3.3.3. Логические и именованные константы
- •3.4. Инструкция присваивания
- •3.5. Стандартные функции
- •3.5.1.Математические функции
- •Глава 4. Компоненты
- •4.1. Форма и компоненты на форме
- •4.2. Событие и процедура обработки событий
- •Глава 5. Основы программирования
- •5.1. Сохранение проекта, его повторное открывание
- •5.2. Стиль программирования
- •5.3. Порядок разработки проекта
- •5.4. Управляющие структуры языка Delphi
- •5.4.1. Инструкция if
- •5.4.2. Инструкция case
- •5.5. Циклы
- •5.5.1. Инструкция for
- •5.5.2. Инструкция while
- •5.5.3. Инструкция repeat
- •5.5.4. Инструкция goto
- •5.6. Процедуры и функции
- •5.6.1. Структура функции
- •5.6.2. Структура процедуры
- •5.6.3. Ввод и вывод данных в диалоговых окнах
- •5.6.4. Запись инструкций программы
- •5.6.5. Отладка программы
- •5.7. Операции со строками
- •5.7.1. Стандартные функции и процедуры работы со строками
- •5.7.2. Использование операций со строками
- •5.8. Массивы
- •5.8.1. Объявление массива
- •5.8.2. Операции с массивами
- •5.8.3. Стандартные функции обработки массивов
- •5.8.4. Многомерные массивы
5.8.2. Операции с массивами
Типичными операциями при работе с массивами являются:
• ввод массива;
• вывод массива;
• поиск максимального или минимального элемента массива;
• поиск заданного элемента массива;
• сортировка массива.
Для ввода массива удобно использовать компонент StringGrid (рис. 5.22). Значок компонента StringGrid находится на вкладке Additional.
Рис. 5.22. Компонент StringGrid на форме
Компонент StringGrid представляет собой таблицу, ячейки которой содержат строки символов. В табл. 5.14. перечислены некоторые свойства компонента StringGrid.
Таблица 5.14
Свойства компонента StringGrid
Свойство |
Определяет |
Name |
Имя компонента. Используется в программе для доступа к свойствам компонента |
ColCount |
Количество колонок таблицы |
RowCount |
Количество строк таблицы |
Cells |
Соответствует двумерному массиву. Ячейка таблицы, находящаяся на пересечении столбца номер col и строки номер row. Определяется элементом cells[col,row] |
Продолжение табл. 5.14
FixedCols |
Количество зафиксированных слева колонок таблицы Зафиксированные колонки выделяются цветом и при горизонтальной прокрутке таблицы остаются на месте |
FixedRows |
Количество зафиксированных сверху строк таблицы. За- фиксированные строки выделяются цветом и при вертикальной прокрутке таблицы остаются на месте |
Options.goEditing |
Признак допустимости редактирования содержимого ячеек таблицы. True – редактирование разрешено False – запрещено |
Options.goTab |
Разрешает (True) или запрещает (False) использование клавиши <Таb> для перемещения курсора в следующую ячейку таблицы |
Defaultcolwidth |
Ширину колонок таблицы |
DefaultRowHeight |
Высоту строк таблицы |
GridLineWidth |
Ширину линий, ограничивающих ячейки таблицы |
Left |
Расстояние от левой границы поля таблицы до левой границы формы |
Тор |
Расстояние от верхней границы поля таблицы до верхней границы формы |
Height |
Высоту поля таблицы |
width |
Ширину поля таблицы |
Font |
Шрифт, используемый для отображения содержимого ячеек таблицы |
Parent Font |
Признак наследования характеристик шрифта формы |
Нумерация колонок и строк таблицы начинается с нуля.
В качестве примера использования компонента StringGrid для ввода массива рассмотрим программу, которая вычисляет среднее арифметическое значение элементов массива. Диалоговое окно программы приведено на рис. 5.23.
Компонент StringGrid используется для ввода массива, компоненты Label1 и Label2 – для вывода пояснительного текста и результата расчета, Button1 – для запуска процесса расчета.
Рис. 5.23. Диалоговое окно программы
Добавляется компонент StringGrid в форму точно так же, как и другие компоненты. После добавления компонента к форме нужно выполнить его настройку в соответствии с табл. 5.15. Значения свойств Height и Width следует при помощи мыши установить такими, чтобы размер компонента был равен размеру строки [3].
Таблица 5.15
Значения свойств компонента StringGrid1
Свойство |
Значение |
ColCount |
5 (количество колонок) |
FixedCols |
0 (количество зафиксированных слева колонок) |
RowCount |
1 (количество строк таблицы) |
DefaultRowHeight |
24 (высота строк таблицы) |
Height |
24 (высота поля таблицы) |
DefaultColWidth |
64 (ширина колонок таблицы) |
Width |
328 (ширина поля таблицы) |
Options.goEditing |
True (редактирование) |
Options.goTabs |
True (клавиша Tab) |
Процедура обработки события KeyPress допускает ввод в ячейку только цифры и по нажатию клавиши <Enter> курсор автоматически переходит в следующую ячейку таблицы. Вычисление суммы и среднего арифметического производится с помощью процедуры Button1Click.
procedure TForm1.Button1Click(Sender: TObject);
var
a: array[1..5] of integer;
summ, i: integer;
sr:real;
begin
for i:= 1 to 5 do
// длина содержимого ячейки на пересечении столбца (i-1) и //строки 0
if Length(StringGrid1.Cells[i-1,0])<> 0
then a[i]:= StrToInt(StringGrid1.Cells[i-1,0])
else a[i]:= 0;
summ:=0;
for I := 1 to 5 do
summ:=summ + a[i];
sr:= summ/5;
Label2.Caption:=
'Сумма элементов: ' + IntToStr(summ)+#13+
'Среднее арифметическое: ' +FloatToStr(sr);
end;
procedure TForm1.StrnigGrid1KeyPress(Sender: TObject; var Key: Char);
begin
case Key of
#8,'0'..'9':;
#13: //переход в следующую колонку по клавише #13, если
//номер колонки не превышает общее количество
if StringGrid1.Col < StringGrid1.ColCount - 1
then StringGrid1.Col:= StringGrid1.Col + 1;
else Key:= Chr(0);
end;
end;
Другой вариант процедуры TForm1.StrnigGrid1KeyPress в случае, если для компонента StrnigGrid1 в Инспекторе Объектов было установлено свойство
Options.goTabs:= true. Тогда процедура может быть записана так:
procedure TForm1.StrnigGrid1KeyPress(Sender: TObject; var Key: Char);
begin
case Key of
#8,'0'..'9':;
#13: Button1.SetFocus
else Key:= Chr(0);
end;
end;
Очень часто требуется инициализировать массив до выполнения приложения. Как указывалось ранее, в этом случае массив объявляется в разделе переменных модуля и одновременно можно выполнить его инициализацию. Для отражения начальных значений элементов массива в компоненте StringGrid используется процедура
FormCreate, которая «подключается» на вкладке events (события) для компонента Form. Фрагмент программы глобального объявления, инициализации и использования FormCreate:.
procedure StrnigGrid1KeyPress(Sender:TObject; var Key: Char);
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
a: array[1..5] of integer=(1,2,3,4,5);
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var
//a: array[1..5] of integer;
summ, i: integer;
sr:real;
begin
for i:= 1 to 5 do
if Length(StringGrid1.Cells[i-1,0])<> 0
then a[i]:= StrToInt(StringGrid1.Cells[i-1,0])
else a[i]:= 0;
summ:=0;
for I := 1 to 5 do
summ:=summ + a[i];
sr:= summ/5;
Label2.Caption:=
'Сумма элементов: ' + IntToStr(summ)+#13+
'Среднее арифметическое: ' +FloatToStr(sr);
end;
procedure TForm1.formcreate(Sender: TObject);
var
i: integer;
begin
for i := 1 to 5 do
StringGrid1.Cells[i-1,0]:=IntToStr(a[i]);
end;
procedure TForm1.StrnigGrid1KeyPress(Sender: TObject; var Key: Char);
begin
case Key of
#8,'0'..'9':;
#13: Button1.SetFocus
else Key:= Chr(0);
end;
end;
end.
Если нужно ввести массив дробных чисел (a: array [1. .5] of real), то процедура обработки события OnKeyPress несколько усложнится, т. к. кроме цифр допустимыми символами являются символ-разделитель (запятая и. точка – зависит от настройки Windows) и минус. Для использования допустимого символа-разделителя можно применить обращение к глобальной переменной DecimalSeparator.
Процедура обработки события OnKeyPress обеспечивает ввод в ячейку таблицы только допустимых при записи дробного числа символов. Ниже представлены тексты процедур с комментариями для решения задачи определения суммы и среднего арифметического массивов вещественных чисел.
procedure TForm1.Button1Click(Sender: TObject);
var
a: array[1..5] of real; // массив
summ: real; // сумма элементов
sr: real; // среднее арифметическое
i: integer; // индекс
begin
// ввод массива
// считаем, что если ячейка пустая, то соответствующий
// ей элемент массива равен нулю
for i:= 1 to 5 do
if Length(StringGrid1.Cells[i-1,0]) <> 0
then a[i] := StrToFloat(StringGrid1.Cells[i-1,0])
else a[i] := 0;
// обработка массива
summ := 0;
for i :=1 to 5 do
summ := summ + a[i];
sr := summ / 5;
// вывод результата
Label2.Caption :=
'Сумма элементов: ' + FloatToStr(summ) + #13+
'Среднее арифметическое: ' + FloatToStr(sr);
end;
// Функция обеспечивает ввод в ячейку только допустимых символов
procedure TForm1.StrnigGrid1KeyPress(Sender: TObject; var Key: Char);
begin
case Key of
#8,'0'..'9':; // Back Space и цифры
'.',',': // разделитель целой и дробной части числа
begin
if Key <> DecimalSeparator
then Key:= DecimalSeparator; //замена разделителя
//на допустимый
if Pos(DecimalSeparator,
StringGrid1.Cells[StringGrid1.Col,0])<>0
then Key:= Chr(0);
end;
'-': //минус можно ввести только первым символом
if Length(StringGrid1.Cells[StringGrid1.Col,0])<>0
then Key:= chr(0)
else //остальные символы запрещены
Key:= Chr(0);
#13: Button1.SetFocus;
end;
end;
end.