Процедуры и функции delphi

Delphi 7. Занятие 1_4.

Процедуры и функции delphi

Структура программ delphi

Понятие события

Если Вы пользуетесь операционной системой Windows, то все программы будут работать по принципу ожидания событий.

Запущенная программа, как правило, ожидает ваших действий. Осуществив действие, мы вызываем внутри программы событие.

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

Даже факт появления той или иной формы на экране тоже является событием. Всего обрабатывается 34 различных события, происходящих в процессе работы с формой.

В дальнейшем мы увидим (и будем использовать) также и события, исходящие от операционной системы. Например, событие срабатывания таймера, события сбоя в работе программы и многое другое.

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

Механизм связывания скрыт от разработчика. Среда предоставляет ему заготовку процедуры-обработчика, а программисту остается только наполнить её кодом. Именно это мы и делали, разрабатывая программу «калькулятор».

Понятие процедуры и функции

Познакомимся более полно с понятием «процедура» и «функция«.

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

Сама программа имела линейную логику, то есть операторы (команды) выполнялись один за другим последовательно от запуска программы и до окончания её работы.

Но по мере увеличения мощностей компьютеров объем текстов программ резко возрос и усложнилась логика их работы. Потребовалось разбивать длинный текст на логически связанные отрезки.

В дальнейшем эти отрезки оформили как самостоятельные фрагменты программы. Каждый такой отрезок выполнял логически законченные действия.

Был разработан механизм обращения к таким отрезкам программы в виде двух возможностей — процедуры и функции.

Внутренняя структура процедуры

Внешне логика построения процедуры выглядит таким образом:

Procedure имя_процедуры (список передаваемых в процедуру значений);
начало процедуры
     ВЫПОЛНЯЕМЫЕ ОПЕРАТОРЫ
конец процедуры;

Выполняемый код называется телом процедуры.

Например:

procedure MyProc(a:double;b:string);
begin
     ВЫПОЛНЯЕМЫЕ ОПЕРАТОРЫ
конец процедуры;

Осталось выяснить, как заставить процедуру выполнить свой код.

Как выполнить процедуру

Чтобы заставить процедуру выполнить свой код, её надо «вызвать». Откуда можно вызвать процедуру? Это делается из другой процедуры или функции. Например, рассмотрим такой код. Есть поле ввода Edit1 и кнопка Button1.

interface
var Form1:Tform;
    vr:string;


implementation
procedure MyProc(a:double;b:string);
begin
     vr:=b;
end;

procedure AnotherMyProc();
begin
    MyProc(20.5,'слово');
end;


procedure TForm1.Button1Click(Sender: TObject);
begin
           AnotherMyProc();
    form1.edit1.Text:=vr;
end;

Здесь первая процедура — обработчик события клика по кнопке.

В теле процедуры первая строка является вызовом процедуры AnotherMyProc() . После вызова эта процедура начинает выполняться, то есть начинает выполняться записанный в ней код.

Единственная команда в этой процедуре — вызов ещё одной процедуры MyProc, в которую передаются два значения. Первое — вещественное число, а второе — строка символов.

После того, как эти процедуры завершат своё выполнение, будет сформировано значение глобальной (то есть видимой во всех процедурах) переменной vr.

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

Аргументы процедуры

В списке аргументов процедуры MyProc указано два аргумента. Это две переменных. Первая переменная «a» и её тип «double», а вторая — «b» и её тип «string«.

Заметим, что количество, тип и порядок передаваемых значений при вызове процедуры должно точно соответствовать количеству, типу и порядку переменных, описанных в шапке процедуры.

При любом несоответствии программа выдаст ошибку и остановит выполнение.

Таким образом, переменная «a» станет равной 20.5, а переменная «b» будет содержать набор символов «слово».

Обратите внимание! Десятичным знаком является точка, а не запятая!

В теле процедуры MyProc имеется тоже только одна команда. В переменную «vr» переписывается значение из переменной «b»

Глобальные и локальные переменные

Отметим, что переменная «vr» была объявлена в секции «var» модуля.

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

Каждая форма связана со своим модулем. Все видимые изменения на форме происходят в результате работы процедур и функций, описанных в модуле.

С точки зрения программиста модуль — это страница наподобие страницы в word, где программист записывает свой код программы в виде процедур и функций.

Но если есть глобальные переменные, значит должны быть и локальные. Переменные «a:double;» и «b:string», описанные в шапке процедуры, будут локальными переменными, то есть они работают только внутри той процедуры, где они описаны.

Значения этих переменных для других процедур и функций недоступны!

Отметим ещё два момента, на которые надо особо обратить внимание.

Первое.

