- •Часть 1. Среда Delphi Тема 1. Объектно-ориентированное программирование
- •Тема 2. Элементы интерфейса
- •Окно проектировщика формы
- •Окно инспектора объектов
- •С оздание и сохранение проекта и файла модуля Как открыть новый проект?
- •Как открыть существующий проект?
- •Тема 3. Характеристика проекта. Состав проекта
- •Файлы формы
- •Файлы модулей
- •Файл ресурсов
- •Параметры проекта
- •Тема 4. Компиляция и выполнение проекта
- •Тема 5. Основные объекты
- •Основные свойства объектов
- •Основные события
- •Часть 2. Язык Object Pascal
- •Тема 1. Основные понятия
- •Словарь языка
- •Структура программы
- •Комментарии
- •Тема 2. Данные Виды данных
- •Типы данных
- •Простые типы данных
- •Структурные типы данных
- •Тема 3. Выражения
- •Арифметические выражения
- •Логические выражения
- •Строковые выражения
- •Тема 4. Простые операторы Оператор присваивания
- •Оператор перехода
- •Тема 5. Работа с графикой
- •Оператор доступа
- •Рисование многоугольников в Delphi
- •Закрашивание произвольной области в Delphi
- •Работа с несколькими формами
- •Объект Shape (Фигура)
- •Тема 6. Работа с датой и временем Объект Timer
- •Свойства компонента Timer
- •Манипулирование датами и временем
- •Тема 7. Встроенные окна диалога.
- •Окно ввода данных
- •InputВох(заголовок, подсказка, значение)
- •Окно вывода сообщений
- •Тема 8. Структурированные операторы
- •Составной оператор
- •Условный оператор
- •Оператор выбора
- •Операторы цикла
- •Тема 9. Подпрограммы
- •Процедуры
- •Функции
- •Параметры и аргументы
- •Тема 10. Работа с элементами выбора
- •1. Флажок (CheckBox)
- •2. ПереключательRadioButton
- •Свойства компонента RadioButton
- •Свойства компонента tRadioGroup
- •3. Простой список ListBox
- •Свойства компонента ListBox
- •4. Комбинированный список ComboBox
- •Свойства компонента СотbоВох
- •Значения для свойства Style
- •Тема 11. Работа с меню
- •Основные свойства пункта меню:
- •Главное меню
- •Конструктор меню
- •Динамическая настройка меню
- •Тема 12. Массивы
- •Объявление массива
- •Операции с массивами
- •Вывод массива
- •Ввод массива
- •Использование компонента StringGrid
- •Использование компонента Memo
- •Поиск минимального (максимального) элемента массива
- •Сортировка массива
Операции с массивами
Типичными операциями при работе с массивами являются:
вывод массива;
ввод массива;
поиск максимального или минимального элемента массива;
поиск заданного элемента массива;
сортировка массива.
Вывод массива
Под выводом массива понимается вывод на экран монитора (в диалоговое окно) значений элементов массива.
Если в программе необходимо вывести значения всех элементов массива, то для этого удобно использовать инструкцию for, при этом переменная-счетчик инструкции for может быть использована в качестве индекса элемента массива.
В качестве примера на рис. 5.1 приведено диалоговое окно приложения, которое демонстрирует инициализацию и процесс вывода значений элементов массива в поле метки. Программа выводит пронумерованный список футбольных команд. Следует обратить внимание, что для того чтобы список команд выглядел действительно как список, свойству Label1.AutoSize нужно присвоить значение False.
Пример 1. Инициализация и вывод массива
unit outar_;
interface
uses
Windows, Messages, Systltils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Label1.: TLabel;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
const
NT = 5;
var
team: array[l..NT] of string[10] =('Зенит','Динамо','Ротор','Спартак','СКА');
procedure TForm1.Button1Click(Sender: TObject);
var
st:string; // список команд
i:integer; // индекс, номер элемента массива
begin
// формирование списка для отображения в форме
for i:=l to NT do st := st + IntToStr(i)+ ' '+ team[i] + #13;
// вывод списка
Label1.Caption:= st;
end;
end.
Ввод массива
Под вводом массива понимается процесс получения от пользователя (или из файла) во время работы программы значений элементов массива.
Ввод массива можно организовать с использованием компонентов StringGrid и Memo.
Использование компонента StringGrid
Д ля ввода массива удобно использовать компонент StringGrid. Значок компонента StringGrid находится на вкладке Additional
Компонент StringGrid представляет собой таблицу, ячейки которой содержат строки символов.
Таблица. Свойства компонента StringGrid
Свойство |
Описание |
Name |
Имя компонента. Используется в программе для доступа к компоненту и его свойствам |
ColCount |
Количество колонок таблицы |
RowCount |
Количество строк таблицы |
DefaultColWidth |
Ширина колонок таблицы |
DefaultRowHeight |
Высота строк таблицы |
FixedCols |
Количество зафиксированных слева колонок таблицы. Зафиксированные колонки выделяются цветом и при горизонтальной прокрутке таблицы остаются на месте |
FixedRows |
Количество зафиксированных сверху строк таблицы. Зафиксированные строки выделяются цветом и при вертикальной прокрутке таблицы остаются на месте |
Cells |
Соответствующий таблице двумерный массив. Ячейке таблицы, находящейся на пересечении столбца с номером col и строки с номером row, соответствует элемент cells[col,row] |
GridLineWidth |
Ширина линий, ограничивающих ячейки таблицы |
Left |
Расстояние от левой границы поля таблицы до левой границы формы |
Top |
Расстояние от верхней границы поля таблицы до верхней границы формы |
Height |
Высота поля таблицы |
Width |
Ширина поля таблицы |
Options.goEditing |
Признак допустимости редактирования содержимого ячеек таблицы. True – редактирование разрешено, False – запрещено |
Options.goTab |
Разрешает (True) или запрещает (False) использование клавиши <Таb> для перемещения курсора в следующую ячейку таблицы |
Options. goAlwaysShowEditor |
Признак нахождения компонента в режиме редактирования. Если значение свойства False, то для того, чтобы в ячейке появился курсор, надо начать набирать текст, нажать клавишу <F2> или сделать щелчок мышью |
Font |
Шрифт, используемый для отображения содержимого ячеек таблицы |
ParentFont |
Признак наследования характеристик шрифта формы |
В качестве примера использования компонента stringGrid для ввода массива рассмотрим программу, которая вычисляет среднее арифметическое значение элементов массива. Диалоговое окно программы приведено на рис. 5.3. Компонент stringGrid используется для ввода массива, компоненты Label1 и Label2 – для вывода пояснительного текста и результата расчета, Button1 – для запуска процесса расчета.
Добавляется компонент stringGrid в форму точно так же, как и другие компоненты. После добавления компонента к форме нужно выполнить его настройку в соответствии с таблицей свойств компонента. Значения свойств Height и width следует при помощи мыши установить такими, чтобы размер компонента был равен размеру строки.
Таблица 5.2. Значения свойств компонента stringGridl
Свойство |
Значение |
ColCount |
5 |
FixedCols |
0 |
RowCount |
1 |
DefaultRowHeight |
24 |
Height |
24 |
DefaultColWidth |
64 |
Width |
328 |
Options.goEditing |
True |
Options.AlwaysShowEditing |
True |
Options.goTabs |
True |
Пример 2. Ввод и обработка массива целых чисел
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, Grids, StdCtrls;
type
TForm1 = class(TForm)
Label1: TLabel;
StringGridl: TStringGrid;
Button1: TButton;
Label2: TLabel;
procedure Button1Click(Sender: TObject);
private
/ Private declarations }
public
/ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var
a : array[1..5] of integer; // массив summ: integer;// сумма элементов
sr: real;// среднее арифметическое
i: integer;// индекс
begin
// ввод массива, считаем, что если ячейка пустая, то соответствующий ей элемент массива равен 0
for i: = 1 to 5 do
if Length(StringGridl.Cells[i-1,0]) <> 0 then a[i] := StrToInt(StringGridl.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;
end.
Чтобы курсор автоматически переходил в следующую ячейку таблицы, например, в результате нажатия клавиши <Enter> можно использовать процедуру обработки события OnKeyPress. На эту же процедуру можно возложить задачу фильтрации вводимых в ячейку таблицы данных. В нашем случае надо разрешить ввод в ячейку только цифр.
Текст процедуры обработки события OnKeyPress приведен в примере 3. Следует обратить внимание на свойство col, которое во время работы программы содержит номер колонки таблицы, в которой находится курсор. Это свойство можно также использовать для перемещения курсора в нужную ячейку таблицы. Однако нужно учитывать, что колонки таблицы, впрочем, как и строки, нумеруются с нуля.
Пример 3. Процедура обработки события OnKeyPress
procedure TForm1.StringGridlKeyPress(Sender: TObject; var Key: Char);
begin
case Key of
#8, '0'..'9' : ; // цифры и клавиша <Backspace>
#13: // клавиша <Enter>
if StringGridl.Col < StringGridl.ColCount – 1
then StringGridl.Col := StringGridl.Col + 1;
else key := Chr(0); //остальные символы запрещены
end;
end;
Если нужно ввести массив дробных чисел (a: array[l..5] of real), то процедура обработки события OnKeyPress несколько усложнится, т. к. помимо цифр допустимыми символами являются символ-разделитель (запятая или точка – зависит от настройки Windows) и минус. С целью обеспечения некоторой дружественности программы по отношению к пользователю можно применить трюк: подменить вводимый пользователем неверный разделитель верным. Определить, какой символ-разделитель допустим в текущей настройке Windows, можно, обратившись к глобальной переменной DecimalSeparator.
Ниже приведен текст модуля приложения ввода и обработки массива дробных чисел. Процедура обработки события OnKeyPress обеспечивает ввод в ячейку таблицы только допустимых при записи дробного числа символов.
Пример 4. Ввод и обработка массива дробных чисел
unit getar_l;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics,
Controls, Forms, Dialogs, Grids, StdCtrls;
type
TForm1 = class(TForm)
Label1: TLabel;
StringGridl: TStringGrid;
Button1: TButton;
Label2: TLabel;
procedure Button1Click(Sender: TObject);
procedure StringGridlKeyPress(Sender: TObject; var Key: Char);
private
{ Private declarations }
public
{ Public declarations }
end;
var Form1: TForm1;
implementation
{$R *.dfm}
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(StringGridl.Cells[i-1, 0]) <> 0
then a[i] := StrToFloat(StringGridl.Cells[i-1, 0] ) else a[i] := 0;
// обработка массива
summ : = 0 ;
for i :=i to 5 do summ := summ + a[i]; sr := summ / 5;
// вывод результата
Label2.Caption:='Сумма элементов: '+FloatToStr(summ)+#13+'Среднее арифметическое: '+FloatToStr(sr);
end;
// Функция обеспечивает ввод в ячейку только допустимых символов
procedure TForm1.StringGridlKeyPress(Sender: TObject; var Key: Char)
begin
case Key of
#8,'0'..'9' : ; // цифры и <Backspace>
#13: // клавиша <Enter>
if StringGridl.Col < StringGridl.ColCount - 1
then StringGridl.Col := StringGridl.Col + 1;
'.',',': // разделитель целой и дробной частей числа
begin
if Key <> DecimalSeparator then
Key := DecimalSeparator; // заменим разделитель на допустимый
if Pos(StringGridl.Cells[StringGridl.Col, 0], DecimalSeparator) <> 0
then Key := Chr(0); // запрет ввода второго разделителя
end;
'-': // минус можно ввести только первым символом, т. е. когда ячейка пустая
if Length(StringGridl.Cells[StringGridl.Col,0]) <> 0
then Key := Chr(0);
else key := Chr(0) ; // остальные символы запрещены
end;
end; end.