Часто в программе приходится повторять одни и те же действия. Или же для облегчения восприятия и отладки программы есть необходимость структурировать программу, оформив какую-нибудь часть, выполняющую конкретное законченное действие, в виде отдельной подпрограммы.
В языке Pascal существуют понятия процедур и функций. Они отличаются друг от друга тем, что функция возвращает какое-либо значение, а процедура нет. На языке C++ процедур нет – только функции. Однако функция может и не возвращать значение, тем самым она выполняет роль процедуры.
Объявление на языке Pascal процедур:
procedure <Имя функции> (передаваемые параметры);
begin
// тело процедуры
end;
Или с объявлением локальных переменных и констант
procedure <Имя функции> (передаваемые параметры);
const
// объявление локальных констант
var
// объявление локальных переменных
begin
// тело процедуры
end;
Необходимо отметить, что объявленные переменные в скобках в качестве передаваемых параметров сами по себе являются локальными относительно данной процедуры.
Объявление функции:
function <Имя функции> (передаваемые параметры):<тип возвращаемых данных>;
begin
// тело функции
<имя функции>:= <что возвращать>;
end;
Или с объявлением локальных переменных и констант
function <Имя функции> (передаваемые параметры):<тип возвращаемых данных>;
const
// объявление локальных констант
var
// объявление локальных переменных
begin
// тело функции
<имя функции>:= <что возвращать>;
end;
На языке С++ объявление функций:
<тип возвращаемых данных> <имя функции> (передаваемые параметры)
{
// тело функции
return <что возвращать>;
};
Если отсутствуют возвращаемые данные, то впереди имени функции следует поставить слово void. Аналогично, если передаваемые данные отсутствуют, то необходимо в скобках указать (void).
Вызывать процедуры и функции в программе необходимо по объявленному имени с перечислением всех необходимых передаваемых параметров. Тип передаваемых данных, количество, а также расположение должно быть строго соответствовать объявлению.
Пример:
Разработать функцию, которая бы делала арифметические действия над тремя числами, два из которых являются целыми, одно – десятичной дробью.
На языке Pascal:
function MyFun (A:integer; B:integer; C:real):real;
begin
MyFun:= (A+B)*C;
end;
Пример вызова функции из обработчика события OnClick:
procedure TForm1.Button1Click(Sender: TObject);
var
N1:Integer; // объявление локальной переменной
N2:Integer; // объявление локальной переменной
N3:Real; // объявление локальной переменной
begin
N1:=StrToInt(Edit1.Text); // определение значения N1
N2:=StrToInt(Edit2.Text); // определение значения N2
N3:=StrToFloat(Edit3.Text); // определение значения N3
// вызов функции MyFun и вывод результата в Edit3
Edit3.Text:= FloatToStr(MyFun(N1,N2,N3));
end;
На языке C++
float MyFun (int A, int B, float C)
{
return (A+B)*C;
};
Пример вызова:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
int N1,N2; // объявление локальных переменных
float N3;
N1 = StrToInt (Edit1->Text); // определение значения N1
N2 = StrToInt (Edit2->Text); // определение значения N2
N3 = StrToFloat (Edit3->Text); // определение значения N3
// вызов функции MyFun и вывод результата в Edit3
Edit3->Text = FloatToStr(MyFun(N1,N2,N3));
}
Для определения значений, передаваемых разработанной функции, использовались встроенные функции преобразования строковых данных в числовые:
1. Функция StrToInt преобразования строки (например, '220') в целое для переменных типа integer;
2. Функция StrToFloat преобразования строки (например, '3.14') в десятичную дробь для переменных типа real (float).
Обратные функции предназначены для преобразования чисел в строки для последующего вывода на экран:
1. Функция IntToStr преобразования переменной типа integer в строку;
2. Функция FloatToStr преобразования переменной типа real (float) в строку.
Объекты программы
И Delphi, и C++ являются объектно-ориентированными языками. Это означает, что пользователь оперирует некими объектами, у которых есть индивидуальные свойства, методы и события.
Свойства (Properties) позволяют управлять текущим состоянием объекта. Практически все свойства доступны для считывания и записи. Для удобства все свойства объекта помещены в структуру с его именем. Например, в таблице 1.2 приведены некоторые свойства объекта Button (вкладка «Standard» палитры компонентов), который на форме программы выглядит как кнопка, нажимаемая мышью.
Таблица 1.2 – Некоторые свойства объекта Button
Свойство | Назначение |
Caption | Текст, помещаемый на кнопке |
Enabled | Включение кнопки. Иначе она не нажимается |
Height | Высота кнопки в пикселях |
Left | Положение кнопки от левого края объекта, на котором находится кнопка, до левого края самой кнопки |
Name | Имя кнопки, используемое для идентификации в программе |
Top | Положение кнопки от верхнего края объекта, на котором находится кнопка, до верхнего края самой кнопки |
Visible | Включение видимости кнопки на форме |
Width | Ширина кнопки в пикселях |
Некоторые свойства также организованы в структуры. Например, группа свойств Font, которая управляет шрифтом надписи на кнопке, имеет конкретные свойства, например, «Color» - цвет шрифта, «Name» - имя шрифта, «Size» - размер шрифта в пикселях.
Доступ к свойствам объекта осуществляется аналогично как в структуре, организованной пользователем. Например, на языке Pascal:
Form1.Button1.Left:= 30; // Изменение положения кнопки Button1
// по горизонтали
Form1.Button1.Font.Size:= 10; // Изменение размера шрифта
Необходимо отметить, что название формы «Form1» писать не обязательно, если, например, подпрограмма описывает обработку конкретного события. В данном случае название формы уже имеется в заголовке подпрограммы:
// Процедура, вызываемая при нажатии кнопки Button1 на форме
procedure TForm1.Button1Click(Sender: TObject);
begin // начало процедуры
Button1.Font.Size:= 10;
...
end; // конец процедуры
Для подпрограммы, написанной самим пользователем, для своих целей писать название формы обязательно. Или можно использовать следующую конструкцию:
with Form1 do // указывает где искать объекты и их свойства
begin // начало действия оператора with
Button1.Left:= 10;
end; // Конец действия оператора with
Доступ к свойствам объектов на языке C++ осуществляется через указатели. В остальном организация структур аналогично Delphi:
Form1->Button1->Left = 30; // Изменение положения кнопки Button1
// по горизонтали
Form1->Button1->Font->Size = 10; // Изменение размера шрифта
...
// Функция, вызываемая при нажатии кнопки Button1 на форме
void __fastcall TForm1::Button1Click(TObject *Sender)
{ // начало функции
Button1->Font->Size = 10;
...
}; // конец функции
Методы, которые можно применить по отношению к объекту, являются по сути процедурами, находящимися в «теле» объекта, и которые выполняют наперед заданные функции. Например, к таким методам можно отнести функции создания и разрушения объекта, виртуального нажатия на кнопку, и т.д.
При действии над объектами появляются те или иные события (Events), которые вызывают подпрограммы, написанные пользователем, если есть такая необходимость. В этом случае подпрограммы называют «обработчиком события».
Некоторые события, которые появляются при действии с объектом типа «TButton» приведены в таблице 1.3.
Таблица 1.3 – Некоторые события объекта «TButton»
Событие | Когда происходит событие |
OnClick | При нажатии правой клавишей мыши на кнопке и последующем отпускании (Клик) |
OnMouseDown | В момент нажатия любой клавишей мыши на кнопке |
OnMouseUp | В момент отпускания любой клавиши мыши |
OnMouseMove | При перемещении курсора над поверхностью кнопки |
Доступные свойства и события перечислены в инспекторе объекта при выборе соответствующего объекта на форме.
а) Свойства б) События
Рисунок 1.1 – Список свойств и событий в инспекторе объекта типа «TButton»