Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Основы программирования в Delphi. Учебно-методическое пособие
.pdf
Основы программирования в Delphi
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
for k:=1 to n do
a[k]:=strtoint( StringGrid1.cells[k-1,0]);
label2.Caption:='Максимальный элемент '+
inttostr(maxRn(a,n));
label3.Caption:='Максимальный элемент '+
inttostr(max(a,n))+' (рекурсивным методом)';
end;
end.
КОНТРОЛЬНЫЕ ВОПРОСЫ
1. Какой алгоритм называется рекурсивным?
2. Приведите примеры рекурсивных вычислений.
3. В чем преимущество рекурсивной функции?
71

Основы программирования в Delphi
9. ИСПОЛЬЗОВАНИЕ ЗАПИСЕЙ В DELPHI
Запись представляет собой объединенный общим именем набор данных
различных типов. Отдельные данные записи называются полями.
Описание записи имеет следующий вид:
type
название_типа_записи = record
Имя_поля_1 : тип_поля_1;
. . . . . . . . . . . . . . . . . . . . . . .
Имя_поля_N : тип_поля_N;
end;
Например, описание записи, характеризующей студента (содержащую имя,
адрес, номер его телефона и возраст студента) может выглядеть так:
type
TStudent = record
Name: string;
Address: string;
Phone: integer;
Year: 18. .45;
end;
Для обращения к элементу записи сначала указывается имя переменной,
затем точка и название соответствующего элемента.
var
Stud1 : TStudent;
begin
Stud1. Name := „Андрей‟;
Stud1.Address := „Проспект мира, д. 66, кв. 32‟;
Stud1.Phone := 734554;
Stud.Year := 21;
Когда надо работать с большим числом элементов переменной-записи,
каждый раз предварительно указывать ее имя неудобно. В Pascal имеется ключевое слово with, которое позволяет опускать имя переменной в логическом
блоке. Ниже приведем фрагмент программы с использованием ключевого слова
with:
72

Основы программирования в Delphi
with Stud1 do
begin
Name := „Виталий‟;
Address := „Проспект мира, д. 23, кв. 56‟;
Phone := 467228;
end;
После ключевого слова with можно указывать не одно, а несколько имен
переменных-записей:
with Stud1, Stud2, Stud3 do
begin
. . . . . . . . . . .
end;
КОНТРОЛЬНЫЕ ВОПРОСЫ
1. Что такое запись?
2. Как определяется запись в Delphi?
3. Каким образом происходит заполнение полей записи?
4. Чем отличается запись от массива?
73

Основы программирования в Delphi
10. ПОДПРОГРАММЫ (ФУНКЦИИ И РОЦЕДУРЫ)
10.1 Процедуры и функции
Как и во многих языках программирования, в Delphi можно создать два
типа подпрограмм: процедуры и функции. Заголовок процедуры начинается через слово procedure, а заголовок функции – через слово function. Далее в скоб-
ках указывается список параметров. Тело подпрограммы заключается в логиче-
ские (операторные) скобки begin . . . end.
Список параметров содержит параметры, каждый из которых представляет
собой произвольное имя переменной и соответствующий ей тип через двоеточие. Если несколько параметров имеют одинаковый тип, то их можно перечис-
лить через запятую. Например,
procedure Compare( A1, A2: Byte; Stroka: String);
В случае функции также показывается через двоеточие тип возвращаемого
значения. Например,
function Game (str: string): integer;
Когда происходит обращение к подпрограмме, переменным, указанным в
списке параметров в описании (формальные параметры), присваиваются значения, указанные в списке параметров в момент вызова (фактические парамет-
ры), после чего выполнятся необходимые вычисления. Это называется передачей параметров по значению. Формальные параметры играют роль локальных
переменных.
В списке параметров перед любой переменной разрешается указывать
ключевое слово var. Например,
procedure MyProc (X: Integer; var Y: Integer);
Здесь считается, что параметр Y будет передаваться по имени. Параметр
передаваемый по имени может изменять свое значение в подпрограмме и это
новое значение при выходе из подпрограммы будет сохраняться. Поэтому та-
кой параметр играет роль глобальной переменной.
На физическом уровне передача по имени означает, что в качестве такого
параметра подпрограмме передается адрес этой переменной. Поэтому при вы-
зове процедуры MyProc в качестве параметра Y может передаваться заранеее
описанная переменная типа Integer. Использование параметров передаваемых
по имени эффективно, при передаче параметра, который содержит большой
объем данных (массивы, записи и т.п.).
Возврат значений из функции
74

Основы программирования в Delphi
Если описывается функция, то в ее теле надо определить, как значение бу-
дет возвращено в вызываемую подпрограмму. Для этого есть два способа.
1. Соответствующее значение присваивается переменной, имя которой
совпадает с названием функции.
function Sum (A, B: Integer): integer;
begin
Sum:= A + B;
end;
Имя функции для возврата значения разрешается указывать только в левой
части оператора присваивания.
Соответствующее значение присваивается специальной локальной пере-
менной Result (эту переменную описывать не надо).
function Sum (A, B: Integer): integer;
begin
Result:= A + B;
end;
10.2 Использование модулей в Delphi
Модуль - это автономно компилируемая программная единица программы,
включающая в себя процедуры, функции, а также различные разделы описаний.
Структура модуля в Delphi содержит следующие основные части:
1. заголовок модуля;
2. интерфейсная часть модуля;
3. исполняемая часть модуля;
4. инициирующая часть модуля;
5. завершающая часть модуля.
Примечание. Последние две части в модуле могут и отсутствовать.
1. Заголовок модуля состоит из зарезервированного слова Unit и следующего за
ним имени модуля. Имя модуля обязательно должно совпадать с именем
дискового файла. Использование имени модуля в разделе Uses основной программы приводит к установлению связи модуля с основной программой.
2. Интерфейсная часть модуля расположена между ключевыми словами
interface и implementation и содержит объявление тех конструкций и разделов описаний модуля, которые должны быть доступны другим программам.
75

