Delphi -Мет по лабраб_ Часть_2

АЛМАТИНСКИЙ ГУМАНИТАРНО-ТЕХНИЧЕСКИЙ УНИВЕРСИТТ



Кафедра ВТиПО











ПРОГРАММИРОВАНИЕ
В ВИЗУАЛЬНОЙ СРЕДЕ DELPHI


Методические указания к лабораторным занятиям
по дисциплине «Основы объектного программирования в среде Delphi»




Часть 2















Алматы 2006






Методические указания «Программирование в визуальной среде Delphi» к выполнению лабораторных работы по дисциплине «Основы объектного программирования среде Delphi» для студентов факультета Вычислительной техники и программного обеспечения рассмотрены на заседании кафедры и рекомендованы к изданию на ротапринте БГАТУ и применению в учебном процессе.
Протокол №4 от декабря 2006 года.
Составители:
Зав. Кафедрой АГТУ «ВТ и ПО» М.Ж.Балабекова




Рецензенты: доцент кафедры Информационных технологии АГУ им. Абая, к.п.н. Шекербекова Ш.Т. и к.п.н., кюпюн, доцент Тажигулова А.И.
Лабораторная работа № 6. ПРОГРАММИРОВАНИЕ ЦИКЛИЧЕСКИХ ВЫЧИСЛИТЕЛЬНЫХ ПРОЦЕССОВ. ИТЕРАЦИОННЫЕ ЦИКЛЫ

Цель работы: освоить простейшие средства отладки модулей проекта и создать приложение, которое использует циклический алгоритм.
Отладка модулей проекта
Отладка представляет собой процесс обнаружения, локализации и устранения ошибок в проекте. Она занимает значительную часть рабочего времени программиста, нередко большую, чем разработка проекта.
Практически любой нетривиальный проект перед началом отладки содержит хотя бы одну синтаксическую ошибку.
Отладка синтаксических ошибок
Синтаксические ошибки состоят в нарушении формальных правил использования операторов. Эти ошибки появляются в результате недостаточного знания разработчиком языка программирования и невнимательности при наборе операторов на экране дисплея.
Поиск синтаксических ошибок в модулях проекта осуществляется компилятором. Чтобы дать программисту как можно больше информации об ошибках, допущенных в модуле, компилятор отмечает ошибки и продолжает работу до тех пор, пока не будут обработаны все операторы модуля. Следует иметь в виду, что:
компилятор распознает не все ошибки;
некоторые ошибки могут повлечь за собой то, что правильные операторы будут восприниматься компилятором как ошибочные, и наоборот – ошибочные операторы компилятор воспринимает как верные;
ошибка в одном месте модуля может повлечь за собой серию диагностических сообщений компилятора в других местах модуля;
из-за некоторых ошибок компиляция модуля может вообще прекратиться и проверка последующих операторов не производится.
Информация обо всех ошибках, найденных в модуле, выводится в специальное окно сообщений, которое пристыковано к нижней части окна редактора кода. Каждая строка этого окна содержит имя файла, номер строки, в которой обнаружена ошибка и характер ошибки. Если дважды щелкнуть «мышью» в строке с описанием ошибки, курсор установится в той строке модуля, где обнаружена ошибка. Следует исправлять ошибки последовательно, сверху вниз и после исправления каждой ошибки компилировать программу заново. С целью сокращения времени компиляции рекомендуется осуществлять проверку наличия ошибок в режимах Syntax Check и Compile меню Project. Для получения более полной информации о характере ошибки можно обратиться к HELP нажатием клавиши F1.
Отладка синтаксиса считается завершенной, когда после очередной компиляции в режиме Build All меню Project отсутствуют диагностические сообщения об ошибках.
Отладка логических ошибок
Логические ошибки можно условно разделить на ошибки алгоритма и семантические ошибки. Причинами таких ошибок могут быть несоответствие алгоритма поставленной задаче, неправильное понимание программистом смысла (семантики) операторов языка программирования, нарушение допустимых пределов и правил представления данных, невнимательность при технической подготовке проекта к обработке на компьютере.
Для выявления таких ошибок служат тесты. Тест – это такой набор исходных данных, который дает результат, не вызывающий сомнений. Промежуточные и конечные результаты теста используются для контроля правильности выполнения приложения.
Составление тестов – непростая задача. Тесты должны быть с одной стороны, достаточно простыми, чтобы результат легко проверялся, с другой стороны – достаточно сложными, чтобы комплексно проверить алгоритм.
Тесты составляются по схеме алгоритма до программирования, так как составление тестов помогает выявить многие ошибки в алгоритмизации.
Количество тестов и их сложность зависят от алгоритма. Комплекс тестов должен быть таким, чтобы все ветви схемы алгоритма были пройдены, по крайней мере, по одному разу. Несовпадение результатов, выдаваемых приложением с результатами тестов – признак наличия ошибок. Эти ошибки проявляются в том, что результат расчета оказывается неверным либо происходит переполнение, деление на 0 и другие ошибки.
Для локализации места ошибки рекомендуется поступать следующим образом: в окне Редактора Кода установите курсор в строке перед подозрительным участком и нажмите клавишу F4 (выполнить до курсора). Выполнение приложения будет остановлено на той строке модуля, в которой был установлен курсор. Текущее значение любой переменной можно увидеть, если накрыть идентификатор переменной на 1–2 сек. Нажимая клавишу F8 (пошаговое выполнение), можно построчно выполнять программу, контролируя содержимое переменных и правильность вычислений.
Итерационные циклы
Большое место среди циклов с неизвестным числом повторений занимают циклы, когда в процессе повторения тела цикла образуется последовательность значении y1, y2,,yn,, сходящаяся к некоторому пределу а, т. е.
13 EMBED Equation.3 1415.
Каждое новое значение уn в такой последовательности определяется с учетом предыдущего уn-1 и является по сравнению с ним более точным приближением к искомому результату (пределу) а. Циклы, реализующие такую последовательность приближений (итераций), называются итерационными.
В итерационных циклах условие продолжения (окончания) цикла основывается на свойстве безграничного приближения значений уn к пределу а при увеличении n. Итерационный цикл заканчивают, результат отождествляют со значением уn, т.е. считают, что уn
· а, если для некоторого значения n выполняется условие
13 EMBED Equation.3 1415,
где
· – допустимая погрешность вычисления результата.
Типичным примером итерационного циклического процесса может служить задача вычисления суммы бесконечного ряда. Понятие суммы связано с понятием сходимости бесконечного ряда. Бесконечный ряд значений t0, t1, ..., tn, ... называется сходящимся, если сумма sn = t0 + t1, ...,tn, его первых (n + 1) слагаемых при беспредельном возрастании n стремится к некоторому пределу S, который и называется суммой ряда, т. е.
13 EMBED Equation.3 1415; 13 EMBED Equation.3 1415.
Общий член tn сходящегося ряда при этом стремится к нулю, т. е.
13 EMBED Equation.3 1415; 13 EMBED Equation.3 1415.
Следовательно, последовательность s1, s2, ..., sn, ... является искомой последовательностью значений и определяет следующее условие окончания суммирования:
13 EMBED Equation.3 1415 или 13 EMBED Equation.3 1415.

Пример.
Вычислить с погрешностью
·=10-4 значение функции s=cos(x), используя разложение в ряд:
13 EMBED Equation.3 1415,
где 13 EMBED Equation.3 1415.
Для решения задачи необходимо, во-первых, определить значение очередного слагаемого tn, во-вторых, осуществлять накопление суммы по итерационной формуле:
13 EMBED Equation.3 1415.
Для определения tn в данном примере из-за наличия факториала целесообразно использовать не прямое вычисление, а рекуррентное соотношение: 13 EMBED Equation.3 1415.
Подставим в формулу, определяющую tn, вместо n величину (n-1):
13 EMBED Equation.3 1415.
Определим сомножитель 13 EMBED Equation.3 1415:
13 EMBED Equation.3 1415.
Напомним, что m!=1·2··m, поэтому
13 EMBED Equation.3 1415.
Начальное значение t0=1 находится подстановкой в формулу для общего члена tn при n=0.
procedure TForm1.Button1Click(Sender: TObject);
var
eps, s, t, f, x, y: real;
n: integer;
begin
eps:=StrToFloat(Edit1.Text);
x:=StrToFloat(Edit2.Text);
s:=0;
t:=1;
n:=1;
while abs(t)>eps do
begin
s:=s+t;
f:=-sqr(x)/(2*n*(2*n-1));
t:=t*f;
n:=n+1
end;
y:=cos(x);
Memo1.Lines.Add('S= '+FloatToStr(s)+' Y= '+FloatToStr(y))
end;
end.
Так как надобности в запоминании значений всех слагаемых tn и промежуточных сумм sn нет, то в программе используются простые переменные: s – очередное значение суммы ряда, t – очередное значение члена ряда, f – очередное значение сомножителя 13 EMBED Equation.3 1415.
Для проверки полученного результата осуществляется вызов стандартной функции cos(x), значение которой присваивается переменной y. Для организации цикла с предусловием, в котором условие 13 EMBED Equation.3 1415 является условием продолжения цикла.
Пример создания приложения
Задание. Создать Windows-приложение, которое выводит таблицу значений функции 13 EMBED Equation.3 1415 и ее разложения в ряд в виде суммы 13 EMBED Equation.3 1415 с погрешностью
·=10-4, для значений x от xn до xk с шагом h=(xk–xn)/8. На панели интерфейса предусмотреть возможность управления выводом исходных данных и погрешности вычислений.
Сохранение проекта
Для нового проекта создайте новую папку, например, X: \ 35эи \ LAB6.
Сохраните проект File | Save Project As(Файл | Сохранить Проект как). Сначала сохраните модуль под именем UnIterate, затем файл проекта под именем PrIterate.
Размещение компонентов на Форме
Один из возможных вариантов панели интерфейса создаваемого приложения показан на рисунке 6.1.
Вместо компонента Edit используем компонент SpinEdit, который обеспечивает отображение и редактирование целого числа с возможностью его изменения посредством двойной кнопки.
Установите для компонента SpinEdit1 значения свойств: MinValue = 1, MaxValue = 20.
В тех случаях, когда объем выводимой информации превышает размер поля компонента Memo, целесообразно снабдить его линейками прокрутки. В свойстве ScrollBars компонента Memo1 установим значение ssVertical – появится вертикальная линейка прокрутки.

Рис.6.1. Размещение компонентов на форме
Текст модуля UnIterate
unit UnIterate;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Buttons, Spin;
type
TForm1 = class(TForm)
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
SpinEdi
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
Memo1.Lines.Add('Исходные данные: n= '+SpinEdit1.Text+
' Xn = '+Edit1.Text+' Xk= '+Edit2.Text+
' Eps = '+Edit3.Text);
Memo1.Lines.Add('');
x:=xn;
repeat
y:=2*(sqr(cos(x))-1);
s:=0; p:=1; i:=1;

·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
· Memo1.Lines.Add('x='+FloatToStrF(x,ffFixed,4,2)+
' S='+FloatToStrF(s,ffFixed,6,3)+
' Y='+FloatToStrF(y,ffFixed,6,3));
x:=x+h;
until x>xk;
end;
end.
6.4. Выполнение индивидуального задания
По указанию преподавателя выберите индивидуальное задание. Создайте приложение и протестируйте его работу.
Индивидуальные задания
В заданиях с № 1 по № 15 необходимо вывести на экран таблицу значений функции Y(x) и ее разложение в ряд S(x) с погрешностью
·=10-4, для значений x от xn до xk с шагом h=(xk- xn)/n. В панели интерфейса предусмотреть возможность управления выводом исходных данных и погрешности вычислений.

Xn
Xk
S(x)
n
Y(x)


0,1
1
13 EMBED Equation.3 1415
16
13 EMBED Equation.3 1415


0,1
1
13 EMBED E
·
·
·
·
·
·
·
·–
·
·
·
·
·
·
·
·
·
·
·
·
·–
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·–
·
·
·
·
·
·
·
·
·
·
·
·
·–
·
·
·
·
·
·
·
·
·
·–
·
·
·
·
·
·
·
·
·
·
·
·
·–
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·–
·
·
·
·
·
·
·
·
·
·
·
·
·–
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·–
·
·
·
·
·
·
·
·
·
·
·
·
·
·–
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·–
·
·
·
·
·
·
·
·
·
·
·
·
·
·–
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·–
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
Дано натуральное число N. Определить минимальное число, которое получится перестановкой цифр числа N. Например, для числа 4 917 получим 1 479.
Первые два члена последовательности чисел Фибоначчи равны 1, каждый следующий член последовательности равен сумме двух предыдущих (1, 1, 2, 3, 5, 8, 13, ). Определить минимальный член этой последовательности, больший заданного числа N.
Даны два натуральных числа M и N. Вывести на печать все цифры, которые присутствуют в записи одного из чисел, но отсутствуют в записи другого числа. Например, для чисел 2 528 и 8 902 это цифры 5, 9 и 0.
Дано натуральное число N. Вычислить произведение его цифр.
Дано натуральное число N. Выбросить из записи числа цифры 0 и 3, оставив прежний порядок цифр.
Первые два члена последовательности чисел Фибоначчи равны 1, каждый следующий член последовательности равен сумме двух предыдущих (1, 1, 2, 3, 5, 8, 13, ). Определить сумму всех членов этой последовательности, не превосходящих заданного числа N.
Дано натуральное N. Определить число, которое получится, если в двоичной записи числа N поменять местами первую и вторую цифры, третью и четвертую, пятую и шестую и так далее. Если количество цифр нечетное, то последняя цифра остается на своем месте. Например, для числа 1910 (двоичная запись 100112) получим 011012 или 1310.
Найти максимальную цифру натурального числа N.
Дано натуральное число N. Верно ли, что в записи числа присутствует цифра 5?
Дано натуральное число N. Определить максимальное число, которое получится перестановкой цифр числа N. Например, для числа 4 917 получим 9 741.
Найти минимальную цифру натурального числа N.
Дано натуральное N. Определить число, которое получится, если из двоичной записи числа N исключить все 0. Например, для числа 2510 (двоичная запись 110012) получим 1112 или 710.
Даны два натуральных числа M и N. Вывести на печать все цифры, которые присутствуют как в записи числа M, так и в записи числа N. Например, для чисел 5 248 и 492 это цифры 4 и 2.
Первые два члена последовательности чисел Фибоначчи равны 1, каждый следующий член последовательности равен сумме двух предыдущих (1, 1, 2, 3, 5, 8, 13, ). Определить максимальный член этой последовательности, меньший заданного числа N.
Дано натуральное N. Определить число, которое получится, если двоичное представления числа N записать в обратном порядке. Например, для числа 1910 (двоичная запись 100112) получим 110012 или 2510.
Лабораторная работа № 7. ПРОГРАММИРОВАНИЕ
С ИСПОЛЬЗОВАНИЕМ СТРОК

Цель работы: овладение практическими навыками работы со строками; освоить применение компонентов ListBox и ComboBox для создания приложения, в котором используются строки.
Краткие теоретические сведения
Помимо числовой информации компьютер может обрабатывать символьную информацию. Object Pascal оперирует с символьной информацией, которая может быть представлена отдельными символами или строками символов.
7.1.1. Символьные типы
Данные символьного типа предназначены для хранения одного символа. Для символов используется тип Char. Кроме Char в Delphi 7 имеется еще два символьных типа – ANSIChar и WideChar. Пример объявления переменной типа Char.
Var c: char;
Для кодировки символов в Windows используется код ANSI (American Natinal Institute – американский национальный институт стандартизации). В соответствии с этой таблицей каждому символу соответствует целое число в диапазоне 0255. Это число служит кодом внутреннего представления символа. Символы с номерами от 0 до 31 являются служебными символами, т.е. предназначены для управления отображением информацией. Например, символ с кодом 9 вставляет в текст знак табуляции, символ с кодом 13 эквивалентен нажатию клавиши Enter (конец абзаца), символ с кодом 27 – ESC.
7.1.2. Строковые типы
Строкой называется последовательность из определенного количества символов, заключенных в апострофы.
Например,
'Текстовая строка'
'abcde'
'S=10,24'
Delphi 7 поддерживает три физических строковых формата: короткий – ShortString, длинный – AnsiString, широкий – WideString и один логический строковый тип – String.
Переменные типов AnsiString и WideString – это динамически распределяемые массивы символов, максимальная длина которых ограничивается только наличием памяти.
Тип ShortString и имеет максимальную длину, равную 255 символам. Тип String – это, по существу, массив Array [0..255] of char. Тип ShortString предназначен для обеспечения совместимости с ранними версиями Delphi.
Тип String в зависимости от директив компилятора интерпретируется либо как AnsiString , либо как ShortString.
Пример объявления строковых переменных:
Var st: String;
st1: String[10];
В Object Pascal имеется простой доступ к отдельным символам строковой переменной: i-й символ переменной st записывается как st[i]. Например, если st – это 'Строка', то st[1] – это 'С', st[2] – это 'т', st[3] – 'р' и так далее.
Над строковыми данными определена операция слияния, обозначаемая знаком +. Например:
a := 'Object';"
b := 'Pascal';
c := a + b;
В этом примере переменная c приобретет значение 'ObjectPascal'.
Кроме слияния над строками определены операции сравнения <, >, =, <>, <=, >=. Две строки сравниваются посимвольно, слева направо, по кодам символов. Если одна строка меньше другой по длине, недостающие символы короткой строки заменяются символом с кодом 0.

7.1.3. Процедуры и функции для работы со строками
Ниже приведены основные стандартные процедуры и функции для работы со строками.
Length(s:string):integer;
Функция возвращает число символов в строке s.
Пример
n := length('Pascal'); {n будет равно 6}

Concat(s1,[s2,...,sn]:string):string;
Возвращает строку, представляющую собой сцепление из строк s1,..sn. Идентична операции «+» для строк, но работает менее эффективно.
Пример
S:=concat(AA’,’XX’,’ZZ’); {S будет равно AAXXZZ}
Copy(s:string; index:integer; count:integer):string;
Функция возвращает подстроку, выделенную из исходной строки s, длиной count символов, начиная с символа под номером index.
Пример
s := 'Интегрированная среда Delphi';
s1 := copy(s, 1, 7); {s1 будет равно 'Интегри'}
s2 := copy(s, 17, 5); {s2 будет равно 'среда'}
s3 := copy(s, 23, 6); {s3 будет равно 'Delphi'}

Delete(var s:string; index,count:integer);
Процедура удаляет из строки s подстроку длиной count символов, начиная с символа под номером index.
Пример
s := 'Интегрированная среда Delphi';
delete(s,1,16); {s будет равно 'среда Delphi' }

Insert(source:string; var s:string;index:integer);
Процедура предназначена для вставки строки source в строку s, начиная с символа index этой строки.
Пример
s := 'Object';
insert('Pascal',s,7); {s будет равно 'ObjectPascal'}

Pos(substr,s:string):integer;
Функция производит поиск в строке s подстроки substr. Результатом функции является номер первой позиции подстроки в исходной строке. Если подстрока не найдена, то функция возвращает 0.
Пример
s := 'ObjectPascal';
x1 := pos('Pascal', s); {x1 будет равно 7}
x2 := pos('Basic', s); {x2 будет равно 0}
Далее приведены функции, связанные с типом char, но которые часто используются при работе со строками.
Chr(n: byte): char;
Функция возвращает символ по коду, равному значению выражения n.
Ord(ch: char): byte;
В данном случае функция возвращает код символа ch.
UpCase(c: char): char;
Если с – строчная латинская буква, то функция возвращает соответствующую прописную латинскую букву, в противном случае символ c возвращается без изменения.
Применение компонентов ListBox и ComboBox для работы со строками
При работе со строками ввод и вывод информации на экран удобно организовывать с помощью компонентов ListBox и ComboBox.
Пиктограмма компонента ListBox 13 EMBED PBrush 1415 находится на странице Standard Палитры компонентов. Компонент ListBox представляет собой список, элементы которого выбираются при помощи клавиатуры или «мыши». Список элементов задается свойством Items. Методы Add , Delete и Insert используются для добавления, удаления и вставки строк соответственно. Для определения номера выделенного элемента используется свойство ItemIndex. Для добавления строк в ListBox необходимо воспользоваться компонентом Edit.
Пиктограмма компонента ComboBox 13 EMBED PBrush 1415 также расположена на странице Standard Палитры компонентов. Компонент ComboBox представляет собой комбинацию списка ListBox и редактора Edit. По внешнему виду компонент ComboBox напоминает строку ввода Edit, но дополнительно имеет в правой части кнопку со стрелкой. Если щелкнуть мышью по этой кнопке, появится выпадающий список, подобный списку компонента ListBox. Используя строку ввода, можно вводить в список новые элементы, осуществлять поиск нужного элемента в списке, отображать активный элемент списка.
Свойства компонента ComboBox заимствованы у компонентов Edit и ListBox. Для работы с окном редактирования используется свойство Text, как в Edit, а для работы со списком используется свойство Items, как в ListBox. Основные операции для обработки списка в компоненте ComboBox – добавление, удаление, поиск элементов – осуществляется так же, как и в списке ListBox.
7.3. Пример создания приложения
Задание. Создать Windows-приложение в визуальной среде Delphi для решения следующей задачи.
Дана произвольная символьная строка. Слова в строке разделяются любым количеством пробелов:
определить количество слов в данной строке;
заменить все строчные символы русского языка прописными.
Полученную строку вывести на экран.
Ввод строки заканчивать нажатием клавиши Enter. Работа приложения должна завершаться нажатием кнопки Close.
7.3.1. Сохранение проекта
Для нового проекта создайте новую папку, например X:\35эи\ lab7.
Сохраните проект File | Save Project As (Файл | Сохранить Проект как). Далее сохраните модуль под именем UnStr, а файл проекта - под именем PrStr.
7.3.2. Размещение компонентов на Форме
Разместите на Форме компоненты так, как показано на рисунке 7.1.

