Опубликован: 07.04.2008 | Уровень: специалист | Доступ: платный
Лекция 3:

Целые и вещественные типы. Процедуры и функции

< Лекция 2 || Лекция 3: 12 || Лекция 4 >

Процедуры

Это очень важная тема, обратите на нее особое внимание!

Раньше языки программирования были построчными. Единственным вариантом возврата к нужной строке был оператор GO. Очень много ошибок было сделано этим оператором! Современные языки программирования также имеют этот оператор, но применять его считается дурным тоном.

Иногда бывает необходимо выполнять часть кода неоднократно. Этот самый код выносят в отдельную подпрограмму – процедуру.

Процедураподпрограмма, которая выполняет какие-то действия, и которую можно вызвать из другого места программы. После выполнения процедуры выполнение программы продолжается с того места, откуда она была вызвана.

Процедура живет самостоятельной жизнью, и в любой момент ее можно вызвать, чтобы выполнить какие-то действия. Чтобы процедуру можно было вызвать из программы, ее необходимо объявить выше того места, где мы будем ее вызывать. Синтаксис процедуры такой:

procedure NameProc(Param : Тип);
var
  //объявление переменных(необязательно)
begin
  //тело процедуры
end;

Вызвать такую процедуру можно, просто указав ее имя. Проверим это на практике. Вернемся к нашему проекту, и выше процедуры обработки кнопки создадим такую процедуру:

procedure Soobshenie;
begin
  ShowMessage('Ошибка! На ноль делить нельзя!');
end;

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

Soobshenie;

Теперь сохраните проект, скомпилируйте его и посмотрите, что получилось. Не забудьте, что вводить в Edit1 и Edit2 можно только цифры от 0 до 9.

Теперь о параметрах. Параметрыэто входные данные. То есть, мы можем вызвать процедуру и задать ей нужные данные. Параметры процедуры записываются в круглых скобках с указанием типа. Если параметров нет, скобки можно не ставить. Пример процедуры с параметрами:

procedure Primer(a,b : Integer);
begin
  a := a * b;
end;

Обратите внимание, что обязательно нужно указывать тип параметров. Теперь мы можем вызвать эту процедуру, указав ей, какие цифры нужно перемножить. Примеры вызова процедуры:

Primer(10, 20); //передаем целые числа
Primer(a, 100); //передаем переменную a с целым числом, и целое число
Primer(c, d); //передаем две переменных с целым числом

Сразу следует сказать об области видимости переменных. Бывают переменные глобальные и локальные. Глобальные переменные видны во всей программе, их мы будем использовать позже. А локальные переменные создаются внутри процедуры, в разделе var, и видны только в этой процедуре. Локальные переменные создаются в памяти в то время, когда процедура начинает работу, и уничтожаются, когда процедура закончила работу. Таким образом, мы можем сделать две или более процедур, и указать в них переменные с одинаковым именем. Это будут разные переменные, и они не будут мешать друг другу.

Функции

Функции – это такие же подпрограммы, как и процедуры. Отличие функций от процедур в том, что они не просто выполняют какие-то действия и расчеты, но и могут возвращать результат определенного типа. Поскольку они возвращают результат, необходимо указать тип этого результата. Синтаксис функции такой:

function NameFunc(Param : Тип) : Тип_возвращаемого_значения;
var
  //объявление переменных (необязательно)
begin
  //тело функции
  Result := результат вычислений;
end;

Здесь следует обратить внимание на два момента: после имени функции и параметров в круглых скобках, после двоеточия, указывается тип возвращаемого значения. Кроме того, в каждой функции по умолчанию имеется переменная Result, которая имеет тот же тип, что и тип возвращаемого значения. Эту переменную специально объявлять не нужно, она уже готова к работе. В отличие от других языков, в Delphi этой переменной можно присваивать значение неоднократно. Результатом будет последнее присвоенное значение.

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

Result := результат вычислений;

будет полностью идентичной строке

NameFunc := результат вычислений;

Какой из способов использовать – решайте сами, оба способа правильны. Снова вернемся к нашей программе, и для закрепления знаний добавим в нее функцию. Функция также должна быть описана выше того места, где мы будем ее вызывать. Можете создать ее между нашей процедурой и процедурой нажатия на кнопку.

function Delenie(a,b : Integer) : Real;
begin
  Result := a / b;
end;

Теперь заменим ту строку, где в третью переменную записывается результат деления первых двух, на вызов функции и передачу ей этих двух чисел:

Perem3 := Delenie(Perem1, Perem2);

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

События

В Delphi событие означает, что какой то компонент, которому мы назначили событие, изменился. Событиеэто процедура, которой передается управление в случае, если произошли запрограммированные изменения. События могут быть самыми разными – изменение текста в поле Edit, нажатие кнопки мыши или клавиши, или просто мышь оказалась над компонентом.

Давайте улучшим наш пример, введем в него событие. Выделите компонент Edit1. Сейчас мы зададим ему событие OnChange, которое происходит всякий раз при изменении текста в этом компоненте. Давайте представим себе пользователя, работающего с нашей программой. Ему будет приятно, если он начнет менять текст в первом поле, а остальные поля автоматически очистятся, чтобы быть готовыми для новых расчетов!

Выделим компонент Edit1.

Перейдем в инспекторе объектов на вкладку Events (события).

Дважды щелкнем по событию OnChange (Изменение).

Создастся процедура обработки события, и мы попадем в редактор кода. Там мы впишем две строки:

Edit2.Clear;
Edit3.Clear;

Теперь вставим еще одну "защиту от дураков". Ведь третье поле нужно только для результата? А вдруг пользователь начнет там вводить данные? Страшного ничего не произойдет, в расчетах это поле не участвует, но все равно неприятно, когда твою программу используют неправильно.

Выделите компонент Edit3.

На вкладке Properties (свойства) найдите свойство ReadOnly (только для чтения), и вместо False (ложь), поставьте True (истина). Все, теперь пользователь не сможет вводить данные в это поле, только программа сможет выводить в него результат.

Сохраните проект, выполните Run и убедитесь в этом.

< Лекция 2 || Лекция 3: 12 || Лекция 4 >
Виктор Пелих
Виктор Пелих

Здравствуйте.
Прохожу курс "Введение в программирование на Delphi"
Добрался до Лекции 29: Введение в базы данных.

Установлена RAD Studio 11.3, у которой отсутствует вкладка BDE и, соответственно, компонент Table,  который обеспечивает доступ к таблице средствами механизма BDE.
Поиск в интернете подсказал 
BDE Installer for RAD Studio, Delphi, C++Builder 10.3 Rio
Подскажите, имеется ли ещё возможность использовать механизм BDE в Delphi11 и если такая возможность есть, как подключить BDE к Delphi11?
С уважением...

 

Федор Антонов
Федор Антонов

Здравствуйте!

Записался на ваш курс, но не понимаю как произвести оплату.

Надо ли писать заявление и, если да, то куда отправлять?

как я получу диплом о профессиональной переподготовке?

Данила Некрасов
Данила Некрасов
Россия, Пермь, ПНИПУ
Сергей Федоров
Сергей Федоров
Россия