Основы программирования в Delphi
yyxxz
2211
cossin)36ln(5
3. Исполняемая часть модуля начинается ключевым словом implementation и
содержит описание процедур и функций, объявленных в интерфейсной части. Она может также содержать разделы описаний вспомогательных типов,
констант, переменных, процедур и функций, которые будут использоваться
только в исполняемой части и не будут доступны внешним программам.
4. Инициирующая часть модуля начинается ключевым словом initialization и
содержит операторы, которые исполняются перед началом выполнения
основной программы (может отсутствовать).
5. Завершающая часть модуля начинается ключевым словом finalization и вы-
полняется в момент окончания работы программы (может отсутствовать).
В среде Delphi 7 модули могут создаваться как со своей формой, так и без
нее. Для создания нового модуля без своей формы необходимо в меню File выбрать New-Unit. В результате будет создан файл с заголовком Unit Unit2. Имя
модуля можно изменить на другое, отвечающее внутреннему содержанию модуля, например Unit biblio. Для этого необходимо сохранить содуль с новым
именем (например, biblio.pas). Следует обратить внимание на то, что имя файла
должно совпадать с именем модуля.
Для того чтобы подключить модуль к проекту, необходимо в меню Project
выбрать опцию Add to Project… и выбрать файл, содержащий модуль. После
этого в разделе Uses добавить имя подключаемого модуля - biblio. Теперь в
проекте можно использовать функции, содержащиеся в модуле.
Пример. Рассмотрим пример вычисления значений функции двух пере-
менных:
Данный пример мы разбирали выше. Теперь реализуем его с использова-
нием модуля для вычисления нашей функции. Интерфейс приложения не меня-
ется (рис. 10.1), однако сама функция, значения которой мы собираемся вычис-
лять, теперь оформляется как отдельный модуль MyFunction.
Листинг модуля MyFunction:
Unit MyFunction;
interface
function z(x,y:extended):extended;
implementation
function z;
begin
76

Основы программирования в Delphi
result:=5*exp(11*ln(x))+ln(6*x+3)-sqrt(Sin(y)*sin(y)+cos(y)*cos(y));
end;
end.
Листинг основного модуля формы Unit1:
unit;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, MyFunction;
type
TForm1 = class(TForm)
Edit1: TEdit;
Edit2: TEdit;
Label1: TLabel;
Label2: TLabel;
Button1: TButton;
Edit3: TEdit;
Label3: TLabel;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var x,y:Real;
begin
x:=StrToFloat(Edit1.Text);
y:=StrToFloat(Edit2.Text);
Edit3.Text:=FloatToStr(z(x,y));
end;
end.
77

Основы программирования в Delphi
Рис. 10.1 Использование модулей в Delphi 7
Как мы видим, результат вычислений не изменился.
КОНТРОЛЬНЫЕ ВОПРОСЫ
1. Чем отличается процедура от функции?
2. Какие операторы Delphi необходимы для создания функций и процедур?
3. Чем отличаются формальные параметры от фактических?
4. Что такое модуль?
5. Из каких частей состоит модуль?
6. Как создается модуль в Delphi?
78

Основы программирования в Delphi
Значение State
Состояние флажка
cbUnchecked
сброшен
cbGrayed
установлен частично
cbChecked
установлен
11. СОЗДАНИЕ ГРАФИЧЕСКОГО ИНТЕРФЕЙСА ПОЛЬЗОВАТЕЛЯ
Как известно из практики работы с программами под Windows, пользователь общается с возможностями программы с помощью различных меню и ко-
мандных кнопок, выбирает режимы работы с помощью флажков и переключа-
телей. Рассмотрим основные компоненты, которые позволяют организовать
пользовательский интерфейс программы.
11.1. Флажок, Переключатель
Эти два компонента также находятся на панели компонентов Стандартные. После установки их на форму они принимают следующий вид:
Рис.11.1 Флажок и радио кнопка
Флажок предназначен для выбора некоторого режима работы. Переключатель предназначен для выбора одного значения из ряда возможных знанче-
ний. Далее рассмотрим основные свойства этих компонентов.
Компонент Флажок (TCheckBox)
Основным свойством флажка является свойство Checked, которое может
принимать значение True или False. Некоторые флажки могут находится в третьем, «частично установленном» состоянии, когда признак установки флажка
отображается приглушенным цветом.
Определить текущее состояние или задать новое из числа доступных
можно проверив или изменив свойство State. Чтобы реагировать на изменение
состояния флажка, надо создать обработчик события OnClick (при щелчке).
79

Основы программирования в Delphi
Компонент Переключатель (ТRadioButton)
Переключатель предназначен для выбора одного значения из ряда возможных. Переключатели всегда используются группами. Когда пользователь выби-
рает один из них, то выделение с текущего переключателя снимается. Таким
образом, в группе выделен всегда только один переключатель.
Главное свойство переключателя – это свойство Checked (True, если переключатель включен). Методы GetChecked и SetChecked позволяют считывать и
установить значение свойства Checked. Для отслеживания состояния конкретно
переключателя можно обрабатывать событие OnClick.
Пример. Установим на форме флажок, 2 переключателя и 2 текстовых
поля (рис.11.2).
Рис.11.2 Свойства флажка и радио кнопки
При изменении состоянии флажка его текущее состояние выводится в
текстовое поле Edit1, а при выборе одного из переключателей номер выбранного переключателя выводится в текстовом поле Edit2.
Изменим следующие свойства флажка и переключателей:
1. Изменим свойства Caption флажка и переключателй, так чтобы были
соответствующие надписи флажка и переключателей
2. Свойство AlloyGrayed флажка установим на True, разрешая тем са-
мым, “частично установленный” режим.
3. Свойство Checked одного из переключателй установим на True, а у
другого на False.
Код обработчика события OnClick для флажка имеет вид:
procedure TForm. CheckBox1Click (Sender: T Object);
begin
case Check Box1.State of
cbUnchecked : Edit1. Text:=‟Выключено‟ ;
80
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