Рис. 7.1. Размещение компонентов на Форме
7.3.3. Создание процедуры-обработчика события активизации Формы FormActivate.
В момент запуска приложения, когда панель интерфейса появляется на экране, для пользователя удобно чтобы курсор уже находился в поле редактора компонента ComboBox. При активизации Формы возникает событие OnActivate, которое можно использовать для передачи фокуса ввода компоненту ComboBox. Для создания процедуры-обработчика этого события необходимо в Инспекторе Объектов выбрать компонент Form1, на странице Events (События) найти событие OnActivate и дважды щелкнуть «мышью» по его правой (белой) части. Курсор установится в тексте процедуры-обработчика события активизации Формы procedure TForm1.FormActivate (Sender: TObject). Наберите операторы передачи фокуса ввода компоненту ComboBox1.
7.3.4. Создание процедуры-обработчики события ComboBox1KeyPress
В соответствии с заданием необходимо, чтобы при нажатии клавиши Enter строка символов, которую пользователь набрал в поле редактирования, переносилась в список выбора компонента ComboBox1.
Для создания процедуры-обработчика этого события необходимо в Инспекторе Объектов выбрать компонент ComboBox1, на странице Events (События) найти событие OnKeyPress и дважды щелкнуть «мышью» по его правой части. Курсор установится в тексте процедуры procedure TForm1.ComboBox1KeyPress(Sender: TObject; var Key: Char), которая осуществляет обработку события нажатия клавиши на клавиатуре. Наберите операторы этой процедуры, пользуясь текстом модуля UnStr.
В результате выполнения этой процедуры при нажатии клавиши Enter строка из поля редактирования переносится в список выбора и очищается поле редактирования.
7.3.5. Создание процедуры-обработчики события нажатия клавиши «мыши» ComboBox1Click
Создание процедуры procedure TForm1.ComboBox1Click(Sender: TObject) выполняется аналогично процессу создания процедуры-обработчика события OnKeyPress компонента ComboBox1 (см. раздел 7.3.4).
Пользуясь текстом модуля UnStr, наберите операторы, которые осуществляют основной алгоритм обработки символов выбранной строки.
7.3.6. Работа с приложением
Запустите созданное приложение. Занесите с помощью окна редактирования исходные данные в список выбора компонента ComboBox1. Ввод каждой строки завершайте нажатием клавиши Enter. Далее раскройте список выбора, щелкните «мышью» по нужной строке – в результате будет определено количество слов в строке и произойдет замена строчных букв прописными.
Преобразование строчных букв в прописные основано на том, что код строчной буквы больше кода прописной. Код прописных букв от «а» до «я» больше соответствующих строчных букв на 32 (см. таблицу кодов Ansi). Например, код символа «а» равен 224, а код символа «А» – 192. Эта закономерность сохраняется и для остальных букв русского алфавита.
7.4. Текст модуля UnStr
Unit UnStr;
interface
uses
Windows, M
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·1: TForm1;
implementation
{$R *.DFM}
//Обработка события активизации Формы
procedure TForm1.FormActivate(Sender: TObject);
begin
ComboBox1.SetFocus;
end;
// Обработка события ввода символа и нажатия клавиши Enter
procedure TForm1.ComboBox1KeyPress(Sender: TObject; var Key: Char);
begin
// если нажата клавиша Enter, то строка из поля редактирования
// переносится в список выбора ComboBox1
if key=#13 then
begin
ComboBox1.Items.Add(ComboBox1.Text);
ComboBox1.Text:=''; // очистка окна редактирования
end;
end;
// Обработка события нажатия клавиши «мыши» в списке выбора
procedure TForm1.ComboBox1Click(Sender: TObject);
var
st : string;
n,i,nst,ind: integer;
begin
n:=0; // n содержит количество слов
ind:=0;
nst:=ComboBox1.ItemIndex; // определение номера выбранной строки
st:=ComboBox1.Items[nst]; // st присваивается выбранная строка
// Определение количества слов в выбранной строке st
for i:=1 to Length(st) do
case ind of
0: if st[i]<>' ' then //если встретился символ
begin
ind:=1;
n:=n+1; //количество слов увеличивается на единицу
end;
1: if st[i]=' ' then //если встретился пробел
ind:=0;
end;
Label3.Caption:=IntTotr(n); //вывод количества слов в Label3
// Замена строчных символов русского языка на прописные
for i:=1 to Length(st) do
if (st[i]>='а') and (st[i]<='я') then
st[i]:=chr(ord(st[i])-32);
Label5.Caption:=st; //полученная строка выводится в Label5
end;
end.

7.5. Выполнение индивидуального задания
Во всех заданиях исходные данные вводить с помощью компонента Edit в компонент ListBox, либо с помощью свойства Text в свойство Items компонента ComboBox. Результат выводить с помощью компонента Label. Ввод строки заканчивать нажатием клавиши Enter. Работа приложения должна завершаться нажатием кнопки Close.
Индивидуальные задания
Дана строка символов, содержащая буквы русского и латинского алфавита. Верно ли, что в этой строке содержится четное количество строчных латинских букв. Вывести на экран соответствующее сообщение.
Дана строка символов. Заменить все последовательности символов 'on' на 'online' и вывести новую строку (если искомой последовательности в строке нет, то вывести соответствующее сообщение).
Дана строка символов, содержащая буквы и цифры. Определить чего больше – цифр или букв. Вывести на экран соответствующее сообщение.
Дана строка, состоящая из букв, цифр, запятых, точек. Заменить каждую точку многоточием и вывести новую строку.
Дана строка символов, состоящая из букв, цифр, запятых, точек. Удалите из данной последовательности все цифры. Полученную строку вывести на экран.
Дана строка символов, состоящая из произвольного текста, слова разделены пробелами. Преобразовать последовательность, заменив пробелы между словами на символ звездочки * .
Строка символов содержит только цифры. Вывести на экран номера позиций цифры, заданной пользователем.
Дана строка символов, среди которых есть двоеточия. Выведите в Memo все символы, расположенные до первого двоеточия.
Дана строка символов, содержащая заглавные латинские буквы. Определить, упорядочены ли эти буквы по алфавиту.
Дана символьная строка и слово, состоящее из четырех символов. Определить, есть ли в данной строке все буквы данного слова. Вывести соответствующее сообщение.
Дана символьная строка. Заменить все символы '!' точками, кроме первого и вывести полученную строку.
Дана символьная строка. Определить является ли данная последовательность записью двоичного числа (т.е. содержит только нули и единицы).
Дана строка символов, состоящая из произвольного текста на английском языке. Заданный текст распечатайте по строкам, понимая под строкой часть текста до точки включительно.
Дана строка символов. Подсчитайте сколько среди них латинских заглавных букв.
Дана символьная строка, содержащая два предложения, каждое из которых заканчивается точкой. Поменять их местами, сохранив порядок слов в предложениях.
Дана символьная строка. Слово – последовательность символов между пробелами, не содержащая пробелы внутри себя. Определить длину самого короткого слова.
Дана символьная строка. Слово – последовательность символов между пробелами, не содержащая пробелы внутри себя. Определить количество слов заданной длины.
Дана строка символов. Определить количество букв 'Я' между самой левой открывающейся скобкой и самой правой закрывающейся скобкой (если какие-либо скобки отсутствует, то вывести соответствующее сообщение).
Дана символьная строка. Слово – последовательность символов между пробелами, не содержащая пробелы внутри себя. Заменить окончания слов 'ing' на 'ed' и вывести полученную строку.
Даны две символьные строки. Слово – последовательность символов между пробелами, не содержащая пробелы внутри себя. Вывести слова, которые встречаются в обеих строках.
Дана символьная строка. Слово – последовательность символов между пробелами, не содержащая пробелы внутри себя. Отредактировать заданное предложение, удаляя из него слова с нечетными номерами и переворачивая слова с четными (пример, «нow do you do» ( «od od»).
Дана символьная строка. Слово – последовательность символов между пробелами, не содержащая пробелы внутри себя. Переставить и распечатать слова заданной строки в алфавитном порядке по первой букве.
Дана символьная строка и символ. Слово – последовательность символов между пробелами, не содержащая пробелы внутри себя. Вывести все слова, в которых есть заданный символ.
Дана строка символов, содержащая некоторый текст. Разработать программу, которая определяет, является ли данный текст палиндромом, т.е. читается ли он слева направо так же, как и справа налево (например, «А роза упала на лапу Азора»).
Составить программу, которая читает построчно текст другой программы (ввести с клавиатуры) на языке Pascal, обнаруживает комментарии и выводит их на экран.
Составить программу, которая читает построчно текст другой программы (ввести с клавиатуры) на языке Pascal, подсчитывает количество ключевых слов «begin» и «end», и выводит на экран соответствующее сообщение.
Дана строка символов, состоящая из произвольного текста на английском языке, слова отделены пробелами. Поменять местами первую и последнюю букву каждого слова.
Дана строка символов, состоящая из букв, цифр, запятых, точек, знаков «+» и «–». Выделить подстроку, которая соответствует записи целого числа (т.е. начинается со знака «+» или «–» и внутри подстроки нет букв, запятых и точек).
Дана строка символов, состоящая из произвольных десятичных цифр, разделенных пробелами. Вывести на экран числа этой строки в порядке возрастания их значений.
Дана строка символов, состоящая из произвольного текста на английском языке, слова отделены пробелами. Вывести на экран порядковый номер слова максимальной длины и номер позиции строки, с которой оно начинается.
Лабораторная работа № 8. ПРОГРАММИРОВАНИЕ
С ИСПОЛЬЗОВАНИЕМ ЗАПИСЕЙ

Цель работы: овладение навыками создания приложений, обрабатывающие данные типа Запись.
8.1. Краткие теоретические сведения
Запись(record) – это тип структурированных данных, позволяющий создавать сртуктуры, состоящие из именованных разнотипных элементов данных, обрабатываемых как единое целое. Отдельные элементы записей называются полями. Таким образом тип Запись позволяет объединить элементы данных различных типов в единое целое. Синтаксис объявления записи следующий

type
<имя типа> = record
<имя поля1> : <тип поля1>;
<имя поля2> : <тип поля2>;
<имя поля3> : <тип поля3>;
...
<имя поляN> : <тип поляN>
end;
Например, в приведенном ниже примере приложения будет объявлен тип данных Запись (record), имя типа "ZAP"
type
zap=record
nzach: integer;
fio: string[20];
mat,fiz,inf: integer;
srb: extended;
end;
Запись состоит из 6 полей, четыре из которых имеют тип integer, одно-string и одно – extended.
Далее будет объявлен массив записей, то есть таблица.
var
MZap:array[1..9] of zap;
Переменные типа Запись могут участвовать в операторах присваивания, но никакие операции над ними выполняться не могут.
Арифметические или другие операции могут выполняться только над отдельными полями записи.
Обращение к значению поля осуществляется с помощью идентификатора переменной и идентификатора поля, разделенных точкой.

Например:
MZap[1].nzach – определяет(выполняет) обращение к полю nzach (номер зачетки) первого элемента массива MZap типа zap.

8.2. Пример создания приложения
Задание. Создать Windows-приложение для обработки ведомости об успеваемости студентов группы, в количестве 9 человек. Каждая запись должна содержать номер зачетной книжки, фамилию и инициалы, а также оценки по математике, физике и информатике. Для каждого студента рассчитать средний балл. Вывести ведомость в порядке убывания среднего балла.
В отдельный список вывести информацию о неуспевающих студентах (студентах, получивших хотя бы одну двойку).
В отдельное поле вывести наибольший и наименьший номера зачетных книжек в группе, а так же фамилии студентов, которым они принадлежат.

8.2.1. Указания по созданию приложения
Для нового проекта создайте новую папку, например X:\35эи\ lab8.
Сохраните проект File | Save Project As (Файл | Сохранить Проект как). Далее сохраните модуль под именем UnZap, а файл проекта – под именем PrZap.

8.2.2. Размещение компонентов по Форме
Один из возможных вариантов панели интерфейса создаваемого приложением показан на рис. 8.1.
При работе с записями ввод и вывод информации на экране удобно организовать с помощью компонента StringGrid, который находится на странице Additional.
Как видно, на форме размещены три компонента StringGrid: первый (StringGrid1) предназначен для ввода исходной ведомости, второй (StringGrid2) – для вывода ведомости, содержащей средний балл в порядке убывания среднего балла, третий (StringGrid3) – для вывода списка неуспевающих студентов.
В задании для соответствующих заголовков колонок и номеров строк используется фиксированная зона компонента StringGrid, поэтому в Инспекторе Объектов значение FixedCols и FixedRows установите равными 1 для всех компонентов StringGrid.

Рис. 8.1. Размещение компонентов на форме
В соответствии с заданием установите значение свойства ColCoun t=6 (количество столбцов) для StringGrid2 и ColCount=7 для StringGrid1 и StringGrid3, а значение свойства RowСount=10 (количество строк) для всех компонентов StringGrid. Для наличия вертикальной или горизонтальной или обеих линеек прокрутки в компоненте StringGrid установите свойство ScrollBars в состояние ssVertical, ssGorizontal или ssBoth соответственно. Но старайтесь устанавливать такой размер поля компонента StringGrid, чтобы вся таблица умещалась в поле.
Откройте список опций свойства +Options и установите значение goEditing в True – это даст возможность вводить и редактировать информацию в компоненте StringGrid с помощью клавиатуры и “мыши’’.
На форме также размешены три кнопки (Batton). Каждая из них выполняет функцию задания соответственно надписи.
Компонент Memo предназначен для вывода фамилий студентов с максимальным и минимальным номерами зачетных книжек.
Три компонента Label (Метка) служат для вывода пояснительных надписей.
8.2.3.Создание процедур обработки событий FormCreate и ButtonClick
Двойным нажатием клавиши «мыши» на Форме и на кнопках Button1, Button2, Button3 создайте соответствующие процедуры обработки событий. Используя текст модуля UnZap, внимательно наберите операторы этих процедур.
8.2.4. Работа с приложением
Закончив создание приложения, сохраните его с помощью пунктов меню File | Save All... Выполните приложение. Проанализируйте результаты. В случае необходимости откорректируйте приложение, снова сохраните его аналогичным образом. Выполните приложение и проанализируйте результаты. После каждой корректировки следует выполнять сохранение приложения с помощью пунктов File | Save All
8.2.5. Текст модуля UnZap
Unit UnZap;
interface
uses
Wi
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·utton3Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
implementation
{$R *.dfm}
type // Создание типа данных "запись"(record), имя типа - zap
zap=record
nzach :integer;
fio:string[20];
mat,fiz,inf:integer;
srb:extended;
end;
var
MZap:array[1..9] of zap; // объявление массива записей

procedure TForm1.FormCreate(Sender: TObject);
var
i:integer;
begin
with StringGrid1 do
begin // занесение информации в ячейки StringGrid1
Cells[0,0]:='№ п/п';
Cells[1,0]:='№ зачетной книжки';
Cells[2,0]:='Фамилия';
Cells[3,0]:='Математика';
Cells[4,0]:='Физика';
Cells[5,0]:='Информатика';
for i:=1 to 9 do
Cells[0,i]:=IntToStr(i);
Cells[1,1]:='223254';Cells[2,1]:='Первый Н.П.'; Cells[3,1]:='3'; Cells[4,1]:='4';
Cells[5,1]:='4';
Cells[1,2]:='233254';Cells[2,2]:='Второй А.Н.'; Cells[3,2]:='5'; Cells[4,2]:='5';
Cells[5,2]:='5';
Cells[1,3]:='123754'; Cells[2,3]:='Третий Н.П.'; Cells[3,3]:='4'; Cells[4,3]:='5';
Cells[5,3]:='4';
Cells[1,4]:='216254';Cells[2,4]:='Четвертый Н.П.';Cells[3,4]:='3'; Cells[4,4]:='3';
Cells[5,4]:='2';
Cells[1,5]:='329270';Cells[2,5]:='Пятый Н.П.';Cells[3,5]:='5'; Cells[4,5]:='4';
Cells[5,5]:='5';
Cells[1,6]:='290176';Cells[2,6]:='Шестой Н.П.'; Cells[3,6]:='5'; Cells[4,6]:='3';
Cells[5,6]:='4';
Cells[1,7]:='218425';Cells[2,7]:='Седьмой Н.П.';Cells[3,7]:='3';Cells[4,7]:='2';
Cells[5,7]:='4';
Cells[1,8]:='223054';Cells[2,8]:='Восьмой Н.П.';Cells[3,8]:='2';Cells[4,8]:='2';
Cells[5,8]:='4';
Cells[1,9]:='219325';Cells[2,9]:='Девятый Н.П.';Cells[3,9]:='5';Cells[4,9]:='5';
Cells[5,9]:='4';
for i:=1 to 9 do
with MZap[i] do
begin // формирование полей массива записей
nzach:=StrToInt(Cells[1,i]);
fio:=Cells[2,i];
mat:=StrToInt(Cells[3,i]);
fiz:=StrToInt(Cells[4,i]);
inf:=StrToInt(Cells[5,i]);
end;
end;
end;

{ Сортировка записей в порядке убывания среднего балла}
procedure TForm1.Button1Click(Sender: TObject); var
i,j: integer;
rab: zap; // Рабочая переменная для обмена значениями двух элементов
// массива при сортировке
begin
for i:=1 to 9 do
with StringGrid1,MZap[i] do
begin // формирование полей массива записей при нажатии Button1
nzach:=StrToInt(Cells[1,i]);
fio:=Cells[2,i];
mat:=StrToInt(Cells[3,i]);
fiz:=StrToInt(Cells[4,i]);
inf:=StrToInt(Cells[5,i]);
srb:=(mat+fiz+inf)/3 // Расчет среднего балла
end;
for i:=2 to 9 do // Сортировка массива записей по убыванию среднего
//балла
for j:=9 downto i do // методом пузырька
if MZap[j-1].srb begin
rab:=MZap[j-1];
MZap[j-1]:=MZap[j];
MZap[j]:=rab;
end;
with StringGrid2 do // Очистка ячеек StringGrid2
for i:=0 to 9 do
for j:=0 to 9 do
Cells[j,i]:=' ';
with StringGrid2 do
begin // Пересылка заголовков столбцов в первую строку
//StringGrid2
Cells[0,0]:='№ п/п';
Cells[1,0]:='№ зачетной книжки';
Cells[2,0]:='Фамилия';
Cells[3,0]:='Математика';
Cells[4,0]:='Физика';
Cells[5,0]:='Информатика';
Cells[6,0]:='Средний балл';
for i:=1 to 9 do
with MZap[i] do
begin // Занесение информации в остальные ячейки
//StringGrid2
Cells[0,i]:=IntToStr(i); // из рассортированного массива Mzap
Cells[1,i]:=IntToStr(nzach);
Cells[2,i]:=fio;
Cells[3,i]:=IntToStr(mat);
Cells[4,i]:=IntToStr(fiz);
Cells[5,i]:=IntToStr(inf);
Cells[6,i]:=floatToStrF(srb,ffFixed,5,2);
end;
end;
end;

{ Вывод списка неуспевающих студентов}
procedure TForm1.Button2Click(Sender: TObject); var
i,j:integer;
begin
for i:=1 to 9 do
with StringGrid1,MZap[i] do
begin // Занесение данных в массив записей
nzach:=StrToInt(Cells[1,i]);
fio:=Cells[2,i];
mat:=StrToInt(Cells[3,i]);
fiz:=StrToInt(Cells[4,i]);
inf:=StrToInt(Cells[5,i]);
srb:=(mat+fiz+inf)/3
end;
with StringGrid3 do // Очистка ячеек StringGrid3
for i:=0 to 9 do
for j:=0 to 9 do
Cells[j,i]:=' ';
with StringGrid3 do
begin // Занесение заголовков столбцов в первую строку StringGrid3
Cells[0,0]:='№ п/п';
Cells[1,0]:='№ зачетной книжки';
Cells[2,0]:='Фамилия';
Cells[3,0]:='Математика';
Cells[4,0]:='Физика';
Cells[5,0]:='Информатика';
Cells[6,0]:='Средний балл';
j:=0;
for i:=1 to 9 do //Занесение только данных о неуспевающих студентах в
// StringGrid3
with MZap[i] do
if (mat=2) or (fiz=2) or (inf=2) then
begin
j:=j+1;
Cells[0
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·{ Определение наибольшего и наименьшего номеров зачетных книжек}
procedure TForm1.Button3Click(Sender: TObject);
var
i, min, max, k, l: integer;
begin
for i:=1 to 9 do
with StringGrid1,MZap[i] do
begin // Занесение данных в массив записей при нажатии кнопки Batton3
nzach:=StrToInt(Cells[1,i]);
fio:=Cells[2,i];
mat:=StrToInt(Cells[3,i]);
fiz:=StrToInt(Cells[4,i]);
inf:=StrToInt(Cells[5,i]);
srb:=(mat+fiz+inf)/3
end;
max:=MZap[1].nzach; k:=1; // занесение № первой зачетки в ячейку max
min:=MZap[1].nzach; l:=1; // занесение № первой зачетки в ячейку min
for i:=1 to 9 do // Поиск максимального и минимального № зачеток
with MZap[i] do // и номеров в массиве их обладателей
begin
if MZap[i].nzach>max then
begin
max:=nzach;
k:=i;
end;
if MZap[i].nzach begin
min:=nzach;
l:=i;
end;
end;
Memo1.Lines.Add('РЕЗУЛЬТАТ'); // Занесение результатов в Memo поле
Memo1.Lines.Add(#13#10+'Наибольший № зачетки '+IntToStr(max)+' имеет '+MZap[k].fio);
Memo1.Lines.Add(#13#10+'Наименьший № зачетки '+IntToStr(min)+' имеет '+MZap[l].fio);
end;
end.
8.3. Выполнение индивидуального задания
По указанию преподавателя выберете свое индивидуальное задание. Создайте приложения и протестируйте его работу
Индивидуальные задания
В магазине формируется список лиц, записавшихся на покупку товара повышенного спроса. Каждая запись этого списка содержит: порядковый номер, Ф.И.О., домашний адрес покупателя и дату постановки на очередь, дату выполнения заказа. Вывести список в порядке возрастания даты постановки на очередь и список выполненных заказов.
Список товаров, имеющихся на складе, включает в себя наименование товара, количество единиц товара, цену единицы и дату поступления товара на склад. Вывести список товаров, хранящихся больше месяца, стоимость которых превышает 10 000 руб., а также общую стоимость всех таких товаров,
Для получения места в общежитии формируется список студентов, который включает Ф.И.О. студента, группу, средний балл, доход на каждого члена семьи. Общежитие в первую очередь предоставляется тем, у кого доход на каждого члена семьи меньше двух минимальных зарплат, и у кого средний балл не меньше 6. Вывести список первоочередников, претендующих на места в общежитии в порядке возрастания дохода на члена семьи.
Сведения о наличии лекарственных средств в аптеках города содержат следующие данные: наименование лекарства, фирма-изготовитель, номер аптеки, количество упаковок, стоимость одной упаковки. Получить список аптек, в которых можно купить N упаковок заданного лекарства, включив все имеющиеся сведения о лекарстве. Список вывести в порядке возрастания цены за упаковку.
Фирма реализует изделия клиентам. Имеются следующие данные о продажах: изделие, цена, клиент, количество, дата продажи. Для заданного изделия вывести сведения о продажах его клиентам в порядке убывания количества проданных изделий.
В библиотеке хранится информация о наличии книг. Имеются следующие данные о каждой книге: инвентарный номер, фамилии авторов, название книги, год издания, количество страниц, цена. Вывести список книг самого раннего года издания в алфавитном порядке авторов и определить общую стоимость этих книг.
В справочной автовокзала хранится расписание движения автобусов. Для каждого рейса указаны его номер, тип автобуса, пункт назначения, время отправления и прибытия. Вывести информацию о рейсах, которыми можно воспользоваться для прибытия в заданный пункт назначения раньше заданного времени в порядке убывания времени прибытия.
На междугородней АТС информация о разговорах содержит дату разговора, код и название города, время разговора, тариф, номер телефона в этом городе и номер телефона абонента. Вывести все данные с расчетом стоимости разговора в порядке возрастания даты разговора и общую стоимость всех разговоров, а так же вывести сведения о самом коротком разговоре.
Информация о сотрудниках фирмы включает: Ф.И.О., табельный номер, количество отработанных часов за месяц, почасовый тариф. Рабочее время свыше 144 часов считается сверхурочным и оплачивается в двойном размере. Подсчитать размер заработной платы каждого сотрудника фирмы за вычетом подоходного налога, который составляет 12% от суммы заработка. Вывести ведомость в алфавитном порядке фамилий сотрудников.
Информация об участниках спортивных соревнований содержит: наименование страны, название команды, Ф.И.О. игрока, игровой номер, возраст, рост, вес. Вывести информацию о самом молодом участнике, а так же список участников, рост которых больше двух метров.
Для книг, хранящихся в библиотеке, задаются: регистрационный номер книги, автор, название, год издания, издательство, количество страниц. Сформировать указанный список и вывести в алфавитном порядке названий, а также вывести список книг, изданных за последние 4 года.
Различные цеха завода выпускают продукцию нескольких наименований. Сведения о выпушенной продукции включают: наименование, количество, номер цеха. Вывести информацию по всем цехам в порядке возрастания номера цеха, а также вывести информацию об изделиях, выпуск которых составил 1 000 и более единиц.
Информация о сотрудниках предприятия содержит: Ф.И.О., номер отдела, должность, дату начала работы. Вывести списки сотрудников по отделам, а также список сотрудников, поступивших на работу в текущем году.
Ведомость абитуриентов, сдавших вступительные экзамены в университет, содержит: Ф.И.О., адрес, оценки по 4-м дисциплинам. Определить количество абитуриентов; проживающих в г. Минске и сдавших экзамены со средним баллом не ниже 7,5, вывести всю информацию об этих студентах.
В справочной аэропорта хранится расписание вылета самолетов на следующие сутки. Для каждого рейса указаны: номер рейса, тип самолета, пункт назначения, время вылета. Вывести все номера рейсов, типы самолетов и времена вылета для заданного пункта назначения в порядке возрастания времени вылета.
У администратора железнодорожных касс хранится информация о свободных местах в поездах дальнего следования на ближайшую неделю в следующем виде: номер поезда, дата выезда, время отправления, пункт назначения, число свободных мест. Оргкомитет международной конференции обращается к администратору с просьбой зарезервировать 12 мест до города N на к-й день недели. Вывести список вариантов или сообщение о невозможности выполнить заказ в полном объеме.
Ведомость абитуриентов, сдавших вступительные экзамены в университет, содержит Ф.И.О. абитуриента, оценки по трем дисциплинам. Определить средний балл по университету и вывести список абитуриентов, средний балл которых выше среднего балла по университету в порядке убывания среднего балла.
В радиоателье хранятся квитанции о сданной в ремонт радиоаппаратуре. Каждая квитанция содержит следующую информацию: наименование группы изделий (телевизор, радиоприемник и т. п.), марка изделия, дата приемки в ремонт, состояние готовности заказа (выполнен, не выполнен). Вывести информацию о состоянии заказов по группам изделий. Вывести список выполненных заказов.
Разработать программу формирования ведомости об успеваемости студентов. Каждая запись этой ведомости должна содержать: номер группы, Ф.И.О. студента, оценки за последнюю сессию (4 дисциплины) средний балл. Вывести списки по группам. Подсчитать средний балл по университету.
В исполкоме формируется список учета нуждающихся в улучшении жилищных условий. Каждая запись этого списка содержит: порядковый номер, Ф.И.О., величину жилплощади на одного члена семьи и дату постановки на очередь. Вывести список очередников, ставших на очередь раньше всех остальных (в самом первом году) по возрастанию величины жилплощади на каждого члена семьи.
Имеется список женихов и список невест. Каждая запись списка содержит пол, имя, возраст, рост, вес, а также требования к партнеру: наименьший и наибольший возраст, наименьший и наибольший вес, наименьший и наибольший рост. Для первого в списке (по алфавиту имени) жениха составить список возможных невест.
В библиотеке имеется список книг. Каждая запись этого списка содержит: фамилии авторов, название книги, год издания. Вывести информацию о книгах, заданного автора, изданных в текущем году в алфавитном порядке наименований.
В магазине имеется список поступивших в продажу автомобилей. Каждая запись этого списка содержит: марку автомобиля, стоимость, расход топлива на 100 км, надежность (число лет безотказной работы), комфортность (отличная, хорошая, удовлетворительная). Вывести перечень автомобилей, удовлетворяющих требованиям покупателя, которые вводятся с клавиатуры в виде некоторого интервала допустимых значений.
Каждая запись списка вакантных рабочих мест содержит: наименование организации, расстояние (в км. от центра города), должность, квалификацию (разряд или образование), стаж работы по специальности, заработную плату, наличие социального страхования (да/нет), продолжительность ежегодного оплачиваемого отпуска. Вынести список рабочих мест в соответствии с требованиями клиента.
Для определения потребности в горючем техническая служба запрашивает расписание полетов. Каждая запись расписания содержит следующую информацию: Дату вылета, номер рейса, пункт назначения, дальность полета, расход горючего на 1 000 км пути. Вывести суммарное количество горючего, необходимое дли обеспечения полетов на следующие сутки.
Для участия в конкурсе на замещение вакантной должности сотрудника фирмы желающие подают следующую информацию: Ф.И.О., год рождения, образование (среднее, специальное, высшее), знание иностранных языков (английский, немецкий, французский), владение компьютером (MSDOS, Windows), стаж работы, наличие рекомендаций. Вывести список претендентов в соответствии с требованиями руководства фирмы.
При постановке на учет в ГАИ автолюбители указывают следующие данные: марка автомобиля, год выпуска, номер двигателя, номер кузова, цвет, номерной знак, Ф.И.О и адрес владельца. Вывести список автомобилей, проходящих техосмотр в текущем году, сгруппированных по маркам автомобилей. Учесть, что если текущий год четный, техосмотр проходят автомобили с четными номерами двигателей, иначе – с нечетными номерами.
Для участия в конкурсе исполнителей необходимо заполнить следующую анкету: Ф.И.О., год рождения, название страны, класс музыкального инструмента (гитара, фортепиано, скрипка, виолончель). Вывести список самых молодых лауреатов конкурса по классам инструментов в порядке занятых мест.
Список группы студентов содержит следующую информацию: Ф.И.О., рост и вес. Вывести Ф.И.О. студентов, рост и вес которых совпадает с наименьшим.
Список группы студентов содержит следующую информацию: Ф.И.О., рост и вес. Вывести Ф.И.О. студентов в алфавитном порядке фамилий, рост и вес которых превышает заданные величины.
Лабораторная работа № 9. ПРОГРАМИРОВАНИЕ С ИСПОЛЬЗОВАНИЕМ ФАЙЛОВ

Цель работы: изучить процесс организации и обработки файлов в языке Object Pascal, освоить применение компонентов OpenDialog и SaveDialog.
9.1. Краткие теоретические сведения
Для организации данных на внешнем носителе используются файлы. Файл – это поименованная совокупность логически связанных данных, хранящихся на запоминающем устройстве компьютера.
Object Pascal располагает средствами создания и обработки файлов различных типов. Для того чтобы получить доступ к файлу, нужно иметь возможность связать созданное в Delphi приложение с некоторым файлом для чтения или записи информации. Эта связь создается при помощи переменных файлового типа - файловых переменных.
В Object Pascal существует три файловых типа:
TextFile – текстовый файл, представляющий собой набор символьных строк переменной длины;
File of <тип> – типизированный файл, представляющий собой набор данных указанного типа;
File – нетипизированный файл, представляющий собой набор неструктурированных данных.
Рассмотрим некоторые приемы работы с типизированными файлами.
Перед использованием файловой переменной она должна быть связана с внешним файлом с помощью вызова процедуры AssignFile:
AssignFile (<файловая переменная>, <имя файла>);
Здесь <файловая переменная> – имя переменной, объявленной в программе как переменная файлового типа;
<имя файла> – символьная строка, содержащая имя файла.
Если файл располагается не в одной папке с программой, то необходимо указать полный путь к файлу.
Когда связь с внешним файлом установлена, его можно открыть для ввода или вывода данных с помощью процедуры Reset:
Reset (<имя файла>);
Эта процедура открывает существующий внешний файл, имя которого было связано с файловой переменной.
Новый файл можно создать и открыть для записи с помощью процедуры Rewrite:
Rewrite(<файловая переменная>);
Последовательный доступ к записям файла осуществляется с помощью процедур Read и Write.
Read (<файловая переменная>, список ввода) чтение записи файла.
Write (<файловая переменная>, список вывода) вывод записи в файл.
Список ввода и список вывода должны иметь данные того же типа, что и компоненты файла.
Прямой доступ к типизированным файлам можно организовать с помощью стандартной процедуры Seek, которая перемещает указатель файла к заданному элементу. Для определения текущей записи в файле и текущего размера файла используются стандартные функции FilePos и FileSize.
Procedure Seek (var F; N; Longint); перемещает текущую позицию в типизированном файле, связанном с файловой переменной F к компоненту с номером N. Нумерация компонентов в файле начинается с 0.
function FilePos (var F): Longint; Возвращает номер текущего компонента в файле, связанном с файловой переменной F.
function FileSize (var F): Integer; Возвращает количество компонентов в файле, связанном с файловой переменной F.
По завершении обработки файла он должен закрываться с помощью стандартной процедуры CloseFile.
CloseFile (<файловая переменная>);
При закрытии файла обеспечивается сохранение в файле всех новых записей и регистрация файла в папке. Процедура CloseFile не разрывает связь файла с файловой переменной, поэтому файл можно открывать снова без повторного использования процедуры AssignFile.
9.2. Пример создания приложения
Задание. Создать Windows-приложение для формирования списка очередности предоставления мест в общежитии. Общежитие в первую очередь предоставляется тем студентам, у которых доход на одного члена семьи меньше минимальной зарплаты (в порядке возрастания дохода на одного члена семьи), затем – остальным студентам в порядке убывания среднего балла. Исходные данные, которые следует организовать в виде файла, должны содержать фамилию и инициалы студента, доход на одного члена семьи и четыре оценки, полученные на экзаменах последней сессии. Создать текстовый файл исходных данных.
9.2.1. Указания по созданию приложения
Для нового проекта создайте новую папку, например X:\35эи\ lab9.
Сохраните проект File | Save Project As (Файл | Сохранить Проект как). Далее сохраните модуль под именем UnFile, а файл проекта – под именем PrFile.
9.2.2.Размещение компонентов по Форме.
Один из возможных вариантов панели интерфейса создаваемого приложения показан на рисунке 9.1.

Рис. 9.1. Размещение компонентов на форме
При работе с файлами чтение и запись информации удобно организовывать с помощью компонентов OpenDialog и SaveDialog.
Компоненты OpenDialog и SaveDialog находятся на странице Dialogs. Все компоненты этой страницы являются не визуальными, т. е. не видны в момент выполнения приложения. Поэтому их можно разместить в любом удобном месте Формы. Оба рассматриваемых компонента имеют идентичные свойства и отличаются только внешним видом.
Для установки компонентов OpenDialog и SaveDialog на Форму необходимо на странице Dialogs Палитры Компонентов щелкнуть “мышью” соответственно по пиктограмме или и поместить ее в любом свободном месте Формы. При выполнении приложения в момент вызова компонента появляется диалоговое окно, с помощью которого пользователь выбирает имя файла и маршрут к нему. В случае успешного завершения диалога имя выбранного файла и маршрут поиска содержится в свойстве FileName.
Пользователь имеет возможность настроить параметры окна диалога по своему усмотрению. В частности, изменить заголовок окна можно с помощью свойства Title. В свойстве DefaultExt можно указать расширение файла, если оно не задано пользователем. Свойство Filter используется для поиска (фильтрации) файлов, отображенных в окне. Установка фильтра производится следующим образом. Выделив соответствующий компонент, необходимо дважды щелкнуть по правой (белой) части свойства Filter Инспектора Объектов. В появившемся окне редактора фильтра – Filter Editor необходимо в колонке Filter Name набрать текст, характеризующий соответственный фильтр, а в колонке Filter – маску. Для компонента OpenDialog1 установим значение масок, как показано на рис. 9.2.

Рис. 9.2. Окно редактора фильтра
Маска *.dat означает, что будут видны файлы данных с любым именем и с расширением dat, а маска *.* – что будут видны все файлы (с любым именем и с любым расширением).
Для того, чтобы файл автоматически записывался с расширением dat в свойстве DefaultExt, запишем требуемое расширение – .dat.
Аналогичным образом настроим компонент SaveDialog1 для текстового файла (расширение .txt).
Кроме того на форме размещаются три компонента StringGrid. Первый предназначен для ввода, корректировки, добавления, удаления, просмотра исходной информации, второй – для вывода списка первоочередников в порядке возрастания дохода на одного члена семьи, третий – для вывода списка второй очереди в порядке убывания среднего балла. Следует разрешить ввод данных в компоненты StringGrid, установив в True значение опции goEditing свойства +Options.
Три компонента BitBtn (переносятся со страницы Additional палитры компонентов) предназначены для обработки файлов: первый – для сохранения файла на внешний носитель, второй – для открытия файла, третий – для создания текстового файла.
Для удобства работы с несколькими различными процедурами обработки событий в свойстве Name каждого компонента BitBtn заменить программные имена кнопок: BitBtn1-на BitBtnNew, BitBtn2-на BitBtnOpen, BitBtn3-на BitBtnSave. В свойстве Caption каждого компонента ввести надпись, указывающую выполняемую процедуру.
Кроме того на форму наносятся три кнопки, выполняюшие процедуры: сортировки записей, вывод списка первоочередников и создание списка второй очереди. В свойстве Caption каждого из этих компонентов также ввести надпись, указывающую выполняемую процедуру.
Для ввода минимальной зарплаты размешается компонент Edit. Компонент SpinEdit предназначен для изменения количества записей исходной информации и переносится со страницы Samples.

9.2.3.Создание процедур обработки событий
Двойным нажатием клавиши “мыши” в свободном поле формы откроем процедуру обработки события FormCreate и введем текст процедуры.
Процедуры обработки событий нажатия кнопок создаются так же, как в предыдущих работах, вывод этих процедур на экран осуществляется двойным щелчком по компонентам. Процедура обработки события SpinEditChange выводится двойным щелчком по компоненту SpinEdit.
Пользуясь текстом модуля UnFile, внимательно наберите операторы этих процедур.

9.2.4. Текст модуля UnFile
Unit UnFile;
interf
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·declarations }
end;

var
Form1: TForm1;

implementation
{$R *.dfm}
type
zap=record //объявление записи
fio : string[20];
dohod: integer;
mat,soch,english,inf: integer;
end;
zap1=record //объявление записи
fio : string[20];
dohod: integer;
mat,soch,english,inf: integer;
srball: extended;
end;
var
MZap,MZap2: array[1..10] of zap; / /объявление массива записей
MZap1: array[1..10] of zap1;
FileZap: file of zap; // объявление типизированного файла
FileText: TextFile; // объявление текстового файла
FileNameZap,FileNameText: string; // имена файлов
n,k: integer; // n – текущее количество элементов исходных записей;
// к – количество элементов списка второй очереди
{ Обработчик события создания формы}
procedure TForm1.FormCreate(Sender: TObject);
begin
Edit1.Text:='22'; // начальное значение поля минимальной зарплаты
SpinEdit1.Text:='9'; // начальное значение для количества записей
n:=9;
with StringGrid1 do
begin
Cells[0,0]:='Фамилия,инициалы';
Cells[1,0]:='Доход';
Cells[2,0]:='Математика';
Cells[3,0]:='Социология';
Cells[4,0]:='Английский';
Cells[5,0]:='Информатика';
end;
with StringGrid2 do
begin
Cells[0,0]:='Фамилия,инициалы';
Cells[1,0]:='Доход';
Cells[2,0]:='Математика';
Cells[3,0]:='Социология';
Cells[4,0]:='Английский';
Cells[5,0]:='Информатика';
end;
with StringGrid3 do
begin
Cells[0,0]:='Фамилия,инициалы';
Cells[1,0]:='Доход';
Cells[2,0]:='Математика';
Cells[3,0]:='Социология';
Cells[4,0]:='Английский';
Cells[5,0]:='Информатика';
Cells[6,0]:='Средний балл';
end;
BitBtnSave.Hide; // Спрятать кнопку "Создать текстовый файл"
end;

{ Сохранение файла}
procedure TForm1.BitBtnNewClick(Sender: TObject);
var
i:integer;
begin
if MessageDlg('Содержимое существующего файла будет уничтожено.Вы уверены?',mtConfirmation,mbYesNoCancel,0)=mrYes then
begin
for i:=1 to n do
with StringGrid1,MZap[i] do
begin
fio:=Cells[0,i];
dohod:=StrToInt (Cells[1,i]);
mat:=StrToInt(Cells[2,i]);
soch:=StrToInt(Cells[3,i]);
english:=StrToInt(Cells[4,i]);
inf:=StrToInt(Cells[5,i]);
end;
with OpenDialog1 do
begin
Title:='Создание файла';
if Execute then
begin
FileNameZap:=FileName;
AssignFile(FileZap,FileNameZap);
ReWrite(FileZap);
for i:=1 to n do
write(FileZap,MZap[i]);
CloseFile(FileZap);
end;
end;
end;
end;

{Открытие файла}
procedure TForm1.BitBtnOpenClick(Sender: TObject);
var
i:integer;
begin
with OpenDialog1 do
begin
Title:='Открытие файла'; // заголовок окна диалога
if Execute then // выполнение стандартного диалога выбора имени файла
begin
FileNameZap:=FileName; // присваивание имени файла
AssignFile(FileZap,FileNameZap);
ReSet(FileZap); // открыть файл для чтения
n:=0;
while not EoF(FileZap) do
begin
n:=n+1; // расчет количества записей в файле
read(FileZap,MZap[n]); // чтение записей файла в массив записей
end;

·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·закрытие файла
end;
end;
BitBtnSave.Show; // показать кнопку “Сохранить текстовый файл”
end;
{запись текстового файла}
procedure TForm1.BitBtnSaveClick(Sender: TObject);
Var
i:integer;
begin
with SaveDialog1 do
if Execute then //выполнение стандартного диалога выбора имени файла
begin
FileNameText:=FileName;//присваивание имени файла
AssignFile(FileText,FileNameText);//назначить файлу FileText имя
//FileNameText
ReWrite(FileText); //открыть текстовый файл на запись
for i:=1 to n do
with MZap[i] do //запись в текстовый файл
writeln(FileText,i:3,fio:20,mat:5,english:5,soch:5,inf:5);
CloseFile(FileText); //закрытие текстового файла по окончании записи
end;
end;

{Сортировка исходных записей по возрастанию дохода на одного члена семьи}
procedure TForm1.Button1Click(Sender: TObject);
var
i,j:integer;
vper:zap;
begin
for i:=1 to n do // пересылка данных в массив записей
with StringGrid1,MZap[i] do
begin
fio:=Cells[0,i];
dohod:=StrToInt(Cells[1,i]);
mat:=StrToInt(Cells[2,i]);
soch:=StrToInt(Cells[3,i]);
english:=StrToInt(Cells[4,i]);
inf:=StrToInt(Cells[5,i]);
end;
for i:=2 to n do // сортировка методом пузырька
for j:=n downto i do
if MZap[j-1].dohod>MZap[j].dohod then
begin
vper:=MZap[j-1];
MZap[j-1]:=MZap[j];
MZap[j]:=vper;
end;
for i:=1 to n do // Пересылка рассортированных данных из массива
// записей в StringGrid1
with stringgrid1,mzap[i] do
begin
Cells[0,i]:=fio;
Cells[1,i]:=IntToStr(dohod);
Cells[2,i]:=IntToStr(mat);
Cells[3,i]:=IntToStr(soch);
Cells[4,i]:=IntToStr(english);
Cells[5,i]:=IntToStr(inf);
end;
end;
{ Вывод списка первоочередников в StringGrid2, а всех остальных записей в массив Mzap1}
procedure TForm1.Button2Click(Sender: TObject);
var
i,j,m: integer;
dd: integer;
begin
dd:=StrToInt(Edit1.Text); // ввод значения минимальной зарплаты в
//переменную dd
for i:=1 to n do
with StringGrid2 do // очистка StringGrid2
begin
Cells[0,i]:='';
Cells[1,i]:='';
Cells[2,i]:='';
Cells[3,i]:='';
Cells[4,i]:='';
Cells[5,i]:='';
end;
for i:=1 to n do
with StringGrid1,MZap[i] do // ввод данных в массив записей
begin
fio:=Cells[0,i];
dohod:=StrToInt (Cells[1,i]);
mat:=StrToInt(Cells[2,i]);
soch:=StrToInt(Cells[3,i]);
english:=StrToInt(Cells[4,i]);
inf:=StrToInt(Cells[5,i]);
end;
m:=0;
j:=0;k:=0;
for i:=1 to n do
begin
with StringGrid2,MZap[i] do
if dohod<=dd then // выбор списка первой очереди
begin
j:=j+1;
Cells[0,j]:=fio;
Cells[1,j]:=IntToStr(dohod);
Cells[2,j]:=IntToStr(mat);
Cells[3,j]:=IntToStr(soch);
Cells[4,j]:=IntToStr(english);
Cells[5,j]:=IntToStr(inf);
end
else
begin
k:=k+1; // выбор списка второй очереди в массив MZap1
MZap1[k].fio:=MZap[i].fio;
MZap1[k].dohod:=MZap[i].dohod;
MZap1[k].mat:=MZap[i].mat;
MZap1[k].soch:=MZap[i].soch;
MZap1[k].english:=MZap[i].english;
MZap1[k].inf:=MZap[i].inf;
MZap1[k].srball:=(MZap[i].mat+MZap[i].soch+MZap[i].english+MZap[i].inf)/4
end;
end;
end;
{сортировка списка второй очереди методом "пузырька" по убыванию среднего балла и вывод в StringGrid3}
procedure TForm1.Button3Click(Sender: TObject);
Var
i,j:integer;
vper:Zap1;

·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·ntToStr(inf);
Cells[6,i]:=FloatToStrF(srball,ffFixed,2,1);
end;
end;
{ Изменение количества исходных записей}
procedure TForm1.SpinEdit1Change(Sender: TObject); var
i,m:integer;
begin
m:=StrToInt(SpinEdit1.Text);
With StringGrid1 do
begi
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
· if m>n then
for i:=n+1 to m do
begin
Cells[0,i]:='';
Cells[1,i]:='';
Cells[2,i]:='';
Cells[3,i]:='';
Cells[4,i]:='';
Cells[5,i]:='';
end;
end;
n:=m;
end;
end.
9.2.5. Работа с приложением
Выполните созданное приложение. Занесите в соответствующе поля компонента StringGrid1 исходную информацию. Кнопкой «Сохранить файл» сохраните данные в файле. Завершите выполнение приложения.
Вновь запустите приложение кнопкой «Открыть файл» откройте только что созданный файл. Убедитесь, что информация не содержит ошибок. При необходимости обнаруженные ошибки можно исправить, а также дополнить ведомость новой информацией и снова нажать кнопку «Сохранить файл».
Для сортировки ведомости в порядке возрастания дохода на члена семьи воспользуйтесь кнопкой «Сортировка» и сохраните отсортированную информацию в текстовый файл (кнопкой «Сохранить текстовый файл»). Далее выведите список первоочередников и список второй очереди, воспользовавшись соответствующими кнопками.
Еще раз завершите и вновь запустите приложения.
Кнопкой «Открыть файл» откройте файл и убедитесь, что в нем теперь содержится ведомость, отсортированная в порядке возрастания дохода на члена семьи. Кнопкой «Создать текстовый файл» сохраните информацию в текстовом файле. Для просмотра содержимого текстового файла воспользуйтесь, например, приложением «Microsoft Word».
Используя все управляющие компоненты панели, убедитесь в правильном функционировании приложения во всех предусмотренных режимах работы.
9.3. Выполнение индивидуального задания
По указанию преподавателя выберете свое индивидуальное задание. Создайте приложение и протестируйте его работу
Во всех заданиях предусмотреть сохранение вводимых данных в файле и возможность чтения из ранее созданного файла. Создать текстовый файл исходных данных.
Индивидуальные задания
Ведомость абитуриентов, сдавших вступительные экзамены в университет, содержит: Ф.И.О. абитуриента, оценки по трем дисциплинам. Определить средний балл каждого абитуриента, средний балл по университету и вывести список абитуриентов, средний балл которых выше среднего балла по университету в порядке убывания среднего балла.
В радиоателье хранятся квитанции о сданной в ремонт радиоаппаратуре. Каждая квитанция содержит следующую информацию: наименование группы изделий (телевизор, радиоприемник и ч. п.), марка изделия, дата приемки в ремонт, состояние готовности заказа (выполнен, не выполнен). Вывести информацию о состоянии заказов по отдельной, введенной с клавиатуры группе в порядке возрастания даты приемки в ремонт.
У администратора железнодорожных касс хранится информация о свободных местах в поездах дальнего следования на ближайшую неделю в следующем виде: дата выезда, пункт назначения, время отправления, число свободных мест. Оргкомитет международной конференции обращается к администратору с просьбой зарезервировать места до города N на некоторую дату с временем отправления поезда не позднее t часов вечера. Вывести информацию о наличии свободных мест или сообщение о невозможности выполнить заказ. Название города, дата и самое позднее время отправления вводятся с клавиатуры.
Разработать программу формирования ведомости об успеваемости студентов. Каждая запись этой ведомости должна содержать: номер группы, Ф.И.О. студента, оценки за последнюю сессию. Подсчитать средний балл каждого студента. Вынести список успевающих студентов (не имеющих ни одной двойки) по группам. В каждой группе Ф.И.О. студентов должны быть расположены в порядке убывания среднего балла.
В справочной аэропорта хранится расписание вылета самолетов на следующие сутки. Для каждого рейса указаны: номер рейса, тип самолета, пункт назначения, время вылета. Вывести все номера рейсов, типы самолетов и времена вылета для заданного пункта назначения в порядке возрастания времени вылета.
В исполкоме формируется список учета нуждающихся в улучшении жилищных условий. Каждая запись этого списка содержит, порядковый номер, Ф.И.О., величину жилплощади на одного члена семьи и дату постановки на учет. По заданному количеству квартир, выделенных по данному списку в течение года, вывести список претендентов, если известно, что квартиры выделяются в порядке возрастания даты постановки на очередь тем семьям, у которых на одного члена семьи приходится менее заданного количества метров.
Ведомость абитуриентов, сдавших вступительные экзамены в университет, содержит: Ф.И.О., адрес, оценки по трем дисциплинам. Определить количество абитуриентов, проживающих в г. Минске и сдавших экзамены со средним баллом не ниже 4.5, вывести их фамилии в алфавитном порядке.
Имеется список женихов и невест. Каждая запись списка содержит пол, имя, возраст, рост, вес, а также требования к партнеру: наименьший и наибольший возраст, наименьший и наибольший вес, наименьший и наибольший рост. Для первых трех девушек (в алфавитном порядке имен) вывести списки претендентов.
Различные цеха завода выпускают продукцию нескольких наименований. Сведения о выпущенной продукции включают: наименование, количество, номер цеха. Для заданного цеха необходимо вывести количество выпущенных изделий по каждому наименованию в порядке убывания количества.
Информация о сотрудниках предприятия содержит: Ф.И.О., номер отдела, должность, дату начала работы. Вывести списки сотрудников заданного отдела в порядке убывания стажа.
Информация о сотрудниках фирмы включает: Ф.И.О., табельный номер, количество проработанных часов за месяц, почасовый тариф. Рабочее время свыше 144 часов считается сверхурочным и оплачивается в двойном размере. Вывести размер заработной платы каждого сотрудника фирмы за вычетом подоходного налога, который составляет 12% от суммы заработка
Информация о сотрудниках предприятия содержит: Ф.И.О., номер отдела, должность, дату начала работы. Вывести списки сотрудников заданного отдела в порядке убывания стажа.
В магазине имеется список поступивших в продажу автомобилей. Каждая запись этого списка содержит: марку автомобиля, стоимость, расход топлива на 100 км, надежность (число лет безотказной работы), комфортность (отличная, хорошая, удовлетворительная). Вывести перечень автомобилей, удовлетворяющих требованиям покупателя, которые вводятся с клавиатуры в виде некоторого интервала допустимых значений.
Для книг, хранящихся в библиотеке, задаются: регистрационный номер книги, автор, название, год издания, издательство, количество страниц. Вывести список книг с фамилиями авторов в алфавитном порядке, изданных после заданного года.
На междугородной АТС информация о разговорах содержит дату разговора, код и название города, время разговора, тариф, номер телефона в этом городе и номер телефона абонента. Вывести по заданному городу все разговоры с подсчетом стоимости в порядке убывания даты, а так же общее время разговоров и общую стоимость.
Информация об участниках спортивных соревнований содержи; наименование страны, название команды, Ф.И.О. игрока, игровой номер, возраст, рост, вес. Вывести информацию о самом молодом, рослом и легком игроке заданной команды.
Для участия в конкурсе на замещение вакантной должности сотрудника фирмы желающие подают следующую информацию: Ф.И.О, год рождения, образование (среднее, специальное, высшее), знание иностранных языков (английский, немецкий, французский, владею свободно, читаю и перевожу со словарем), владение компьютером (MSDOS, Windows), стаж работы, наличие рекомендаций. Вывести список претендентов в соответствии с требованиями руководства фирмы.
В технической службе аэропорта имеется справочник, содержащий записи следующей структуры: тип самолета, год выпуска, расход горючего на 1 000 км. Для определения потребности в горючем техническая служба запрашивает расписание полетов. Каждая запись расписания содержит следующую информацию: номер рейса, пункт назначения, дальность полета. Вывести суммарное количество горючего, необходимое для обеспечения полетов на следующие сутки, если известно, что в полетах будут только самолеты заданного типа и заданного года выпуска.
В библиотеке имеется список книг. Каждая запись этого списка содержит: фамилии авторов, название книги, год издания. Вывести информацию о книгах, в названии которых встречается некоторое ключевое слово (ввести с клавиатуры).
Каждая запись списка вакантных рабочих мест содержит: наименование организации, расстояние в км от центра города, должность, продолжительность ежегодного оплачиваемого отпуска. Вывести список рабочих мест в соответствии с требованиями клиента.
При постановке на учет в ГАИ автолюбители указывают следующие данные: марка автомобиля, год выпуска, номер двигателя, номер кузова, цвет, номерной знак, Ф.И.О и адрес владельца. Вывести список автомобилей, проходящих техосмотр в текущем году, сгруппированных по маркам автомобилей. Учесть, что если текущий год четный, техосмотр проходят автомобили с четными номерами двигателей, иначе – с нечетными номерами.
В справочной автовокзала хранится расписание движения автобусов. Для каждого рейса указаны его номер, тип автобуса, пункт назначения, время отправления и прибытия. Вывести информацию о рейсах, которыми можно воспользоваться для прибытия в заданный пункт назначения раньше заданного времени в порядке убывания времени прибытия.
Для участия в конкурсе исполнителей необходимо заполнить следующую анкету: Ф.И.О., год рождения, название страны, класс музыкального инструмента (гитара, фортепиано, скрипка, виолончель). Вывести список самых молодых (моложе заданного возраста) лауреатов конкурса по классам инструментов в порядке занятых мест.
Для получения места в общежитии формируется список студентов, который включает Ф.И.О. студента, группу, средний балл, доход на одною члена семьи. Общежитие в первую очередь предоставляется успевающим студентам (не имеющим ни одной двойки) в порядке уменьшения среднего балла. Вывести список очередности предоставления мест в общежитии.
Список группы студентов содержит следующую информацию: Ф.И.О.. рост и вес. Вывести в алфавитном порядке Ф.И.О. студентов, рост и вес которых чаще всего встречаются в списке.
Список товаров, имеющихся на складе, включает в себя наименование товара, количество единиц товара, цену единицы и дату поступления товара на склад. Вывести в алфавитном порядке список товаров, хранящихся больше месяца, стоимость которых превышает 10 000 руб., а также общую стоимость всех этих товаров.
Список группы студентов содержит следующую информацию: Ф.И.О., рост и вес. Вывести Ф.И.О. студентов, рост и вес которых являются в списке уникальными,
В магазине формируется список лиц, записавшихся на покупку товара повышенного спроса. Каждая запись этого списка содержит: порядковый номер, Ф.И.О., домашний адрес покупателя и дату постановки на учет. Удалить из списка все повторные записи, проверяя Ф.И.О. и домашний адрес.
Разработать приложение, которое формирует файл F1, содержащий целые числа, и переписывает этот файл в другой файл – F2, помещая в него из F1 только положительные числа.
Разработать приложение, переписывающее в текстовый файл Т2 содержимое текстового файла Т1, но без строк, содержащих цифры.
Разработать приложение для слияния двух отсортированных по убыванию значения некоторого элемента файлов F1 и F2. Результатом слияния должен быть файл F3, элементы которого упорядочены по возрастанию. Все файлы имеют одинаковую структуру записи.
Лабораторная работа № 10. ПРОГРАММИРОВАНИЕ
С ИСПОЛЬЗОВАНИЕМ ФУНКЦИЙ И ПРОЦЕДУР.
ПРОЦЕДУРНЫЕ ТИПЫ. СОЗДАНИЕ МОДУЛЕЙ

Цель работы: освоить методику создания модулей, содержащих процедуры и функции.
10.1. Краткие теоретические сведения
10.1.1. Объявление и описание функций и процедур
Процедуры и функции представляют собой программные блоки, которые могут вызываться из разных частей программы. При вызове в них передаются некоторые переменные, константы, выражения, являющиеся аргументами, которые в самих процедурах и функциях воспринимаются как формальные параметры. При этом функции возвращают значение определенного типа, которое замещает в вызвавшем выражении имя вызванной функции.
Например, оператор
R := 5·F(x);
вызывает функцию F с аргументом X, умножает возвращенное ею значение на 5 и присваивает результат переменной R.
Допускается также вызов функции, не использующий возвращаемого ею значения. Например:
F(x);
В этом случае возвращаемое функцией значение игнорируется.
Функция описывается следующим образом:
function <имя функции> (<список параметров>):
<тип возвращаемого значения>;
<объявление локальных переменных, типов, констант,
описание вложенных функций и процедур>
begin
<операторы тела функции>
end;
Первая строка, содержащая имя функции, список параметров и тип возвращаемого значения, называется заголовком или объявлением функции. Если функция, описываемая в данном модуле, должна быть доступна из других модулей, то эта первая строка должна быть продублирована в разделе interface в качестве объявления функции. Аналогичным дублированием первой строки объявляется функция в классе.
Список параметров и объявления локальных элементов и вложенных процедур не обязательны. Если список параметров отсутствует, то скобки после имени функции не ставятся.
Формы описания списка параметров будут рассмотрены позднее. В простом случае это список имен формальных параметров с указанием их типов. Например, объявление:
function FSum(X1, X2: real; A: integer): real;
объявляет функцию с именем FSum, с тремя параметрами X1, Х2 и А, из которых первые два типа геа1, а последний – integer. Тип возвращаемого результата – геаl. Имена параметров X1, Х2 и А – локальные, т.е. они имеют значение только внутри данной функции и никак не связаны с именами аргументов, переданных при вызове функции. Значения этих параметров в начале выполнения функции равны значениям аргументов на момент вызова функции.
Тело функции пишется по тем же правилам, что и любой код программы. При этом надо учитывать области видимости различных элементов программы. В теле функции видны объявленные в ней локальные элементы (переменные, функции и т.п.) и глобальные элементы.
Возвращаемое значение в теле функции может присваиваться или имени функции, или специальной предопределенной переменной Result. Например, тело приведенной выше функции FSum может иметь вид:
begin
FSum := A*(X1+X2);
end;
или
begin
Result := A*(X1+X2);
end;
Результат работы обеих приведенных выше функций будет одинаковым. Но переменная Result имеет одно принципиальное отличие от имени функции. Имя функции – это не переменная. Оно может фигурировать только в левой части оператора присваивания и не может входить ни в какие выражения. А Result – это обычная переменная. Поэтому, например, приведенный выше код можно было бы переписать следующим образом:
begin
Result := X1+X2;
Result := Result*A;
end;
С именем функции это сделать невозможно, так как оно не может встречаться в правой части оператора присваивания.
В Object Pascal существует процедура Exit, которая обеспечивает выход из функции или процедуры в любом месте тела программы. Например, приведенный выше текст мог бы быть записан так:
begin
Result := X1+X2;
if (A=1) then exit;
Result := Result*A;
end;
Объявление процедуры практически ничем не отличается от объявления функции, кроме того, что для процедуры не указывается возвращаемое значение:
procedure <имя процедуры> (<список параметров>);
<объявления локальных переменных, типов, констант, описания вложенных функций и процедур>
begin
<операторы тела процедуры>
end;
Например:
procedure Pr1(S: string);
Form1.Label1.Caption := s;
end;
Вызов этой процедуры может иметь вид:
Pr1 (' Привет ! ');
При передаче в функции и процедуры в качестве параметров коротких строк не допускается включение в объявление спецификации длины строки. Например, объявление:
procedure Check(S: string[2]);
вызовет при компиляции сообщение об ошибке. Но можно включать в объявление тип короткой строки, описанный заранее:
type TString2 = string[2];
procedure Check(S:TSstring2);
10.1.2. Различные варианты передачи параметров в функции и процедуры
Список параметров, передаваемый в процедуры и функции, состоит из имен параметров и указаний на их тип. Например, в объявлении
procedure Pr(X1, X2: real; A: integer);
указано три параметра X1, Х2, А и определены их типы. Вызов такой процедуры может иметь вид:
Pr(Y, X2, 5);
Это только один из способов передачи параметров в процедуру, называемый передачей по значению. Работает он так. В момент вызова функции в памяти создаются временные переменные с именами X1, Х2, А и в них копируются значения аргументов Y, Х2 и константы 5. На этом связь между аргументами и переменными X1, Х2, А разрывается. Вы можете изменять внутри процедуры значения X1, Х2 и А, но это никак не отразится на значениях аргументов. Аргументы при этом надежно защищены от непреднамеренного изменения своих значений вызванной процедурой или функцией.
К недостаткам такой передачи параметров по значению относятся затраты времени на копирование значений и затраты памяти для хранения копии.
Еще одним недостатком передачи параметров по значению является невозможность из функций и процедур изменять значения некоторых аргументов, что во многих случаях очень желательно.
Возможны и другие способы передачи параметров: как переменных (иногда это называется передачей по ссылке), как констант и как выходных величин. Эти способы осуществляются указанием перед именем соответствующего параметра спецификатора var, const или out.
При передаче параметра по ссылке перед его именем в заголовке процедуры должно быть указано ключевое слово var. Например:
procedure Pr ( var X1: real; X2: real; A: integer);
В этом случае не происходит копирования значения аргумента в локальную, временную переменную в процедуре. Процедура реально работает не с параметром, а со ссылкой – указателем на место хранения аргумента в памяти. Соответственно, в приведенном примере любые изменения параметра X1, произведенные в процедуре, в действительности относятся не к этому параметру, а к тому аргументу Y, который передан при вызове процедуры. Таким образом, ключевое слово var позволяет возвращать информацию из процедуры в вызвавшую его внешнюю процедуру.
Передача параметра как константы осуществляется заданием перед его именем ключевого слова const. Например:
procedure Prc ( const X1: real; X2: real; A: integer);
Такая передача параметра почти идентична по своим последствиям обычной передаче по значению. Как и в том случае, значение аргумента невозможно изменить, изменяя параметр процедуры. Но есть одно существенное отличие: если при передаче параметра по значению вы можете в тексте процедуры изменять значение соответствующей ему локальной переменной, то при передаче параметра как константы это невозможно. При попытке в теле процедуры изменить значение параметра, переданного как константа, компилятор выдаст сообщение об ошибке.
Передача параметра как константы позволяет сделать код более эффективным, так как при этом компилятору заведомо известно, что никакие изменения параметра невозможны.
Передача параметра как выходного осуществляется заданием перед его именем спецификатора out. Например:
procedure Prc ( out X1: real; X2: real; A: integer);
Передача параметра как выходного очень похожа на передачу по ссылке. Отличие в том, что при этом не гарантируется передача в процедуру начального значения этого параметра. Часто такая передача применяется для аргументов, являющихся структурами. При этом память, занимаемая аргументом, в момент обращения к процедуре очищается. Таким образом параметр, переданный как выходной, указывает на некоторое место в памяти, являющееся просто контейнером, куда процедура должна занести соответствующее выходное значение.
Параметры обеспечивают механизм замены, который позволяет выполнять процедуру с различными начальными данными. Между фактическими параметрами в операторе вызова процедуры и формальными параметрами в заголовке описания процедуры устанавливается взаимнооднозначное соответствие в результате их перебора слева направо. Количество и тип формальных параметров равно количеству и типу фактических параметров.
10.1.3. Процедурные типы
Процедуры в Delphi разрешается использовать при описании новых типов, На основании таких типов, обладающих равными правами с другими типами, можно описывать переменные, что позволяет передавать подпрограммы в качестве параметров. Это удобно, когда над аргументами надо выполнять сложные различные действия в зависимости от некоторых условий.
Описание типов осуществляется после ключевого слова Type, например в виде, показанном в модуле UnModul UnModul (см. пример, 10.3):
type
func=function (x:real):real;
proc=procedure (x:real; var s:real);
Пример создания приложения
Задание. Создать Windows-приложение, которое выводит таблицу значений функции 13 EMBED Equation.3 1415 и ее разложения в ряд в виде суммы 13 EMBED Equation.3 1415 для значений x от xn до xk с шагом h=(xk- xn)/8. Создать модуль, в котором вычисление значений Y(x) оформить в виде функции, а вычисление S(x) – в виде процедуры. Подключить модуль к проекту и выполнить созданное приложение.
Сохранение проекта
Для нового проекта создайте новую папку, например, X: \ 35эи \ LAB10.
Сохраните проект File | Save Project AsСначала сохраните модуль под именем UnModul, затем файл проекта под именем PrModul.
Размещение компонентов на Форме
Один из возможных вариантов панели интерфейса создаваемого приложения показан на рисунке 10.1.
Разместим на форме компоненты Label, Edit, SpinEdit, BitBtn и Memo.

Рис. 10.1. Размещение компонентов на форме
Текст модуля UnModul приведен в пункте 10.2.5.
Создание модуля и подключение его к проекту
В соответствии с заданием создадим модуль, в котором вычисление значений Y(x) оформим в виде функции, а вычисление S(x) – в виде процедуры. Для создания модуля откроем в главном меню пункт File, выберем опцию New (Новый), затем Unit. Откроется окно с «пустым» модулем Unit2. С помощью опции Save As меню File сохраним модуль в папке с файлами проекта, присвоив ему имя, например, UnFuncProc.
В этом модуле операторы вычисления Y(x) в виде подпрограммы-функции F и операторы вычисления S(x) в виде подпрограммы-процедуры Summa оформим по правилам создания модулей. Текст модуля UnFuncProc приведен в пункте 10.2.4.
Для подключения модуля UnFuncProc к проекту необходимо сделать активным окно с текстом модуля UnModul, затем в меню File выбрать опцию Use Unit и в открывшемся окне Use Unit указать имя используемого модуля UnFuncProc. Убедитесь в том, что в разделе Implementation модуля UnModul появился оператор Uses UnFuncProc, который Delphi вставила в текст модуля Un
·Modul.
Откройте главный файл проекта и убедитесь в том, что проект не содержит посторонних модулей и файлов.
Текст модуля UnFancProc
unit UnFuncProc;

interface


Function F(x:real):real;
Procedure Summa(x:real;var s:real);

implementation
Function F(x:real):real;
begin
F:=2*(sqr(cos(x))-1) ;
end;
Procedure Summa(x:real; var s:real);
var
n,i: byte;
p: real;
begin
p:=1; s:=0;
for i:=1 to n do
begin
p:=p*(-sqr(2*x))/((2*i-1)*2*i);
s:=s+p;
end;
end;
end.


Текст модуля UnModul
unit UnModul;
interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Buttons, Spin;
type
TForm1 = class(TForm)
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
SpinEdit1: TSpinEdit;
Edit1: TEdit;
Edit2: TEdit;
BitBtn1: TBitBtn;
BitBtn2: TBitBtn;
Memo1: TMemo;
procedure FormCreate(Sender: TObject);
procedure BitBtn1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

type
func=function(x:real):real; // функциональный тип
proc=procedure(x:real; var s:real); // процедурный тип

var
Form1: TForm1;

implementation

uses UnFuncProc; // Delphi подключает модуль
// UnFuncProc
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
SpinEdit1.Text:='8'; // начальное значение N
Edit1.Text:='0,1'; // начальное значение Xn
Edit2.Text:='1'; // начальное значение Xk
Memo1.Clear;
end;

{В процедуре Tab вычисляется и выводитчя таблица значений x, S(x), Y(x)}
procedure Tab(Summa:proc;F:func;n:byte;xn,xk,h:real);
var
x,s,y:real;
begin
Form1.Memo1.Lines.Add(#9+'X'+#9+'S'+#9+'Y'); // заголовок таблицы
x:=xn;
repeat // цикл по х
Summa(x,s); // вызов процедуры Summa для вычисления S(x)
y:=F(x); // обращение к функции F для вычисления Y(x)
Form1.Memo1.Lines.Add(#9+FloatToStrF(x,ffFixed,6,2)+ // вывод x
#9+FloatToStrF(s,ffFixed,6,3)+ // вывод S
#9+FloatToStrF(y,ffFixed,6,3)); // вывод Y
x:=x+h;
until x>xk;
end;

procedure TForm1.BitBtn1Click(Sender: TObject);
var
xn,xk,x,h,y,s,p,ab,ot:real;
n,i:byte;
begin
n:=StrToInt(SpinEdit1.Text);
xn:=StrToFloat(Edit1.Text);
xk:=StrToFloat(Edit2.Text);
h:=(xk-xn)/n; // шаг h
Memo1.Clear;
Tab(Summa,F,n,xn,xk,h); // вызов процедуры Tab
end;
end.
Выполнение индивидуального задания
По указанию преподавателя выберите из таблицы два варианта индивидуальных заданий. Создайте модуль, в котором вычисление значений S(x) реализуйте в виде подпрограммы-процедуры, а вычисление значений Y(x) – в виде подпрограммы-функции. На панели интерфейса установите компонент. С помощью которого реализуйте возможность выбора соответствующего варианта задания и вывод таблицы значений x, Si(x), Yi(x), где i – номер варианта. Созданный модуль подключите к проекту и выполните приложение.
Индивидуальные задания

Xn
Xk
S(x)
n
Y(x)


0,1
1
13 EMBED Equation.3 1415
8
13 EMBED Equation.3 1415


13 EMBED Equation.3 1415
13 EMBED Equation.3 1415
13 EMBED Equation.3 1415
18
13 EMBED Equation.3 1415


13 EMBED Equation.3 1415
13 EMBED Equation.3 1415
13 EMBED Equation.3 1415
6
13 EMBED Equation.3 1415


0,1
0,8
13 EMBED Equation.3 1415
12
13 EMBED Equation.3 1415


0,1
1
13 EMBED Equation.3 1415
16
13 EMBED Equation.3 1415


0,1
1
13 EMBED Equation.3 1415
14
13 EMBED Equation.3 1415


0,1
1
13 EMBED Equation.3 1415
8
13 EMBED Equation.3 1415


0,1
0,8
13 EMBED Equation.3 1415
10
13 EMBED Equation.3 1415


0,2
1
13 EMBED Equation.3 1415
6
13 EMBED Equation.3 1415


13 EMBED Equation.3 1415
13 EMBED Equation.3 1415
13 EMBED Equation.3 1415
16
13 EMBED Equation.3 1415


0,1
0,8
13 EMBED Equation.3 1415
20
13 EMBED Equation.3 1415


0,1
1
13 EMBED Equation.3 1415
18
13 EMBED Equation.3 1415


0,1
0,8
13 EMBED Equation.3 1415
14
13 EMBED Equation.3 1415


0,1
0,8
13 EMBED Equation.3 1415
12
13 EMBED Equation.3 1415


13 EMBED Equation.3 1415
13 EMBED Equation.3 1415
13 EMBED Equation.3 1415
18
13 EMBED Equation.3 1415


0,1
1
13 EMBED Equation.3 1415
16
13 EMBED Equation.3 1415


0,1
1
13 EMBED Equation.3 1415
10
13 EMBED Equation.3 1415


0,1
1
13 EMBED Equation.3 1415
12
13 EMBED Equation.3 1415


0,1
1
13 EMBED Equation.3 1415
8
13 EMBED Equation.3 1415


0,1
1
13 EMBED Equation.3 1415
14
13 EMBED Equation.3 1415


0,1
1
13 EMBED Equation.3 1415
8
13 EMBED Equation.3 1415


0,1
1
13 EMBED Equation.3 1415
12
13 EMBED Equation.3 1415


0,1
1
13 EMBED Equation.3 1415
10
13 EMBED Equation.3 1415


0,1
1
13 EMBED Equation.3 1415
14
13 EMBED Equation.3 1415


0,1
0,5
13 EMBED Equation.3 1415
15
13 EMBED Equation.3 1415


0,1
0,8
13 EMBED Equation.3 1415
10
13 EMBED Equation.3 1415


0,1
2
13 EMBED Equation.3 1415
8
13 EMBED Equation.3 1415


-2
-0,1
13 EMBED Equation.3 1415
16
13 EMBED Equation.3 1415


0,2
0,8
13 EMBED Equation.3 1415
12
13 EMBED Equation.3 1415


-1
1
13 EMBED Equation.3 1415
10
13 EMBED Equation.3 1415

Лабораторная работа № 11. ПРОГРАММИРОВАНИЕ
С ИСПОЛЬЗОВАНИЕМ ДИНАМИЧЕСКИХ СТРУКТУР ДАННЫХ

Цель работы: освоить методику создания приложений, в которых используются динамические структуры данных.

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

11.1.1. Указатели
Для организации динамических структур используются переменные-указатели. Идея, лежащая в основе концепции указателей, состоит в том, чтобы связать определенный тип данных с конкретным указателем. Сам указатель в свою очередь тоже является элементом данных и представляет собой ссылку на определенную ячейку памяти, начиная с которой записывается значение переменной. Указатели бывают типизированные, указывающие на данные определенного типа, и нетипизированные (типа pointer), которые могут указывать на данные произвольного типа.
Тип указателя определяется специальным символом ^, за ним следует идентификатор типа динамических переменных, к которым можно будет обращаться через переменные указатели этого типа. Фактически указатель является адресом памяти, по которому можно получить доступ к значению динамической переменной.
Объявление своего типизированного указателя на любой тип имеет вид:
type <имя типа указателя> = ^<тип данных>;
Например, предложения:
type Pint = ^integer;
var P1, P2 : Pint;
объявляет тип Pint указателя на величину типа integer и две переменные P1 и P2, являющиеся указателями на значения типа integer. Однако надо помнить, что объявление переменных P1 и P2 не создает самих величин, на которые они указывают. Выделяется только память под хранение указателей, но сами эти указатели ни на что не указывают. Имеется предопределенная константа nil, которая обычно присваивается указателям, которые в данный момент ни на что не указывают.
Чтобы получить доступ к данным, на которые указывает типизированный указатель, надо применить операцию его разыменования. Она записывается с помощью символа ^, помещаемого после указателя. Например, если переменная P1 является указателем приведенного выше типа Pint, то выражение P1^ – это та целая величина, на которую указывает указатель P1. Если R – переменная целого типа, то после выполнения оператора
P1^ := R;
P1 начнет указывать на переменную R и выражение P1^ будет возвращать значение этой переменной. Того же результата можно добиться операцией адресации. Например, приведенный выше оператор можно заменить эквивалентным ему оператором
P1 := @R;
Этот оператор присваивает указателю P1 адрес переменной R.
Таким образом, применение операций разыменования или адресации – один из способов присвоить указателю ссылку на конкретную область памяти. Другой более распространенный способ – использование процедур.
Динамическое распределение памяти может производиться двумя способами: с помощью процедур New и Dispose и процедурами GetMen и FreeMen.
При первом способе выделение памяти производится процедурой
Procedure New (<имя указателя>);
где <имя указателя> – имя переменной, являющейся типизированным указателем. Этой переменной при успешном завершении процедуры передается адрес начала выделенной области памяти. Размер выделяемой области определяется размером памяти, необходимым для размещения того типа данных, который указан при объявлении указателя.
Рассмотрим примеры динамического выделения памяти. Операторы
var Р: ^геаl;

New(P) ;
P^ := 5.5;
объявляют переменную Р, являющуюся указателем на действительное значение, процедура New выделяет память для этого значения. А следующий оператор заносит в эту область число 5.5.
Приведенный ниже пример показывает выделение памяти под запись:
type
rec = record
fio: string[40];
year: integer;
end;
var Pr: ^rec;
New(Pr);
with Pr^ do begin
fio : = Иванов Иван Иванович’;
year := 1962;
end;
Освобождение памяти, динамически выделенной процедурой New, осуществляется процедурой Dispose:
procedure Dispose(<имя указателя>);
В эту процедуру должен быть передан тот указатель, в котором хранится адрес области памяти, выделенной ранее процедурой New. Для приведенных выше примеров соответствующие процедуры Dispose могут быть записаны следующим образом:
Dispose (Р);
Dispose(Pr);
Надо отметить, что применение процедуры Dispose освобождает память, но не изменяет значения указателя, не делает его равным nil, хотя теперь указатель не указывает ни на что конкретное.
Второй способ динамического выделения памяти связан с применением процедур GetMem для выделения памяти и FreeMem для ее освобождения. Они имеют следующий синтаксис:
procedure GetMem(<имя указателя>,<объем памяти в байтах>);
procedure FreeMem(<имя указателя>,<объем памяти в байтах>);
В отличие от процедур New и Dispose здесь задается не только указатель, в котором устанавливается процедурой GetMem и читается процедурой FreeMem адрес выделенной области памяти, но и указывается объем памяти в байтах. Благодаря этому в процедурах могут использоваться не только типизированные, но и нетипизированные указатели. Если же используется типизированный указатель, то объем необходимой памяти лучше всего определять функцией SizeOf, так как размеры памяти, отводимой под тот или иной тип данных, могут изменяться в различных версиях компилятора. Таким образом, в приведенных выше примерах вызовы процедуры New могут быть заменены следующим образом:
GetMem(P, SizeOf (real));

FreeMem(P, SizeOf (real));

GetMem(Pr, SizeOf (rec));

FreeMem(Pr, SizeOf(rec));
Надо иметь в виду, что два рассмотренных метода нельзя смешивать. Например, нельзя освободить методом FreeMem память, выделенную ранее методом New, и нельзя освободить методом Dispose память, выделенную методом GetMem.
11.2. Использование динамических переменных
Указатели являются эффективным средством построения списков. Списком называется упорядоченная структура, каждый элемент которой содержит ссылку, связывающую его со следующим элементом. Для организации списков используются записи, состоящие из двух смысловых частей: основной и дополнительной. Основная часть содержит подлежащую обработке информацию, в дополнительной части находится указатель на следующую запись списка. Начало списка указывается в переменной, которая всегда присутствует в программе обработки списков. Если в списке нет элементов, т.е. список пустой, значение этой переменной равно Nil. Если список не заполнен, последний элемент содержит в дополнительной части значение Nil.
Наибольшее распространение получили два вида списков – стеки и очереди.
Стек – это список с одной точкой доступа к его элементам, которая называется вершиной стека. Добавить или убавить элемент можно только через его вершину. Принцип работы стека: «последний пришел – первый вышел». Основные операции над стеком: формирование стека, добавление, удаление и просмотр элементов стека. Для их демонстрации используем следующее описание:
type
pSt=^zap;
zap=record
inf:integer;
adr:pSt;
end;
var
pVer, pTek, nVer:pSt;
elSt:integer;
Формирование и добавление элементов в стек
procedure TForm1.BitBtn1Click(Sender: TObject);
begin
pVer:=nil;
new(pTek);
elSt:=StrToInt(Edit1.Text);
pTek^.inf:=elSt;
pTek^.adr:=pVer;
pVer:=pTek;
Edit1.Text:='';
Edit1.SetFocus;
end;
Удаление элемента из стека
procedure TForm1.BitBtn3Click(Sender: TObject);
begin
pVer:=pTek^.adr;
Dispose(pTek);
pTek:=pVer;
end;
Просмотр элементов стека
procedure TForm1.BitBtn4Click(Sender: TObject);
begin
pTek:=pVer;
while pTek<>nil do
begin
Memo1.Lines.Add(#9+IntToStr(pTek^.inf));
pTek:=pTek^.adr;
end;
Пример создания приложения
Использование динамических массивов
Задание. Создать приложение для вычисления наименьшего и наибольшего из всех значений элементов целочисленной матрицы A[m,n]. Значения m и n задаются пользователем на панели интерфейса, а элементы матрицы А генерируются при помощи датчика случайных чисел и размещаются в памяти динамически.
11.3.1. Сохранение проекта
Для нового проекта создайте новую папку, например, X: \ 35эи \ LAB11_M.
Сохраните проект File | Save Project AsСначала сохраните модуль под именем UnDinMas, затем файл проекта под именем Pr_DinMas.
Размещение компонентов на Форме
Один из возможных вариантов панели интерфейса создаваемого приложения показан на рисунке 11.1.
Разместим на форме компоненты Label, SpinEdit, BitBtn и Stringgrid.

Рис.11.1. Размещение компонентов на форме
Установите для компонентов SpinEdit1 и SpinEdit2 значения свойств: MinValue=2, MaxValue=10.
В тех случаях, когда объем выводимой информации превышает размер поля компонента Stringgrid1, целесообразно снабдить его линейками прокрутки для этого в свойстве ScrollBars установим значение ssBoth.
11.3.3. Создание процедуры обработки событий FormCreate
и BitBtn1Click
Двойным нажатием клавиши «мыши» на Форме и кнопке BitBtn создайте соответствующие процедуры обработки событий. Пользуясь текстом модуля UnDinMas, наберите операторы этих процедур.
Создать процедуру, которая будет выделять заданным цветом границы ячеек с наименьшим и наибольшим значениями в компоненте StringGrid. Для создания такой процедуры сделайте активным компонент StringGrid и на странице Events (события) Инспектора Объектов дважды щелкните «мышью» в правой части события OnDrawCell. В ответ Delphi создаст обработчик этого события – процедуру procedure TForm1.StringGrid1DrawCell и установит курсор между операторами begin и end этой процедуры. Используя текст модуля UnDinMas, наберите операторы процедуры TForm1.StringGrid1DrawCell.
Текст модуля UnDinMas
unit UnDinMas;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Spin, Buttons, Grids;

type
TForm1 = class(TForm)
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
Label5: TLabel;
Label6: TLabel;
Label7: TLabel;
Label8: TLabel;
Label9: TLabel;
StringGrid1: TStringGrid;
BitBtn1: TBitBtn;
SpinEdit1: TSpinEdit;
SpinEdit2: TSpinEdit;
BitBtn2: TBitBtn;
procedure FormCreate(Sender: TObject);
procedure SpinEdit1Change(Sender: TObject);
procedure SpinEdit2Change(Sender: TObject);
procedure BitBtn1Click(Sender: TObject);
procedure StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}
type
Mas = array [1..1] of integer;
pMas = array [1..1] of ^mas;
var
pA: ^pMas;
m,n,max,min: integer;

procedure TForm1.FormCreate(Sender: TObject);
begin
SpinEdit1.Text:='6'; // начальное значение m
SpinEdit2.Text:='8'; // начальное значение n
m:=6;
n:=8;
StringGrid1.RowCount:=m; // количество строк
StringGrid1.ColCount:=n; // количество столбцов
end;

procedure TForm1.SpinEdit1Change(Sender: TObject);
begin
m:=StrToInt(SpinEdit1.Text);
StringGrid1.RowCount:=m;
end;

procedure TForm1.SpinEdit2Change(Sender: TObject);
begin
n:=StrToInt(SpinEdit2.Text);
StringGrid1.ColCount:=n;
end;


procedure TForm1.BitBtn1Click(Sender: TObject);
label 1;
var
i,j,k,l,r,p: integer;
begin
Randomize; // инициализация датчика случайных чисел
GetMem(pA,4*m);
for i:=1 to m do
begin // формирование i-й строки массива
GetMem(pA^[i],SizeOf(integer)*n);
for j:=1 to n do
begin
1: r:=Random(1000); // генерирование случайного числа
for k:=1 to i do
begin
if k=i then p:=j-1 else p:=n;
for l:=1 to p do
if r=pA^[k]^[l] then goto 1; //если число есть в массиве,
//тогда сгенерировать новое число
end;
pA^[i]^[j]:=r; // случайное число занести в массив
end;
end;
for i:=1 to m do
for j:=1 to n do
StringGrid1.Cells[j-1,i-1]:=IntToStr(pA^[i]^[j]);
max:=pA^[1]^[1];
min:=max;
for i:=1 to m do
for j:=1 to n do
if max else if min>pA^[i]^[j] then min:=pA^[i]^[j];
Label8.Caption:=IntToStr(min);
Label9.Caption:=IntToStr(max);
end;


procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState);
begin
with StringGrid1.Canvas do
if StringGrid1.Cells[ACol,ARow]=IntToStr(min) then
begin
Brush.Color:=clGreen;
FrameRect(Rect);
end
else if StringGrid1.Cells[ACol,ARow]=IntToStr(max) then
begin
Brush.Color:=clRed;
FrameRect(Rect)
end
end;

end.
Пример создания приложения
Использование динамических списков
Задание. Создать приложение для формирования стека, который заполняется путем ввода целых положительных чисел с клавиатуры. Как только будет введено первое отрицательное число, содержимое стека выводится на панель интерфейса, а память, занимаемая его элементами, освобождается.
11.4.1. Сохранение проекта
Для нового проекта создайте новую папку, например, X: \ 35эи \ LAB11_S.
Сохраните проект File | Save Project AsСначала сохраните модуль под именем UnStek, затем файл проекта под именем Pr_Stek.
11.4.2. Размещение компонентов на Форме
Один из возможных вариантов панели интерфейса создаваемого приложения показан на рисунке 11.2.
Разместим на форме компоненты Label, Edit, Button, BitBtn, Memo.

Рис.11.2. Размещение компонентов на форме
11.4.3. Создание процедуры обработки событий FormCreate и BitBtn1Click
Двойным нажатием клавиши «мыши» на Форме и кнопке Button создайте соответствующие процедуры обработки событий. Пользуясь текстом модуля UnStek, наберите операторы этих процедур.
Текст модуля UnStek
unit UnStek;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Buttons;
type
TForm1 = class(TForm)
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Edit1: TEdit;
Button1: TButton;
BitBtn1: TBitBtn;
Memo1: TMemo;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

type
pSt=^zap;
zap=record
inf: integer;
adr: pSt
end;

var // объявление глобальных переменных
pVer, // указатель вершины стека
pTek: pSt; // текуший указатель
elSt: integer; // элемент стека
procedure TForm1.FormCreate(Sender: TObject);
begin
Memo1.Clear;
Edit1.Text:='';
pVer:=nil; // инициализировать указатель вершины
elSt:=0; // инициализировать элемент стека
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
New(pTek); // выделить память
elSt:=StrToInt(Edit1.Text);
pTek^.inf:=elSt; // в информационную часть стека занести elSt
pTek^.adr:=pVer; // в адресную часть занести указатель на вершину
pVer:=pTek; // указатель вершины должен указывать на
// последний элемент
if elSt>=0 then // если элемент стека неотрицательный, тогда
begin
Edit1.Text:=''; // очистить окно редактора Edit1
Edit1.SetFocus; // передать фокус ввода редактору Edit1
end
else
begin
Memo1.Lines.Add('Элементы стека:'); // вывод заголовка
repeat
Memo1.Lines.Add(#9+IntToStr(pTek^.inf)); // вывод элементов
pVer:=pTek^.adr;
Dispose(pTek); // освободить память
pTek:=pVer;
until pTek=nil;
end;
end;

end.
11.5. Выполнение индивидуального задания
По указанию преподавателя выберите два варианта индивидуальных заданий. В заданиях №1–15 необходимо использовать динамические массивы, в заданиях №16–30 – динамические списки. Во всех заданиях необходимо предусмотреть контрольный вывод исходных данных.
Индивидуальные задания
Создать приложение, которое осуществляет ввод m строк и n столбцов двумерного массива с клавиатуры, меняет местами элементы с наибольшим и наименьшим значениями среди четных элементов и выводит полученный массив.
Создать приложение, которое осуществляет ввод значений элементов двумерного массива n-го порядка с клавиатуры и выводит значение наибольшего их элементов главной диагонали.
Создать приложение, которое осуществляет ввод значений элементов двумерного массива n-го порядка с клавиатуры, меняет местами элементы главной и побочной диагоналей, выводит полученный массив.
Создать приложение, которое осуществляет ввод значений элементов двумерного массива n-го порядка с клавиатуры, меняет местами строку с максимальным элементом на главной диагонали со строкой с заданным номером, выводит полученный массив.
Создать приложение, которое осуществляет ввод m строк и n столбцов двумерного массива А с клавиатуры, формирует новый двумерный массив В(m, n), расположив элементы каждой строки массива А в порядке убывания их абсолютных величин, выводит полученный массив В.
Создать приложение, которое осуществляет ввод значений элементов двумерного массива А n-го порядка с клавиатуры, формирует два одномерных массива В и С (в массив В переслать по строкам верхний треугольник матрицы, включая элементы главной диагонали, в массив С – нижний треугольник матрицы).
Создать приложение, которое осуществляет ввод m строк и n столбцов двумерного массива А с клавиатуры, формирует новый двумерный массив В(m, n), расположив элементы каждого столбца массива А в порядке убывания их абсолютных величин.
Создать приложение, которое осуществляет ввод m строк и n столбцов двумерного массива А с клавиатуры, формирует новый двумерный массив В(m, n), умножая элементы каждой строки массива А на наибольший элемент строки.
Создать приложение, которое осуществляет ввод m строк и n столбцов двумерного массива с клавиатуры, определяет количество элементов, превышающих среднее арифметическое значение элементов главной диагонали массива.
Создать приложение, которое осуществляет ввод значений элементов двумерного массива А n-го порядка с клавиатуры, определяет максимальные элементы в каждой строке исходного массива и записывает их в массив В(n), упорядочивает одномерный массив В по возрастанию.
Создать приложение, которое осуществляет ввод m строк и n столбцов двумерного массива А с клавиатуры, формирует новый двумерный массив В(m, n), путем деления всех элементов массива А на ее наибольший по модулю элемент.
Создать приложение, которое осуществляет ввод m строк и n столбцов двумерного массива А с клавиатуры, формирует новый двумерный массив В(m, n), путем поэлементного вычитания последней строки массива А из всех строк, кроме последней.
Создать приложение, которое осуществляет ввод m строк и n столбцов двумерного массива с клавиатуры, находит наименьшее из значений элементов столбца, который обладает наибольшей суммой модулей элементов (если таких столбцов несколько, то взять первый из них).
Создать приложение, которое осуществляет ввод m строк и n столбцов двумерного массива А с клавиатуры, формирует новый двумерный массив В(m, n), в котором переставлены строка, содержащая элемент с наибольшим значением, и строка, содержащая элемент с наименьшим значением (предполагается, что эти элементы единственны).
Создать приложение, которое осуществляет ввод значений элементов двумерного массива А n-го порядка с клавиатуры, формирует новый двумерный массив В(n, n), в котором элементы К-ой строки массива А разделить на диагональный элемент, расположенный в этой строке.
Создать приложение, которое заносит в стек целые положительные числа с клавиатуры, выводит содержимое стека и среднее арифметическое значение его элементов.
Создать приложение, которое заносит в стек символы с клавиатуры, выводит содержимое стека и сообщение о том, содержится или нет в стеке заданный символ.
Создать приложение, которое заносит в каждый элемент стека английское слово с клавиатуры и как только будет введено слово «end», выводит содержимое стека.
Создать приложение, которое заносит в стек произвольные целые числа с клавиатуры, выводит содержимое стека и сообщение о том, содержится или нет в стеке заданное число.
Создать приложение, которое заносит в стек символы с клавиатуры, выводит содержимое стека и сообщение о том, упорядочены или нет элементы стека по алфавиту.
Создать приложение, которое заносит в стек целые положительные числа с клавиатуры и, как только будет введено число, равное сумме введенных чисел, выводит содержимое стека.
Создать приложение, которое заносит в стек произвольные числа с клавиатуры, выводит содержимое стека и сообщение о том, упорядочены ли элементы стека по убыванию.
Создать приложение, которое заносит в каждый элемент стека русское слово с клавиатуры и, как только будет введено слово «конец», выводит содержимое стека и сообщение о том, содержится или нет в стеке заданное слово.
Создать приложение, которое заносит в стек произвольные числа с клавиатуры, выводит содержимое стека и удаляет из стека наибольший элемент.
Создать приложение, которое заносит в стек произвольные целые числа с клавиатуры. Как только сумма введенных чисел станет равна нулю, приложение должно вывести содержимое стека.
Создать приложение, которое заносит в каждый элемент стека русское слово с клавиатуры и, как только будет введено слово «конец», выводит содержимое стека и затем удаляет из него любое слово, содержащееся в стеке (ввести с клавиатуры).
Создать приложение, которое заносит в стек произвольные целые числа с клавиатуры. Как только будет введено число 0 (ноль), приложение должно вывести содержимое стека, а затем сформировать из него два новых стека: в первом должны находиться положительные, а во втором – отрицательные числа.
Создать приложение, которое символы, упорядоченные по алфавиту, вводит с клавиатуры и заносит в стек. Приложение должно вывести содержимое стека, ввести с клавиатуры заданный символ и вставить его в стек так, чтобы элементы стека опять оказались упорядоченными по алфавиту.
Создать приложение, которое заносит в стек буквы русского и латинского алфавита в произвольном порядке с клавиатуры. Как только будет введен символ «.» (точка), приложение должно вывести содержимое стека, а затем сформировать из него два новых стека: в первом должны находиться буквы русского алфавита, а во втором – буквы латинского алфавита.
Создать приложение, которое заносит в стек произвольные целые числа с клавиатуры. Как только будет введено число 9 999, приложение выводит содержимое стека и реверсирует стек (направление ссылок в стеке изменяется так, что вершина и дно стека меняются местами).
Лабораторная работа № 12. ПРОГРАММИРОВАНИЕ
С ИСПОЛЬЗОВАНИЕМ СРЕДСТВ ДЛЯ ПОСТРОЕНИЯ
И ОТОБРАЖЕНИЯ ГРАФИКОВ

Цель работы: изучить возможности построения графиков с помощью компонента отображения графической информации TChart. Написать и отладить программу построения и отображения на экране графиков заданных функций.

12.1. Методика построения графиков с помощью компонента TChart

Для наглядности часто результаты расчетов представляются в виде графиков и диаграмм. Среда визуального программирования Delphi имеет мощный пакет стандартных программ построения и вывода на экран графической информации с помощью компонента TСhart (рис. 12.1).


Рис. 12.1. Размещение компонентов на форме

Построение графика (диаграммы) производится после вычисления таблицы значений функции y=f(x) на интервале [Xmin, Xmax] с данным шагом. Полученная таблица передается в специальный двумерный массив Seriesk (k-номер графика) компонента TChart с помощью метода Add. Компонент TChart осуществляет всю работу по отображению графиков, переданных в объект: строит и размечает оси, рисует координатную сетку, подписывает название осей и самого графика, отображает переданную таблицу в виде всевозможных графиков или диаграмм. При необходимости, с помощью встроенного редактора EditingChart компоненту TChart передаются данные о толщине, стиле и цвете линий, параметрах шрифта подписей, шагах разметки координатной сетки и другие настройки. В процессе работы программы изменение параметров возможно через обращение к соответствующим свойствам компонента TChart. Так, например, свойство TChart.BottomAxis содержит значение максимального предела нижней оси графика и при его изменении во время работы автоматически изменяется изображение графика (см. нижеприведенную программу).

12.2. Пример написания программы

Задание. Составить программу, построения и отображения графиков функций cos(x) и двух других заданных функций на интервале [Xmin..Xmax]. В качестве последних рассматриваются функции из лабораторной работы №3 [6], вариант 2. Требуется предусмотреть возможность изменения разметки координатных осей, а также шага построения таблицы.

12.2.1. Настройка формы

Панель диалога программы организуется в виде, представленном на рисунке 12.2. Для ввода исходных данных используются окна TEdit. Выход из программы организуется посредством компонента TBitBtn. Компонент TChart может быть введен в форму путем нажатия пиктограммы в меню компонентов, как указывалось в предыдущих работах, либо командой View | Component List | Component | TChart.

12.2.2. Работа с компонентом TChart

Для изменения параметров компонента TChart необходимо дважды щелкнуть по нему мышью в окне формы. Появится окно редактирования EditingChart (см. рис. 12.2). Для создания нового объеета Series1 щелкнуть по кнопке Add на странице Series. В появившимся диалоговом окне TeeChartGalleri выбрать пиктограмму с надписью Line (график выводится в виде линий). Если нет необходимости представления графика в трехмерном виде, отключить независимый переключатель 3D. После нажатия на кнопку ОК появится новая серия с название Seriesl. Для изменения названия нажать кнопку Title.
В появившимся однострочном редакторе набрать имя отображаемой функции, например «Функция 1». Аналогичным образом создать объект Series2 для функции cos(x) и объект Series3 для функции «Функция 2». Желательно, чтобы в названиях функций по возможности отображалась суть функций.


Рис. 12.2. Окно редактирования Editing Chart

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

12.2.3. Написание программы обработчика события создания формы

В procedure TForm1.Button1Click программы устанавливаются начальные пределы и шаг разметки координатных осей. Если Chart1.BottomAxis Automatic имеет значение False, то автоматическая установка параметров осей не работает.

12.2.4. Написание программ обработчика событий нажатия на кнопки

Процедура TForm1.Button1Click обрабатывает нажатие кнопки «Разместить оси». Процедура TForm1.Button2Click обрабатывает нажатие кнопки «Построить графики». Для добавления координат точек (X, Y) из таблицы значений в двумерный массив объекта Seriesk используется процедура Series1.AddXY(Const AXValue, AYValue: Double; Const AXLabel: String; AColor: TColor): Longint;, где AXValue, AYValue – координаты точки по осям X и Y; AXLabel может принимать значение ’; AColor задает цвет линий (если равен clTeeColor, то принимается цвет, определенный при проектировании формы).
После запуска программы и нажатия кнопки «Построение графиков» на экране отображаются графики указанных функций, как показано на рисунке. 12.3.


Рис. 12.3. Графики функций

12.3. Модуль программы построения и отображения графиков
Ниже приведен программный модуль построения и отображения графиков и диаграмм с использованием компонента TChart.

unit UnProgrGraph;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Buttons, ExtCtrls, TeeProcs, TeEngine, Chart, Series;
type
TForm1 = class(TForm)
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
Label5: TLabel;
Label6: TLabel;
Label7: TLabel;
Edit1: TEdit;
Edit2: TEdit;
Edit3: TEdit;
Edit4: TEdit;
Edit5: TEdit;
Edit6: TEdit;
Edit7: TEdit;
Button1: TButton;
Button2: TButton;
BitBtn1: TBitBtn;
Chart1: TChart;
Series1: TLineSeries;
Series2: TLineSeries;
Series3: TLineSeries;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private { Private declarations }
public { Public declarations }
end;

var
Form1: TForm1;
Xmin,Xmax,Ymin,Ymax,Hx,Hy,h:extended;

implementation
{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
{Установка начальных параметров координатных осей}
Xmin:=0.0;
Xmax:=2*pi;
Ymin:=-1;
Ymax:=2;
Hx:=pi/2;
Hy:=0.5;
h:=0.01;
{Вывод данных в окно однострочных редакторов}
Edit1.Text:=FloatToStr(Xmin);
Edit1.Text:=FloatToStr(Xmax);
Edit1.Text:=FloatToStr(Ymin);
Edit1.Text:=FloatToStr(Ymax);
Edit1.Text:=FloatToStr(Hx);
Edit1.Text:=FloatToStr(Hy);
Edit1.Text:=FloatToStr(h);

Chart1.BottomAxis.Automatic:=False; //Отключение автоматического
//определения параметров нижней оси
Chart1.BottomAxis.Minimum:=Xmin; // Установка левой границы нижней оси
Chart1.BottomAxis.Maximum:=Xmax; // Установка правой границы нижней
//оси
Chart1.LeftAxis.Automatic:= False; //Отключение автоматического
//определения параметров левой оси
Chart1.LeftAxis.Minimum:= Ymin; // Установка нижней границы левой оси
Chart1.LeftAxis.Maximum:= Ymax; // Установка верхней границы левой оси
Chart1.BottomAxis.Increment:=Hx; // Установка шага разбивки по нижней
//оси
Chart1.LeftAxis.Increment:= Hy; // Установка шага разбивки по левой оси
end;


procedure TForm1.Button1Click(Sender: TObject);
begin
{Чтение данных из окон однострочных редакторов}
Xmin:=StrToFloat(Edit1.Text);
Xmax:=StrToFloat(Edit1.Text);
Xmin:=StrToFloat(Edit1.Text);
Xmax:=StrToFloat(Edit1.Text);
Hx:=StrToFloat(Edit1.Text);
Hy:=StrToFloat(Edit1.Text);

Chart1.BottomAxis.Minimum:=Xmin; // Установка левой границы нижней оси
Chart1.BottomAxis.Maximum:=Xmax; // Установка правой границы нижней оси
Chart1.LeftAxis.Minimum:= Ymin; // Установка нижней границы левой оси
Chart1.LeftAxis.Maximum:= Ymax; // Установка верхней границы левой оси
Chart1.BottomAxis.Increment:=Hx; // Установка шага разбивки по нижней
//оси
Chart1.LeftAxis.Increment:= Hy; // Установка шага разбивки по левой оси
end;

procedure TForm1.Button2Click(Sender: TObject);
var x,y1,y2:extended;
a,b,fx:extended;
k1,k2:extended;
begin
{Очистка графиков}
Series1.Clear;
Series2.Clear;
Series3.Clear;
Xmin:=StrToFloat(Edit1.Text);
Xmax:=StrToFloat(Edit2.Text);
h:=StrToFloat(Edit7.Text);
x:=Xmin;
{Варианты значений коэффициентов задаются преподавателем}
a:=1.25; b:=1.25;
k1:=0.01; k2:=0.001;

repeat
fx:=sin(x); // Расчет функции 1
if x<2.3 then y1:=(a+b)/(4+sqr(cos(x)))
else if (x>=2.3) and (x<5) then y1:=(a+b)/(x+1)
else y1:=k1*exp(x)+fx;
Series1.AddXY(x,y1,'',clTeeColor); // Вывод точки на график
y2:=cos(x); // Расчет функции cos(x)
Series2.AddXY(x,y2,'',clTeeColor); // Вывод точки на график
fx:=cos(x); // Расчет функции 2
if x<2.3 then y2:=(a+b)/(4+sqr(cos(x)));
if (x>=2.3) and (x<5) then y2:=(a+b)/(x+1);
if x>=5 then y2:=k2*exp(x)+fx;
Series3.AddXY(x,y2,'',clTeeColor); // Вывод точки на график
x:=x+h; // Увеличение x на величину h
until(x>Xmax);
end;
end.

12.4. Выполнение индивидуального задания
Постройте графики функций для соответствующих вариантов из лабораторной работы №3 [6]. Таблицу данных получить путем изменения параметра X с шагом h. Значения исходных параметров и коэффициентов k1, k2 принять по указанию преподавателя. Самостоятельно выбрать удобные параметры настройки.


Приложение 1
П1. СВОЙСТВА И МЕТОДЫ КОМПОНЕНТОВ

П1.1. Общие свойства компонентов
Палитра компонентов VCL – библиотеки визуальных компонентов Delphi, имеет ряд страниц, на которых скомпонованы пиктограммы всех компонентов, предопределенных в применяемой версии Delphi. Многие стандартные визуальные компоненты имеют одинаковые свойства.

Свойство Align
Задает способ выравнивания компонентов внутри формы. Имеет одно из следующих значений:
Значение
Описание

alNone
Выравнивание не используется. Компонент располагается на том месте, куда был помещен во время создания программы. Принимается по умолчанию

alTop
Компонент перемещается в верхнюю часть формы, и его ширина становится равной ширине формы. Высота компонента не изменяется

alBottom
Компонент перемещается в нижнюю часть формы, и его ширина становится равной ширине формы. Высота компонента не изменяется

alLeft
Компонент перемещается в левую часть формы, и его высота становится равной высоте формы. Ширина компонента не изменяется

alRight
Компонент перемещается в правую часть формы, и его высота становится равной высоте формы. Ширина компонента не изменяется

alClient
Компонент занимает всю рабочую область формы



Свойство Color
Определяет цвет фона компонента или цвет текста обьекта.
Может иметь одно из следующих значений:
Значение
Цвет

clBlack
Черный (Black)

clMaroon
Темно-красный (Maroon)

clGreen
Зеленый (Green)

clOlive
Оливковый (Olive green)

clNavy
Темно-синий (Navy blue)

clPurple
Фиолетовый (Purple)

clTeal
Сине-зеленый (Teal)

clGray
Серый (Gray)

clSilver
Серебряный (Silver)

clRed
Красный (Red)

clLime
Ярко-зеленый (Lime green)

clBlue
Голубой (Blue)

clFuchsia
Сиреневый (Fuchsia)

clAqua
Ярко-голубой (Aqua)

clWhite
Белый (White)


Цвета, приведенные в следующей таблице, являются системными цветами Windows и зависят от используемой цветовой схемы.
Значение
Цвет

clBackground
Текущий цвет фона окна

clActiveCaption
Текущий цвет заголовка активного окна

clInactiveCaption
Текущий цвет заголовка неактивного окна

clMenu
Текущий цвет фона меню

clWindow
Текущий цвет фона Windows

clWindowFrame
Текущий цвет рамки окна

clMenuText
Текущий цвет текста элемента меню

clWindowText
Текущий цвет текста внутри окна

clCaptionText
Текущий цвет заголовка активного окна

clActiveBorder
Текущий цвет рамки активного окна

clInactiveBorder
Текущий цвет рамки неактивного окна

clAppWorkSpace
Текущий цвет рабочей области окна

clHighlight
Текущий цвет фона выделенного текста

clHightlightText
Текущий цвет выделенного текста

clBtnFace
Текущий цвет кнопки

clBtnShadow
Текущий цвет фона кнопки

clGrayText
Текущий цвет недоступного элемента меню

clBtnText
Текущий цвет текста кнопки


Помимо перечисленных в таблице цветов значение свойства Color может задаваться шестнадцатеричными значениями.

Свойство Ctl3D
Позволяет определить внешний вид элемента. Если значение этого свойства равно False, компонент имеет двумерный вид, если True трехмерный. По умолчанию Ctl3D равно True.

Свойство Cursor
Позволяет определить вид курсора мыши, который он будет иметь, находясь в активной области компонента. В Delphi предопределено большое количество стандартных курсоров. Кроме того, пользователь может создавать свои собственные курсоры или использовать созданные другими.

Свойство DragCursor
Позволяет определить вид курсора, который будет отображаться, когда в компонент «перетаскивается» другой компонент. Значения этого свойства те же, что и у свойства Cursor.

Свойство DragMode
Позволяет определить режим поддержки протокола drag-and-drop. Возможны следующие значения:
Значение
Описание

dmAutomatic
Компонент можно «перетаскивать», «зацепив» мышью

dmManual
Компонент не может быть «перетащен» без вызова метода BeginDrag


Свойство Enabled
Если это свойство имеет значение True, компонент реагирует на сообщения от мыши, клавиатуры и таймера. В противном случае (значение False) эти сообщения игнорируются.

Свойство Font
Многие визуальные компоненты используют шрифт по умолчанию. При создании компонента изначальное значение свойства Font (класс TFont) имеет следующие параметры:
Свойство
Значение

Color
ClWindowText

Height
-MulDiv(10, GetDeviceCaps(DC, LOGPIXELSY), 72)

Name
System

Pitch
FpDefault

Size
10

Style
[]


Свойство Height
Задает вертикальный размер компонента или формы в пикселях. Используется для изменения высоты компонентов при измененниии размеров окна приложения.

Свойство HelpContext
Задает номер контекста справочной системы. Этот номер должен быть уникальным для каждого компонента. Если компонент активен (находится в фокусе), нажатие клавиши FI приводит к отображению экрана справочной системы (если такой существует для данного компонента).


Свойство Hint
Обеспечивает текст подсказки, появляющейся в ярлычке (всплывающем окне подсказки) или в заданном месте окна, например, в строке состояния.

Свойство Left
Задает горизонтальную координату левого угла компонента относительно формы в пикселах. Для форм это значение указывается относительно экрана.

Свойство ParentColor
Позволяет указать, каким цветом будет отображаться компонент. Если значение этого свойства равно True, компонент использует цвет (значение свойства Color) родительского компонента. Если же значение свойства ParentColor равно False, компонент использует значение собственного свойства Color.

Свойство ParentCtl3D
Позволяет указать, каким образом компонент будет определять, является он трехмерным, или нет. Если значение этого свойства равно True, то вид компонента задается значением свойства Ctl3D его владельца, если же значение этого свойства равно False – то значением его собственного свойства Ctl3D.

Свойство ParentFont
Позволяет указать, каким образом компонент будет определять используемый им шрифт. Если значение этого свойства равно True, используется шрифт, заданный у владельца компонента, если же это значение равно False, то шрифт задается значением его собственного свойства Font.

Свойство PopupMenu
Задает название локального меню, которое будет отображаться при нажатии правой кнопки мыши. Локальное меню отображается только в случае, когда свойство AutoPopup имеет значение True или когда вызывается метод Popup.

Свойство TabOrder
Задает порядок получения компонентами фокуса при нажатии клавиши Tab. По умолчанию этот порядок определяется размещением компонентов в форме: первый компонент имеет значение этого свойства, равное 0, второй – 1 и т.д. Для изменения этого порядка необходимо изменить значение свойства TabOrder определенного компонента. TabOrder может использоваться только совместно со свойством Tab Stop.

Свойство TabStop
Позволяет указать, может компонент получать фокус или нет. Компонент получает фокус, если значение его свойства TabStop равно True.

Свойство Tag
Обеспечивает «привязку» к любому компоненту значение типа Longint.

Свойство Тор
Задает вертикальную координату левого верхнего угла интерфейсного элемента относительно формы в пикселах. Для формы это значение указывается относительно экрана.

Свойство Visible
Позволяет определить, видим ли компонент на экране. Значением этого свойства управляют методы Show и Hide.

Свойство Width
Задает горизонтальный размер интерфейсного элемента или формы в пикселах.


2. Компоненты страницы STANDARD

Компонент TMainMenu
Компонент служит для создания главного меню формы. После установки компонента на форму необходимо создать его опции. Для этого следует путем двойного нажатия на левую клавишу «мыши» вызвать конструктор меню. Надо выбрать опцию, перейти в окно Инспектора Объектов, в строке Caption набрать необходимое и нажать клавишу Enter. Для создания новых опций необходимо выбирать справа, для создания подопций – снизу. Для определения символа быстрого доступа к опции перед ним ставится символ «&». Для вставки разделительной черты очередной элемент называется «–». Для создания разветвленных меню, т.е. таких, у которых подопции вызывают новые списки подопций, нажмите Ctrl-Вправо, где Вправо – клавиша смещения курсора вправо.
Каждый элемент меню является объектом класса TMenuItem и обладает следующими свойствами:
Property Break: TMenuBreak;
Позволяет создать многоколончатый список подменю

Property Checked: Boolean;
Если True, рядом с опцией появляется галочка

Property Command: Word;
Используется при разработке приложений, обращающихся непосредственно к API-функциям Windows

Property Count: Integer;
Содержит количество опций в подчиненном меню, связанном с данным элементом (только для чтения)

Property Default: Boolean;
Определяет, является ли данная опция подменю умалчиваемой

Property GroupIndex: Byte;
Определяет групповой индекс для зависимых опций

Property Items[Index: integer]: TMenuItem;
Позволяет обратиться к любой опции подчиненного меню по ее индексу

Property MenuIndex: Integer;
Определяет индекс опции в списке Items родительскс опции

Property ShortCut: TShortCut
Задает клавиши быстрого выбора данной опции


Компонент TPopupMenu
Данный компонент является локальным меню, которое становится доступным, когда пользователь нажимает правую кнопку мыши в рабочей области формы или компонента. Обычно локальное меню используется для динамического изменения свойств того или иного интерфейсного элемента. Редактируется локальное меню так же, как и главное, с помощью конструктора меню.
Чтобы связать нажатие правой кнопки мыши с раскрытием вспомогательного меню, в свойство PopupMenu необходимо поместить имя компонента меню. Свойство Alignment задает местонахождение локального меню.

Компонент TLabel
Компоненты класса TLabel (метки) предназначены для размещения на форме различного рода текстовых надписей.
Property AutoSize: Boolean;
Указывает, будет ли метка изменять свои размеры в зависимости от помещенного в ее свойство Caption текста (True – будет)

Property FocusControl: TWinControl;
Содержит имя оконного компонента, который связан с меткой (выбор компонента Label приводит к перемещению фокуса на связанный с ним компонент)

TtextLayout = (tlTop, tlCenter, tlBottom);
Property Layout: TTextLayout;
Определяет выравнивание текста по вертикали относительно границ метки: tlTop – текст распологается вверху; tlCenter – текстт центрируется по вертикали; tlBottom – текст распологается внизу

Property ShowAccelChar: Boolean;
Если содержит True, символ & в тексте метки предшествует символу-акселератору

Property Transparent: Boolean;
Определяет прозрачность фона метки. Если False, фон закрашивается собственным цветом Color, в противном случае используется фон родительского компонента

Property WordWrap: Boolean;
Разрешает/запрещает разрыв строки на границе слова. Для вывода многострочных надписей задайте AutoSize=False, WordWrap=True и установите подходящие размеры метки


Компонент TEdit
Компонент класса TEdit представляет собой однострочный редактор текста. С его помощью можно вводить и/или отображать достаточно длинные текстовые строки. Следует помнить, что этот компонент не распознает символы конца строки (#13#10).
Property AutoSelect: Boolean;
Указывает, будет ли выделяться весь текст в момент получения компонентом фокуса ввода

Property AutoSize: Boolean;
Если True и BorderStyle = bsSingle, высота компонента автоматически меняется при изменении свойства Font.Size

TBorderStyle = bsNone..bsSingle; Property BorderStyle: TBorderStyle
Определяет стиль обрамления компонента: bsNone-нет обрамления; bsSingle-компонент обрамляется одной линией

TEditCharCase = (ecNormal, ecUpperCase, ecLowerCase); Property CharCase: TEditCharCase;
Определяет автоматическое преобразование высоты букв: ecNormal – нет преобразования; ecUppercase –все буквы заглавные; ecLowerCase –все буквы строчные. Правильно работает с кириллицей

Property HideSelection: Boolean;
Если False, выделение текста сохраняется при потере фокуса ввода

Property MaxLength: Integer;
Определяет максимальную длину текстовой строки. Если имеет значение 0, длина строки не ограничена

Property Modified: Boolean;
Содержит True, если текст был изменен

Property OnChange: TNotifyEvent;
Определяет обработчик события OnChange, которое возникает после любого изменения текста

Property OEMConvert: Boolean;
Содержит True, если необходимо перекодировать текст из кодировки MS-DOS в кодировку Windows и обратно

Property PasswordChar: Char;
Если символ PasswordChar определен, он заменяет собой любой символ текста при отображении в окне. Используется для ввода паролей

Property Readonly: Boolean;
Если содержит True, текст не может изменяться

Property SelLength: Integer;
Содержит длину выделенной части текста

Property SelStart: Integer;
Содержит номер первого символа выделенной части текста

Property SelText: String:
Содержит выделенный текст


Методы компонента:
Procedure Clear:
Удаляет весь текст

procedure ClearSelection;
Удаляет выделенный текст

procedure CopyToClipboard;
Копирует выделенный текст в Clipboard

procedure CutToClipboard;
Копирует выделенный текст в Clipboard, после чего удаляет выделенный текст из компонента

function GetSelTextBuf(Buffer: PChar; ButSize: Integer): Integer;
Копирует не более ButSize символов выделенного текста в буфер Buffer

procedure PasteFrornClipboard;
Заменяет выделенный текст содержимым Clipboard, а если нет выделенного текста, копирует содержимое Clipboard в позицию текстового курсора

procedure SelectAll;
Выделяет весь текст

Procedure SetSelTextBuf(Buffer: PChar);
Заменяет выделенный текст содержимым Buffer, а если нет выделенного текста, копирует содержимое Buffer в позицию текстового курсора


Компонент ТMето
Компоненты класса ТМето предназначены для ввода, редактирования и/или отображения достаточно длинного текста, содержащего большое количество строк. Большинство свойств этого компонента аналогичны свойствам класса TEdit. Свойство Wordwrap аналогично свойству TLabel.Wordwrap.
Property Lines: TStrings;
Содержит редактируемый текст. Используется для построчного доступа. Методы Add, Delete, Insert используются для добавления, удаления и вставки строк

TscrollStyle = (ssNone, ssHorizontal, ssVertical, ssBoth);

Property ScrollBars: TscrollStyle;
Определяет наличие в окне редактора полос прокрутки: ssNone – нет полос; ssHorizontal – есть горизонтальная полоса; ssVertical – есть вертикальная полоса; ssBoth – есть обе полосы

Property WantRetums: Boolean;
Если содержит True, нажатие Enter вызывает переход на новую строку, в противном случае-обрабатывается системой. Для перехода на новую строку в этом случае следует нажать Ctrl+Enter

Property WantTabs: Boolean;
Если содержит True, нажатие Tab вызывает ввод е текст символа табуляции, в противном случае – обрабатывается системой. Для ввода символа табуляции в этом случае следует нажать Ctrl-Tab


Компонент TButton
Компонент TButton представляет собой стандартную кнопку и широко используется для управления программами. Кнопка может содержать текст описывающий выполняемое ей действие.
Property Cancel: Boolean;
Если имеет значение True, событие OnClick кнопки возникает при нажатии клавиши Esc

Property Default: Boolean;
Если имеет значение True, событие OnClick кнопки возникает при нажатии клавиши Enter

Property Enabled: Boolean:
Если имеет значение False, то кнопка недоступна для нажатия

TModalResult =
Low(lnteger) .. High (Integer);
Property TModalResult;
Определяет результат, с которым было закрыто модальное окно

В терминологии Windows модальными окнами называются такие специальные окна, которые, раз появившись на экране, блокируют работу пользователя с другими окнами вплоть до своего закрытия. Если у кнопки определено свойство ModalResult, то нажатие на нее приводит к закрытию модального окна и возвращению в программу значения ModalResult как резултата диалога с пользователем. В Delphi определены следующие стандартные значения ModalResult:
mrNone
Модальное окно не закрывается

mrOk
Была нажата кнопка Ok

mrCancel
Была нажата кнопка Cancel

mrAbort
Была нажата кнопка Abort

mrRetry
Была нажата кнопка Retry

mrIgnore
Была нажата кнопка Ignore

mrYes
Была нажата кнопка Yes

mrNo
Была нажата кнопка No

mrAll
Была нажата кнопка Аll


Компонент TCheckBox
Кнопка с независимой фиксацией позволяет выбрать или отменить определенную функцию. Свойство State позволяет установить значение кнопки. Кнопка может находиться во включенном, выключенном и неактивном состоянии.
TLeftRight = (taLeftJustify, taRightJustify);
Property Alignment: TLeftRight;
Определяет положение текста: taLeftJustify – с левой стороны компонента; taRightJustify – с правой стороны

Property AllowGrayed: Boolean;
Разрешает (запрещает) использование неактивного состояния cbGrayed

Property Checked: Boolean;
Содержит выбор пользователя типа Да/Нет. Состояния cbUnchecked и cbGrayed отражаются как False

TCheckBoxState = (cbUnchecked, cbChecked, cbGrayed);
Property State: CheckBoxState;
Содержит состояние компонента: cbUnchecked – нет; cbChecked – да; cbGrayed –неактивен


Компонент RadioButton
Кнопки с зависимой фиксацией предназначены для выбора одной опции из нескольких взаимоисключающих, поэтому таких кнопок должно быть как минимум две. Для группировки кнопок с зависимой фиксацией внутри формы их необходимо разместить внутри компонента Panel, GroupBox или ScrollBox. Состояние кнопки содержится в свойстве Checked.

Компонент TListBox
Интерфейсный элемент этого типа содержит список элементов, которые могут быть выбраны при помощи клавиатуры или мыши. В компоненте предусмотрена возможность программной прорисовки элементов, поэтому список может содержать не только строки, но и произвольные изображения.
Property Canvas: TCanvas;
Канва для программной прорисовки элементов

Property Columns: Longint;
Определяет количество колонок элементов в списке

Property ExtendedSelect: Boolean;
Если ExtendedSelect=True и MultiSelect=True, выбор элемента без одновременного нажатия Crtl или Alt отменяет предыдущий выбор

Property IntegralHeight: Boolean;
Если IntegralHeight=True и Style<>lbOwnerDraw–Variable, в списке показывается целое число элементов

Property ItemIndex: Integer;
Содержит индекс сфокусированного элемента. Если MultiSelect=False, совпадает с индексом выделенного элемента

Property ItemHeight: Integer;
Определяет высоту элемента в пикселях для Style=lbOwnerDrawFixed

Property Items: TStrings;
Содержит набор строк, показываемых в компоненте

Property Multiselect: Boolean;
Разрешает/отменяет выбор нескольких элементов

Property SelCount: Integer:
Содержит количество выбранных элементов

Property Selected[X: Integer]: Boolean;
Содержит признак выбора для элемента с индексом Х (первый элемент имеет индекс 0)

Property Sorted: Boolean;
Разрешает/отменяет сортировку строк в алфавитном порядке

TlistBoxStyle = (IbStandard, lbOwnerDrawFixed, lbOwnerDrawVariable); Property Style: TUstBoxStyle;
Определяет способ прорисовки элементов: IbStandard элементы рисует Windows, lbOwnerDrawFixed – рисует программа, все элементы имеют одинаковую высоту, определяемую свойством ItemHeight, lbOwnerDrawVariable – рисует программа, элементы имеют разную высоту

Property TopIndex: Integer;
Индекс первого видимого в окне элемента


Компонент TComboBox
Комбинированный список представляет собой комбинацию списка TListBox и редактора TEdit и поэтому большинство его свойств и методов заимствованы у этих компонентов.
Существуют пять модификаций компонента, определяемые его свойством Style: csSimple, csDropDown, csDropDownList, csOwnerDrawFixed и csOwnerDrawVariable. В первом случае список всегда раскрыт, в остальных раскрывается после нажатия кнопки справа от редактора. В модификации csDropDownList редактор работает в режиме отображения выбора и его нельзя использовать для ввода новой строки. Модификации csOwnerDrawFixed и csOwnerDrawVariable используются для программной прорисовки модификации csDropDown.
Свойство DropDownCount определяет количество элементов списка появление которых еще не приводит к необходимости прокрутки списка. Свойство DroppedDown определяет, раскрыт ли список в данный момент.

Компонент TScrollBar
Компонент TScrollBar является полосой прокрутки и обычно используется для визуального управления значением какой-либо величины.
SrollBarKind = (sbHorizontal, sbVertical); Property Kind: TScrollBarKind;
Определяет ориентацию компонента: sbHorizontal – бегунок перемещается по горизонтали; sbVertical – бегунок перемещается по вертикали

Property LargeChange: TScrollBarInc:
«Большой» сдвиг бегунка (при щелчке мышью рядом с концевой кнопкой)

Property Max: Integer;
Максимальное значение диапазона изменения числовой величины

Property Min: Integer;
Минимальное значение диапазона изменения числовой величины

Property Position: Integer;
Текущее значение числовой величины

Property SmallChange: TScrollBarInc;
«Малый» сдвиг бегунка (при щелчке мышью по концевой кнопке)


Компонент TGroupBox
Этот компонент служит контейнером для размещения дочерних компонентов и представляет собой прямоугольное окно с рамкой и текстом разрыве рамки. Обычно с его помощью выделяется группа управляющих элементов, объединенных по функциональному назначению. После того как компоненты помещены в группу, она становится их родительским классом.

Компонент TRadioGroup
Компонент класса TRadioGroup представляет собой специальный контейнер, предназначенный для размещения зависимых переключателей класса TRadioButton. Каждый размещаемый в нем переключатель помещается специальный список Items и доступен по индексу, что упрощает обслуживние группы.

Property Columns: Integer;
Определяет количество столбцов-переключателей

Property ItemIndex: Integer;
Содержит индекс выбранного переключателя

Property Items: TStrings;
Содержит список строк с заголовками элементов. Добавление (удаление) элементов достигается добавлением (удалением) строк списка Items


Компонент TPanel
Панель используется в качестве контейнера для расположения других интерфейсных элементов.
Property BevelInner: TpanelBevel;
Определяет стиль внутренней кромки

Property BevelOuter: TpanelBevel;
Определяет стиль внешней кромки

TBevelWidth = 1..Maxlnt;
Property BevelWidth: TBevelWidth;
Задает ширину кромок в пикселях

TBorderStyle = bsNone..bsSingle; Property BorderStyle: TBorderStyle;
Определяет стиль рамки: bsNone – нет рамки; bsSingle – компонент по периметру обводится линией толщиной в 1 пиксель

TborderWidth: 0..Maxint;
Property BorderWidth: TBorderWidth:
Определяет расстояние в пикселях от внешней кромки до внутренней

Property FullRepaint: Boolean;
Разрешает (запрещает) перерисовку панели и всех ее дочерних элементов при изменении ее размеров


3. Компоненты страницы ADDITIONAL

Компонент TBitBtn
Пиктографическая кнопка TBitBtn представляет собой разновидность стандартной кнопки TButton, которая помимо текста может содержать графическое изображение. Растровое изображение определяется с помощь свойства Glyph. В комплект поставки Delphi (поддиректория Images / Buttons входит около 160 различных вариантов растровых изображений для кнопок). Кроме того, пользователь может самостоятельно создать растровое изображения с помощью встроенного в Delphi графического редактора.
Свойство Kind позволяет выбрать одну из 11 стандартных разновидность кнопки. Нажатие любой из кнопок, кроме bkCustom и bkHelp, закрывает модальное окно и возвращает в программу результат mrXXX: bkOk – mrOk, bkCancel – mrCancel и т.д. Кнопка bkClose для модального окна возвращает mrCancel, a для главного окна программы – закрывает его и завершает работу программы. Кнопка bkHelp автоматически вызывает раздел справочной службы, связанный с HeIpContext формы, на которую она помещена.
Property Glyph: TBitmap:
Определяет связанные с кнопкой растровые изображения (до 4)

TBitBtnKind = (bkCustom, bkOK, bkCancel, bkHelp, bkYes,bkNo, bkClose, bkAbort, bkRetry, bkIgnore,bkAII);
Property Kind: TbitBtnKind;
Определяет разновидность кнопки

TButtonLayout = (blGlyphLeft, bIGlyphRight, bIGlyphTop, bIGlyphBottom);
Property Layout: TbuttonLayout;
Определяет край кнопки, к которому прижимается пиктограмма

Property Margin: Integer:
Определяет расстояние в пикселях от края кнопки до пиктограммы

Property NumGlyphs: TNumGlyphs; TNumGlyphs:1..4;

Определяет количество растровых изображений. Таких состояний может быть четыре: нормальное, запрещенное, нажатое, и утопленное

Property Spacing: Integer;
Определяет расстояние в пикселях от пиктограммы до надписи на кнопке

TButtonStyle = (bsAlutoDetect, bsWin31, bsNew);
Property Style: TbuttonStyle.;
Определяет стиль оформления кнопки, зависящий от операционной системы


Компонент TSpeedButton
Еще один вариант кнопки, который отличается от TBitBtn тремя обстоятельствами: во-первых, не предусмотрен вывод надписи, во-вторых, имеется возможность фиксации в утопленном состоянии и, в-третьих, она не может закрыть модальное окно.

Компонент TMaskEdit
Специализированный редактор TMaskEdit предназначен для ввода текста, соответствующего некоторому шаблону, задаваемому свойством EditMask: String. Если это свойство не задано, TMaskEdit работает как обычный редактор TEdit.
Шаблон состоит из трех частей, отделенных друг от друга символами «;». Первая часть задает маску ввода, вторая - это символ «О» или «1», определяющий, записывается ли в Text результат наложения маски или исходный текст («О» -исходный текст). В третьей части указывается символ, который в окне редактора будет стоять в полях, предназначенных для ввода символов. Описатели полей ввода представлены в следующей таблице:
Символ
Поле

L
Должно содержать букву

1
Может содержать букву

А
Должно содержать букву или цифру

а
Может содержать букву или цифру

С
Должно содержать любой символ

с
Может содержать любой символ

0
Должно содержать цифру

9
Может содержать цифру

#
Может содержать цифру, “+”, “–”


Специальные символы:
Символ
Значение

\
Следующий символ - литерал. Позволяет вставить в маску литералы из символов описателей полей ввода и специальных символов


На это место вставляется символ-разделитель Windows для часов, минут, секунд

/
На это место вставляется символ-разделитель Windnws для полей даты.

/
Разделитель частей шаблона

!
Подавляет все ведущие пробелы

>
Все следующие за ним поля ввода преобразуют буквы к заглавным

<
Все следующие за ним поля ввода преобразуют буквы к строчным

о
Отменяет преобразование букв


Компонент TDrawGrid
Компонент используется для отображения информации в виде таблицы. Таблица делится на две части – фиксированную и рабочую. Фиксированная часть служит для показа заголовков столбцов/рядов и для ручного управления их размерами. Рабочая часть содержит произвольное количество столбцов и рядов, содержащих как текстовую, так и графическую информацию, и может изменяться программно.
Property BorderStyle: TBorderStyle;
Определяет наличие или отсутствие внешней рамки таблицы

Property Col: Longint;
Содержит номер столбца сфокусированной ячейки

Property CotCount: Longint;
Содержит количество столбцов таблицы

Property ColWidths[lndex: Longint]: Integer;
Содержит ширину столбца с индексом Index

Property DefaultColWidth: Integer;
Содержит умалчиваемое значение ширины столбца

Property DefaultDrawing: Boolean;
Разрешает/запрещает автоматическую прорисовку служебных элементов таблицы-фиксированной зоны, фона и прямоугольника сфокусированной ячейки и т.п.

Property DefaultRowHeight: Integer;
Содержит умалчиваемую высоту рядов

Property EditorMode: Boolean;
Разрешает/запрещает редактирование ячеек. Игнорируется, если свойство Options включает goAlwayseShowEditor или не включает soEditing

Property FixedColor: TColor:
Определяет цвет фиксированной зоны

Property FixedCols: Integer:
Определяет количество столбцов фиксированной зоны

Property FixedRows: Integer;
Определяет количество рядов фиксированной зоны

Property GridHeight: Integer;
Содержит высоту таблицы

Property GridLineWidth: Integer;
Определяет толщину линий, расчерчивающих таблицу

Property GridWidth: Integer;
Содержит ширину таблицы

Property LeftCol: Longint;
Содержит номер самого левого столбца, видимого в зоне прокрутки

Property Options: TGridOptions;
Содержит параметры таблицы (см. ниже)

Property Row: Longint;
Содержит номер ряда сфокусированной ячейки

Property RowCount: Longint:
Содержит количество рядов таблицы

Property RowHeights[lndex: Longint]: Integer;
Содержит высоту ряда с индексом Index

TGridRect = record
case Integer of
0: (Left, Top, Right/ Bottom: Longint);
1: (TopLeft, BottomRight: TGridCoord), end;
Property Selection: TGridRect;
Определяет группу выделенных ячеек в координатах: левая верхняя и правая нижняя ячейки(нумерация столбцов и рядов идет от нуля, включая столбцы и ряды фиксированной зоны). После выделения сфокусированной окажется правая нижняя ячейка

Property TabStops[lndex: Longint]: Boolean;
Разрешает/запрещает выбирать столбец с индексом Index при обходе ячеек клавишей Tab. Игнорируется, если Options не содержит goTabs

Property TopRow: Longint;
Содержит номер самого верхнего ряда, видимого в прокручиваемой зоне ячеек

Property VisibleColCount: Integer;
Содержит количество столбцов, полностью видимых в зоне прокрутки

Property VisibleRowCount: Integer;
Содержит количество рядов, полностью видимых в зоне прокрутки


Элементы множества TGridOptions имеют следующий смысл:
goFixedVertLine
Столбцы фиксированной зоны разделяются вертикальными линиями

goFixedHorzLine
Ряды фиксированной зоны разделяются горизонтальными линиями

goVertLine
Столбцы рабочей зоны разделяются вертикальными линиями

goHorzLine
Ряды рабочей зоны разделяются горизонтальными линиями

goRangeSelect
Разрешено выделение нескольких ячеек. Игнорируется, если включен элемент goEdit

GoDrawFocus-Selected
Разрешено выделять сфокусированную ячейку так же, как выделенные.

GoRowSizing
Разрешено ручное (мышью) изменение высоты строк

GoColSizing
Разрешено ручное изменение ширины рядов

GoRowMoving
Разрешено ручное перемещение рядов

goColMoving
Разрешено ручное перемещение столбца

goEditing
Разрешено редактирование ячейки. Игнорируется, если включен элемент goRowSelect. Редактирование начинается после щелчка мыши или нажатия клавиши F2 и завершается при щелчке по другой ячейке или нажатии Enter

goTabs
Разрешено выбирать ячейки клавишей Tab (Shifts-Tab)

goRowSelect
Обязывает выделять сразу все ячейки ряда

GoAlwaysShowEditor
Разрешено редактировать сфокусированную ячейку. Игнорируется, если не включен элемент goEditing

GoThumbTracking
Разрешено обновление при прокрутке. Если этот элемент отсутствует, обновление ячеек произойдет только после окончания прокрутки


Компонент TStringGrid
В отличие от компонента TDrawGrid может отображать только текстовую информацию.
Property Cells[ACol, ARow: Integer]: String;
Определяет содержимое ячейки с табличными координатами [ACol, ARow]

Property Cols[Index: Integer]: TStrings;
Содержит все строки колонки с индексом Index

Property Objects [ACol, ARow: Integer]: TObject;
Обеспечивает доступ к объекту, связанному с ячейкой [ACol, ARow]

Property Rows[lndex: Integer]: TStrings;
Содержит все строки ряда с индексом Index


Компонент TImage
Этот компонент служит для размещения на форме одного из трех поддерживаемых Delphi типов изображений: растровой картинки, пиктограмм или метафайла.

Компонент TShape
Компонент рисует одну из простейших геометрических фигур (прямоугольник, квадрат, скругленный прямоугольник, скругленный квадрат эллипс, окружность).

Компонент TBevel
Предназначен для выделения группы элементов или отделения их друг для друга и носит чисто оформительский характер.

Компонент TScrollBox
Компонент является контейнером для размещения других компонентов имеет возможность прокрутки.

Компонент TCheckListBox
Группирует независимые переключатели, позволяя обратиться к любому из них по индексу.
Property AllowQrayed: Boolean;
Разрешает (запрещает) использовать в переключателях третье состояние cbGrayed

Property Checked[Index: Integer]: Boolean;
Содержит выбор пользователя типа Да/Нет для переключателя с индексом Index. Состояния cbUnchecked и cbGrayed отражаются как False

Property Sorted: Boolean:
Сортирует по алфавиту надписи на переключателях

Property State[Index: Integer]: TCheckBoxState;
Содержит состояние переключателя с индексом Index: cbUncheeked; cbChecked: cbGrayed


Компонент TSplitter
Предназначен для ручного (с помощью мыши) управления paзмерами контейнеров TPanel, TGroupBox или подобных им во время прогона программы.
Property Beveled: Booleanж
Управляет трехмерным изображением компонента. Если False, компонент виден как узкая полоска фона между разделяемыми им компонентами

NaturalNumber = 1..High(Integer); Property MinSize: NaturalNumber
Содержит минимальный размер любого из компонентов, которые разделяет TSplitter. Если выравнивание alLefi или alRight, минимальная ширина компонента - слева и справа от TSplitter, если аГГор или alBottom, минимальная высота компонента - выше или ниже него


Компонент TStaticText
Подобен компоненту TLabel за исключением того, что, во-первых, он имеет Windows-окно и, во-вторых, в его свойстве BorderStyle: добавлено значение sbsSunken, которое создает иллюзию «вдавленности» компонента.

Компонент TChart
Облегчает создание специальных полей для графического представления данных.

4. Компоненты страницы DIALOGS

Правка использования диалоговых панелей
Работа со стандартными диалоговыми окнами осуществляется в три этапа:
1. На форму помещается соответствующий компонент и осуществляется настройка его свойств. Следует обратить внимание на то, что компонент-диалог не виден в момент работы программы, видно лишь создаваемое им стандартное окно.
2. Осуществляется вызов стандартного для диалогов метода Execute, который создает и показывает настроенное окно на экране. Вызов этого метода обычно располагается внутри обработчика какого-либо события. После обращения к Execute на экране появляется соответствующее диалоговое окно. Окно диалога является модальным окном, поэтому сразу после обращения к нему дальнейшее выполнение программы приостанавливается до тех пор, пока пользователь не закроет окно.
3. Использование введенных из диалогового окна данных (имя файла, настройки принтера и т.д.) для продолжения работы программы.

Компоненты TOpenDialog u TSaveDialog
Эти компоненты имеют идентичные свойства и отличаются только внешним видом. Свойство FileName: (тип String) содержит маршрут поиска и имя выбранного файла при успешном завершении диалога программы. Для проверки наличия файла на диске применяется глобальная функция FileExists. Свойство Filter: String используется для фильтрации (отбора) файлов, показываемых в диалоговом окне. Это свойство можно устанавливать с помощью специального редактора или программно. Для доступа к редактору достаточно щелкнуть по кнопке в строке Filter окна инспектора объектов. При программном вводе фильтры задаются одной длинной строкой, в которой символы «|» служат для разделения фильтров друг от друга, а также для разделения описания фильтруемых файлов от соответствующей маски выбора. С помощью свойства DefaultExit: String формируется полное имя файла, если при ручном вводе пользователь не указал расширение. В этом случае к имени файла прибавляется разделительная точка.
Настройка диалога может варьироваться с помощью свойства
TOpenOption = (of Readonly, ofOverwritePrompt, ofHideReadOnly,
ofNoChangeDir, ofShowHelp, ofNoValidate, ofAllowMultiSelect, ofExtensionDifferent, ofPathMustExist, ofFileMustExist, ofCreatePrompt, ofShareAware, ofNoReadOnlyRetuni.ofNoTestFileCreate, oiNoNetworkButtor ofNoLongNames, oЮldStуleDialog, ofNoDereferenceLinks);
TOpenOptions = set of TOpenOption;
property Options: TOpenOptions;
Значения этого свойства имеют следующий смысл:
ofReadOnly
Показывает только шрифты с набором символов Windows

ofOverwritePromt
Требует согласия пользователя при записи в существующий файл

ofHideReadOnly
Прячет переключатель Только для чтения

ofNochangeDir
Запрещает смену каталога

ofShowHelp
Включает в окно кнопку HELP

ofNoValidate
Запрещает автоматическую проверку правильности набираемых в имени файла символов

ofAllowMultiSelec
Разрешает множественный выбор файлов

ofExtensiondiffer
При завершении диалога наличие этого значения в свойстве Options говорит о том, что пользователь ввел расширение, отличающееся от умалчиемого

ofPathMustExist
Разрешает указывать файлы только из существующих каталогов

ofFileMustExist
Разрешает указывать только из существующие файлы

ofCreatePromt
Требует подтверждения для создания несуществующего файла

ofShareAware
Разрешает выбирать файлы, используемые другими параллельно выполняемыми программами

ofNoreadOnlyRetur
Запрещает выбор файлов, имеющих атрибут «Только для чтения»

ofNotestfileCreat
Запрещает проверку доступности сетевого или локального диска

ofNoNetworkButton
Запрещает вставку кнопки для создания сетевого диска

ofNoLongNames
Запрещает использование длинных имен файлов

ofOldStyleDialog
Создает диалог в стиле Windows 3.х


Компоненты TOpenPictureDialog u TSavePictureDialog
Специализированные диалоги для открытия и сохранения графических файлов являются расширенными вариантами компонентов TOpenDialog и TSaveDialog, в которых предусмотрено наличие стандартного фильтра для выбора графических файлов и панель предварительного просмотра.

Компонент TFontDialog
Компонент используется для вызова стандартной диалоговой панели выбора шрифтов и их характеристик. Свойство Device определяет тип устройства, для которого выбирается fdScreen - экран; fdPrinter - принтер; fdBoth - шрифты, поддерживаемые и экраном, и принтером. Диапазон возможных значений размеров шрифтов определяется свойствами MinFontSize и MaxFontSize. Значения этих свойств задаются в пунктах (1 пункт равен приблизительно 0.36мм). Если свойства содержат 0, ограничения на размер шрифта отсутствуют. Свойство Options используется для настройки диалога. Значения этого свойства имеют следующий смысл:
fdAnsiOnly
Показывает только шрифты с набором символов Windows

fdTrueTypeOnly
Показывает только TrueType-шрифты

fdEffects
Включает в окно переключатели "Подчеркнутый" и Зачеркнутый, а также список выбора цвета шрифта

fdFixedPitchOnly
Включает только моноширинные шрифты

fdForceFontExist
Предупреждает о выборе несуществующего шрифта

fdNoFaceSel
Запрещает выделение имени шрифта в момент открытия окна

fdNoOEMFonts
Запрещает выбор MS-DOS-шрифтов

fdNoSimLlIations
Исключает шрифты, которые синтезируются графическим интерфейсом Windows

fdNoSizeSel
Запрещает выделение размера шрифта в момент открытия окна

fdNoStyleSel
Запрещает выделение стиля шрифта в момент открытия окна

fdNoVectorFonts
Исключает векторные шрифты

fdShowHelp
Включает в диалоговое окно кнопку Help

fdWysiwyg
Включает шрифты, которые поддерживаются и экраном, и принтером

fdLimitSize
Включает ограничения на размер шрифта, заданные свойствами MaxFontSize и MinFontSize

fdScalableOnly
Включает только масштабируемые шрифты (векторные и TrueType)

fdApplyBlltton
Включает в окно кнопку «Применить»


Компонент. TColorDialog
Компонент используется для вызова и обслуживания стандартт диалогового окна выбора цвета.

Компонент TPrintDialog
Компонент служит для создания стандартного диалогового окна для выб - параметров печати.
property Collate: Boolean;
Если имеет значение True, то окно показывается с выбранным переключателем «Разобрать» (Collate). Если этот переключатель выбран, печать нескольких) копий документа будет идти по копиям: сначала первая копия, затем вторая и т.д., в противном случае - по страницам: сначала все копии первой страницы, затем второй и т.д.

property Copies: Integer;
Определяет количество копий (0 - одна копия)

property FromPage: Integer;
Определяет начальную страницу печати

property MaxPage: Integer;
Определяет верхнюю границу диапазона страниц для свойств FromPage, ToPage

property MinPage: Integer;
Определяет нижнюю границу диапазона страниц для свойств FromPage, ToPage

property Options: TPrintDialogOptions;
Определяет настройку окна: роPrintToFile –печатать файл; poPageNums - разрешает выбор диапазона страниц; poSelection -разрешает печать выбранного текста; poWarning - предупреждать пользователя о неустановленном принтере; poHelp - вставить в окно кнопку Help; poDisablePrintToFile - запрещает печать файл

property PrintRange: TPrintRange;
Определяет диапазон печатаемых страниц: prAll Pages - все страницы; prSelection -выделенный фрагмент текста; prPageNums -страницы по номерам

property PrintToFile: Boolean;
Содержит True, если пользователь выбрал печать в файл

property ToPage: Integer;
Определяет конечную страницу печати


Компонент TPrinterSetupDialog
Компонент создает окно настройки параметров принтера, вид которого зависит от типа принтера. Этот диалог взаимодействует с драйвером принтера и не возвращает в программу никакой информации. Поэтому его метод Execute - процедура, а не функция.

Компонент TFindDialog
Стандартное диалоговое окно компонента TFindDialog используется для поиска фрагмента текста.
property FindText: String;
Указывает образец для поиска

property Left: Integer;
Содержит горизонтальную позицию левого верхнего угла места появления окна

property Options: TFindOptions:
Определяет настройку диалога

property Position: TPoint;
Содержит горизонтальную и вертикальную позицию левого верхнего угла места появления окна

property Top: Integer;
Содержит вертикальную позицию левого верхнего угла места появления окна


Для компонента определен следующий тип, использующийся в свойстве Options: TFindOptions. Его значения имеют следующий смысл:
frDown
Устанавливает поиск вперед по тексту

frDown frFindNext
Сообщает программе, что пользователь нажал кнопку «Найти далее»

frHideMatchCase
Убирает выбор в переключателе «С учетом регистра»

frHideWholeWord
Убирает выбор в переключателе «Только слово целиком»

frHideUpDown
Прячет кнопки выбора направления поиска

frMatchCase
Устанавливает выбор в переключателе «С учетом регистра»

frDisableMatchCase
Запрещает выбор «С учетом регистра»

frDisableUpDown
Запрещает выбор направления поиска

frDisableWholeWord
Запрещает выбор Только слово целиком

frReplace
Используется в компоненте TReplaceDialog и указывает на необходимость замены текущего выбора

frReplaceAll
Используется в компоненте Treplace Dialog и указывает на необходимость замены всех вхождений образца поиска

frWholeWord
Устанавливает выбор в переключателе «Только слово целиком»

frShowHelp
Включает в окно кнопку Help


Компонент TReplaceDialog
Компонент создает и обслуживает окно поиска и замены текстового фрагмента. Класс TReplaceDialog наследует большинство свойств клacca TFindDialog. Дополнительно в компоненте определено свойство ReplaceText (тип String), в котором содержится текст замены, и событие OnReplace, которое возникает при нажатии кнопки «Заменить» или «Заменить все».

Приложение 2

П2. ПРОСТЫЕ ТИПЫ ДАННЫХ ЯЗЫКА OBJECT PASCAL

П2.1. .Целые типы
Диапазон возможных значений целых типов зависит от их внутреннего представления, которое может занимать 1, 2 или 4 байта.
Название
Длина, байт
Диапазон значений

Byte
1
0...255

Shortint
1
-128...+127

Smallint
2
-32 768. ..+32 767

Word
2
0...65 535

Integer
4
-2 147 483 648. ..+2 147 483 647

Longint
4
-2 147 483 648...+2 147 483 647

Cardinal
4
0... 2147483647


К целочисленным типам применимы следующие процедуры и функции:
Обращение
Тип результата
Действие

abs (х)
х
Возвращает модуль х

chr (Byte)
Char
Возвращает символ по его коду

dec(x[,i])

Уменьшает значение х на i, а при отсутствии 1 - на 1

inc(x[,i])

Увеличивает значение v на i, а при отсутствии i - на 1

Hi (word)
Byte
Возвращает старший байт аргумента

Hi(integer)
Byte
Возвращает третий по счету байт

Lo(integer)
Byte
Возвращает младший байт аргумента

Lo (word)
Byte
Возвращает младший байт аргумента

Odd(Longlnt)
Boolean
Возвращает True, если аргумент - нечетное число

Random(word)

Возвращает псевдослучайное число, равномерно распределенное в диапазоне 0...(word)

sqr (х)
x
Возвращает квадрат аргумента

swap (integer)
Integer
Меняет местами байты в слове

swap(word)
Word
Меняет местами байты в слове


П2.2. .Логические типы
К логическим относятся типы Boolean, ByteBool, Bool, WordBool и LongBool. В стандартном Паскале определен только тип Boolean, остальные логические типы введены в Object Pascal для совместимости с Windows: типы Boolean и ByteBool занимают по 1 байту каждый, Bool и WordBool - по 2 байта, LongBool - 4 байта. Значениями логического типа может быть одна из предварительно объявленных констант: False (ложь) или True (истина). Для них справедливы правила:
0rd( False) = 0;
Ord(True) <> 0;
Succ(False) = True;
Pred(True) = False.

П2.3. Символьный тип данных
Символьные типы предназначены для хранения одного символа. Ниже приведена таблица символьных типов.
Тип
Размер в байтах
Что может хранить

ANSIChar
1
Один символ ANSI

WideChar
2
Один символ Unicode

Char
2
Сейчас эквивалентен ANSIChar. В будущих версияхDelphi может быть эквивалентен WideChar

Наличие двух разных типов – ANSIChar и WideChar связано с двумя различными множествами символов: ANSI, каждый символ которого занимает 1 байт, и Unicode, каждый символ которого занимает 2 байта. Первые 256 символов в этих множествах одинаковые и соответствуют символам ASCII от 0 до 255.
Для кодировки в Windows используется код. Первая половина символов с кодами 0...127 постоянна и содержит в себе служебные коды и латинский алфавит. Вторая половина символов с кодами 128...255 меняется для различных шрифтов. Символы с кодами 0...31 относятся к служебным кодам. Если эти коды используются в символьном тексте программы, они считаются пробелами.
Родовым (т.е. обеспечивающим максимальную производительность) является тип Char, который в настоящее время эквивалентен типу ANSIChart. К типу Char применимы операции отношения, а также встроенные функции.

П2.4. Перечисляемый тип
Перечисляемый тип задается перечислением тех значений, которые oн может получать. Каждое значение именуется некоторым идентификатором и располагается в списке, обрамленном круглыми скобками.
Функции, поддерживающие работу с типами-диапазонами:
High (X) - возвращает максимальное значение типа-диапазона, к котором принадлежит переменная X; Low (X) - возвращает минимальное значение типа-диапазона.

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

Real
6
11...12
2,9*10-39...1,7*1039
При наличии сопроцессора использовать нежелательно, т.к. замедляет работу

Single
4
7. ..8
1,5*10-45... 3,4*1038
-

Double
8
15...16
5,0*10-324...1,7*10308
-

Extended
10
19...20
3,4*10-49511,1*104932
Применяется наиболее часто

Comp
8
19...20
-263+263-1
Дробная часть отсутствует

Currency
8
19...20
±922337203685477,5807
Длина дробной части 4 десятичных разряда


Для работы с вещественными типами имеются стандартные функции:
Обращение
Тип параметра
Тип результата
Примечание

Abs(x)
Вещественный, целый
Тип аргумента
Модуль аргумента

АгсТаn(х)
Вещественный
Вещественный
Арктангенс (в радианах)

Cos(x)
Вещественный
Вещественный
Косинус (в радианах)

Ехр(х)
Вещественный
Вещественный
Экспонента

Frac(x)
Вещественный
Вещественный
Дробная часть числа

lnt(x)
Вещественный
Вещественный
Целая часть числа

Ln(x)
Вещественный
Вещественный
Логарифм натуральный

Pi
---
Вещественный
13 EMBED Equation.3 1415=3.141592653...

Random

Вещественный
Псевдослучайное число, равномерно распределенное в диапазоне 0...[1]

Random(x)
Целый
Целый
Псевдослучайное целое число, равномерно распределенное в диапазоне 0. ..x

Randomize


Инициация генератора псевдослучайных чисел

Sin (x)
Вещественный
Вещественный
Синус (в радианах)

Sqr(x)
Вещественный
Вещественный
Квадрат аргумента

Sqrt(x)
Вещественный
Вещественный
Корень квадратный


П2.6. Тип Дата-Время
Тип дата - время определяется идентификатором TDateTime и предназначен для одновременного хранения и даты, и времени. Над данными типа TDateTime определены те же операции, что и над вещественными числами, а в выражениях этого типа могут участвовать константы и переменные целого и вещественного типов.

Приложение 3
П3. ПРОЦЕДУРЫ И ФУНКЦИИ ДЛЯ РАБОТЫ СО СТРОКАМИ

Для работы со строками применяются следующие процедуры и функции (в квадратных скобках указываются необязательные параметры).

П3.1. Процедуры и функции для работы со строками

Function Concat(S1 [, S2, ..., SN]: String)-. String;
Возвращает строку, представляющую собой сцепление строк-параметров S1. S2,... , SN

Function Copy(St: String; Index, Count: Integer): String;
Копирует из строки St Count символов, начиная с символа с номером Index

Procedure Delete(St: String; Index, Count; Integers;
Удаляет Count символов из строки St начиная с символа с номером Index

Procedure lnsert(SubSt: String; St, Index: Integer);
Вставляет подстроку SubSt в строку St начиная с символа с номером Index

Function Length(St: String): Integer;
Возвращает текущую длину строки St

Function Pos(SubSt, St: String): Integer;
Отыскивает в строке St первое вхождение подстроки SubSt и возвращает номер позиции, с которой она начинается. Если подстрока не найдена, возвращается ноль

Procedure SetLength(St: String; NewLength: Integer);
Устанавливает новую (меньшую) длину NewLength строки St, если NewLength больше текущей длины строки, обращение к SetLength игнорируется

П3.2 Подпрограммы npеобразования строк в другие типы

Function StrToCurr(St: String): Currency;
Преобразует символы строки St в целое число типа Currency. Строка не должна содержать ведущих или ведомых пробелов.

Function StrToDate(St: String): TDateTime;
Преобразует символы строки St в дату. Строка должна содержать два или три числа, разделенных правильным для Windows разделителем даты; (в русифицированной версии таким разделителем, является «.») Первое число -день, второе - месяц, если указано третье число, оно задает год

Function StrToDateTime(St: String): TDateTime;
Преобразует символы строки St в дату и время. Строка должна содержать дату и, разделенные пробелом

Function StrToFloat(St: String): Extended;
Преобразует символы строки St в вещественное число. Строка не должна содержать ведущих или ведомых пробелов

Function StrToInt(St: String): Integer;
Преобразует символы строки St в целое число. Строка не должна содержать ведущих или ведомых пробелов

Function StrToIntDef(St: String; Default: Integer): Integer;
Преобразует символы строки St в целое число. Если строка не содержит правильного представления целого числа, возвращается значение Default

Function StrToIntRange(St: String: Min, Max: Longint) : Longint;
Преобразует символы строки St в целое число и возбуждает исключение ERangeError, если число выходит из заданного диапазона Мin Мах

Function StrToTime(St: String): TDateTime;
Преобразует символы строки St во время

Procedure Val(St: String; var X; Code: Integer);
Преобразует строку символов St во внутреннее представление целой или вещественной переменной X, которое определяется типом этой переменной. Параметр Code содержит ноль, если преобразование прошло успешно, и тогда в Х помещается результат преобразования; в противном случае он содержит номер позиции в строке St, где обнаружен ошибочный символ, и в этом случае содержимое Х не меняется. В строке St могут быть ведущие и (или) ведомые пробелы

П3.3. Подпрограммы обратного преобразования

Function DateToStr(Value: TDateTime): String:
Преобразует дату из параметра Value в строку символов

Function DateTimeToStr (Value: TDateTime): String;
Преобразует дату и время из параметра Value в строку символов

Procedure DateTimeToString (var St: String; Format: String; Value: TDataTime);
Преобразует дату и время из параметра Value в строку St

Function FormatDateTime (Format: String; Value: „ TDateTime): String;
Преобразует дату и время из параметра Value в строку символов

Function FloatToStr( Value: Extended): String:
Преобразует вещественное значение Value в строку символов

Function FloatToStrF(Value: Extended; Format: TFIoatFor-mat; Precision, Digits: Integer) : String;
Преобразует вещественное значение Value в строку символов с учетом параметров Precision и Digits (см. пояснения ниже)

Function FormatFloat(Format: String; Value: Extended): String;
Преобразует вещественное значение Value в строку

Function lntToStr(Value: Integer): String;
Преобразует целое значение Value в строку символов

Function TimeToStr(Value: TDateTime): String;
Преобразует время из параметра Value в строку символов

Procedure Str(X [:-width [: Decimals]]; var St: String);
Преобразует число X любого вещественного или целого типа в строку символов St; параметры Width и Decimals, если они присутствуют, задают формат преобразования: Width определяет общую ширину поля, выделенного под соответствующее символьное представление вещественного или целого числа X, a Decimals -количество символов в дробной части (этот параметр имеет смысл только в том случае, когда Х – вещественное число)


ЛИТЕРАТУРА


Delphi 7. Учебный курс / С.И. Бобровский. – СПб.: Питер, 2004. – 736 с.
Программирование в среде Delphi: лабораторный практикум для студентов всех специальностей / Под ред. Синицына А.К. – Мн.: БГУИР, 1998.
Основы информатики и вычислительной техники. Методические указания и варианты контрольных работ для студентов заочного отделения специальности 250107 «Экономика и управление на предприятии». Фурунжиев Р.И., Силкович Ю.Н., Ероховец Т.В., Исаченко Е.М., Ротапринт БГАТУ, Мн.: 2002.
Программирование в Delphi. Методические указания к выполнению курсовой работы по дисциплине «Основы информатики и вычислительной техники» для студентов заочного обучения факультета предпринимательства и управления.. Фурунжиев Р.И., Ротапринт БАТУ, Мн.: 2003. – 39 с.
Программирование на языке Object Pascal в визуальной среде Delphi. Методические указания к выполнению курсовой работы. Фурунжиев Р.И., Ероховец Т.В., Львова О.М. , БГАТУ, Мн.: 2004, – 46 с.









13PAGE 15


13PAGE 141015



SpinEdit

BitBtn

Label5

Label4

Label3

Label2

ComboBox

Label1

SpinEdit

Memo

Label

BitBtn

Edit

Label

Edit

Button

BitBtn

Memo



Root EntryEquation NativeEquation NativeEquation NativeEquation NativeEquation NativeEquation NativeEquation NativeEquation NativeEquation NativeEquation NativeEquation NativeEquation NativeEquation NativeEquation NativeEquation NativeEquation NativeEquation NativeEquation NativeEquation NativeEquation NativeEquation NativeEquation NativeEquation NativeEquation NativeEquation NativeEquation NativeEquation NativeEquation NativeEquation NativeEquation NativeEquation NativeEquation NativeEquation NativeEquation NativeEquation NativeEquation NativeEquation NativeEquation NativeEquation NativeEquation NativeEquation NativeEquation NativeEquation NativeEquation NativeEquation NativeEquation NativeEquation NativeEquation NativeEquation Native

Приложенные файлы

  • doc 8812580
    Размер файла: 1 MB Загрузок: 0

Добавить комментарий