Если в секции объявления глобальных переменных объявить переменную с именем «b», сразу задав ей начальное значение, то возникнет следующая ситуация. Везде значение переменной «b» будет равно «другое слово»,

var
  Form1: TForm1;
  vr:string ;
  b:string='другое слово';

implementation

и только в процедуре:

procedure MyProc(a:double;b:string);

значение переменной будет таким, какое будет передано из вызывающей команды. В нашем случае, переменная «b» будет равна «слово».

То есть локальная переменная, объявленная в процедуре, перекрывает значение глобальной переменной.

На это надо обращать внимание, так как может служить источником потенциальной ошибки, которую трудно выявить при большом объёме кода.

Объявление переменных внутри процедуры

Второе.

Кроме переменных, задаваемых в шапке процедуры, мы можем объявлять локальные переменные в самой процедуре.

Изменим немного текст процедуры:

procedure MyProc(a:double;с:string);
var b,d:string;
begin
d:='новое слово';
b:=d;
Form1.Edit1.Text:=b;
     vr:=c;
end;

Мы помним, что глобальная переменная «b» имеет начальное значение «другое слово». А в процедуре локальной переменной «b» присвоили значение ‘новое слово’.

Что выведет Edit1? В Edit1 будет передано значение ‘новое слово’, то есть опять же локальная переменная «затрёт» глобальную.

Внимание! Локальные переменные в шапке процедуры отделяются друг от друга точкой с запятой.

При объявлении переменных в секции «var» переменные одного типа можно перечислять через запятую.

Строковое значение заключается в одинарные кавычки!

На этом пока знакомство с процедурами приостановим и рассмотрим, что из себя представляют функции.

Функции

Структура программ delphi наряду с процедурами содержит ещё и функции. Функция — это родная сестра процедуры. Но есть и отличия. Рассмотрим объявление функции.

function ff():string;
begin

...
end;

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

form1.Edit3.Text:=ff();

Написав через двоеточие тип «string»:

function ff():string;

мы тем самым говорим, что функция играет роль переменной типа «string». Естественно, тип может быть любым, который допустим в delphi.

Формирование значения функции

Но пока не ясно, как сформировать значение функции.

Следующий код отвечает на этот вопрос.

function ff():string;
begin
result:='слово';
end;

Ключевое слово «result» определяет выходное (возвращаемое) значение функции.

Посмотрим ещё раз. В выражении:

form1.Edit3.Text:=ff();

производится вызов функции ff().

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

В нашем примере это значение передаётся в Edit3.

Мы использовали функцию с пустыми скобками, то есть функцию, не имеющую параметров . Но, так же как и для процедуры, мы можем указать в скобках переменные. Правила остаются теми же самыми.

Замечание 1.

Код написанный следующим образом, работать не будет:

procedure TForm1.Button2Click(Sender: TObject);
begin
form1.Edit3.Text:=ff(0,'a');
end;

function ff(i:integer;g:string):string;
begin
result:=g;
end;

Дело в том, что кликнув по кнопке, мы попадаем в процедуру, код которой описан раньше, чем код вызываемой из неё функции.

Замечание 2.

В тексте программы мы ввели ещё один тип переменной — целый тип.

i:integer;

Переменные этого типа не могут иметь десятичной части.

Мы ещё не говорили о процессе компиляции программы. Но именно на этапе компиляции будет выдана ошибка. Для правильной работы программы достаточно поменять местами процедуру и функцию.

Тогда правильным будет код:

function ff(i:integer;g:string):string;
begin
result:=g;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
form1.Edit3.Text:=ff(0,'a');
end;

Заключение

Подведём итоги.

Мы рассмотрели два основных строительных кирпичика, из которых воздвигается здание программы Delphi — процедуру и функцию.

Третий элемент построения программы уже является не кирпичиком, а целым строительным блоком. Это объект. Но об объектах речь будет значительно позднее.

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

В процедуры и функции через параметры передаются значения, которые в дальнейшем принимают участие в вычислениях.

Параметры в шапке функций и процедур разделяются «;». После последнего параметра точка с запятой не ставится.

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

Если имена локальных и глобальных переменных совпадают, то локальные переменные «перекрывают» глобальные переменные. При этом значения, хранящиеся в глобальных переменных, не затрагиваются.

Вызов процедур и функций осуществляется путём указания их имени и списка значений в скобках. Значения могут быть константами или переменными. В любом случае список значений разделяется запятыми.

Глассарий.

  1. Процедура
  2. Функция
  3. Параметры процедуры и функции.
  4. Локальные переменные.
  5. Типы переменных srring, double, integer.
  6. Тело процедуры или функции.

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *