Где описывать процедуры(функции)
Процедура(функция) описывается внутри модуля. Если требуется, чтобы процедура(функция) была доступна для других модулей, в части Interface необходимо описать ее заголовок, а в части Implementation описать ее реализацию, например:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs;
type
TForm1 = class(TForm)
private
{ Private declarations }
public
{ Public declarations }
end;
{описание заголовка функции, которая будет доступна для других модулей}
function min(a,b:real):real;
var
Form1: TForm1;
implementation
{$R *.dfm}
{ описание функции }
function min(a,b:real):real;
begin
if a>b then
min:=a
else min:=b;
end;
end.
Если процедура(функция) будет использоваться только в данном модуле, не требуется описание ее заголовка в секции Interface.
Передача параметров по ссылке и по значению
Любой из формальных параметров подпрограммы может быть либо:
1) параметром-значением (передача по значению)
2) параметром переменной (передача по ссылке)
3) параметром-константой (передача по ссылке)
Например, в следующем описании процедуры:
procedure MyProc(var a:real; b:integer; const c:string);
задан список формальных параметров где
a - передается по ссылке, для этого используется ключевое слова var;
b - передается по значению;
c - передается по ссылке, для этого используется ключевое слова const.
При передаче по значению параметр вычисляется, копируется во временную память и передается подпрограмме, т.е. передается копия параметра, поэтому на выходе из подпрограммы значение параметра не меняется. Например:
procedure A(c:real);
begin
....
c:=c+10;
...
end;
Использование процедуры:
c:=5;
A(c);
При выходе из процедуры А переменная c - будет равна 5.
При использовании параметра-переменной передается адрес переменной. Поэтому на выходе из подпрограммы ее значение может быть изменено. Например:
procedure Double( var c:real);
begin
c:=c*2;
end;
Использование процедуры:
a:=10;
Double(a);
После выхода из процедуры значение переменной A изменится и будет равно 20.
Параметр-константа будет использоваться в подпрограмме только для считывания данных, любые изменения параметра-константы запрещены. Параметр-константа передается по адресу. Использование такого параметра позволяет организовать эффективную обработку соответствующего параметра, не беспокоясь о возможных изменениях его значения. Например:
Procedure Sum( const A: integer);
Процедуре Sum передается параметр A, который нельзя менять в теле процедуры.
Контрольные вопросы
- Что такое процедура? Как и где описывается процедура? Как вызвать процедуру?
- Что такое функция? Как и где описывается функция? Как вызвать функцию?
- Чем функция отличается от процедуры?
- Какие преимущества дает использование процедур и функций?
- Какие параметры называются фактическими?
- Какие параметры называются формальными?
- Механизмы передачи параметров в процедуру и функцию: по значению, по ссылке. Поясните в чем разница.
Задание для самостоятельной работы
1. Написать функцию Procent, которая возвращает процент от полученного в качестве аргумента числа.
2. Написать функцию Doxod, которая вычисляет доход по вкладу. Исходными данными для функции являются: величина вклада, процентная ставка (годовых) и срок вклада(количество дней). Формула вычисления вклада может быть такой:
Доход=вклад*(проц_ставка/360*срок
3. Написать функцию, которая для веденного числа возвращает сумму его цифр.
4. Написать программный код для игры «Летающие тарелки», который определяет, было ли столкновение снаряда с летающей тарелкой, и если было, убирает тарелку с экрана и увеличивает счет игры. Оформить этот программный код в виде процедуры или функции.
Занятие12. Еще про компоненты
Еще раз про списки
Как было уже рассмотрено в занятии 4, Delphi предлагает два вида списков:
· Прокручиваемый список – ListBox;
· Выпадающий список – ComboBox.
Оба вида списков располагаются на вкладке Standart. Списки имеют много общих свойств и методов, но отличаются внешним видом, кроме того, список ComboBox является полем редактирования со списком, т.е. он объединяет возможности редактирования и выбора из списка.
Свойство Items у обоих видов списков является объектом типа TString со своими свойствами и методами. Иными словами, Items это символьный массив с набором методов, позволяющим работать со строками списка, т.е. добавлять, удалять, вставлять строки и т.д. Набор основных методов класса TString приведен в таблице:
Метод | Описание |
Add(const S: string): Integer | Добавить строку, передаваемую в качестве входного параметра, в конец списка |
Insert(Index: Integer; const S: string); | Вставить строку S в позицию, задаваемую параметром Index. Нумерация строк начинается с нуля. |
Delete(Index: Integer) | Удалить строку, позиция которой указана в параметре Index |
Exchange(Index1, Index2: Integer) | Поменять местами два элемента списка, позиции которых указаны параметрами Index1 и Index2 |
Clear | Очистить список |
Заполнение списков данными часто удобно производить на этапе выполнения программы программным путем.
Для демонстрации этого рассмотрим несложное приложение, назовем его «Работа со списками». Это приложение позволит программным путем изменять список ListBox. Внешний вид приложения может быть, например, таким:
|
В поле Edit1:TEdit будет вводиться значение нового элемента списка. По кнопке «Добавить» - введенный элемент добавляется в конец списка. По кнопке «Вставить» - элемент вставляется перед текущей позицией курсора. По кнопке «Удалить» - удаляется элемент, на котором установлен курсор. По кнопке «Очистить» - все элементы списка удаляются.
Используя методы объекта Items списка, напишем программный код на события OnClick кнопок.
Для кнопки «Добавить» программный код будет иметь вид:
ListBox1.Items.Add(Edit1.Text);
Для кнопки «Вставить» программный код будет иметь вид:
ListBox1.Items.Insert(ListBox1.ItemIndex, Edit1.Text);
Здесь первый параметр задает порядковый номер элемента, перед которым вставляется элемент, второй параметр – задает этот элемент.
Для кнопки «Удалить» программный код будет иметь вид:
ListBox1.Items.Delete(ListBox1.ItemIndex);
Для кнопки «Очистить» программный код будет иметь вид:
ListBox1.Items.Clear;
Функция MessageDlg
При удалении элемента необходимо спросить у пользователя подтверждения на удаление элемента. Для этого будем использовать встроенную функцию MessageDlg, которая позволяет выводить в окне сообщение пользователю и получать от пользователя ответ. Внешний вид окна приведен на рисунке:
Заголовок функции имеет следующий вид:
function MessageDlg(const Msg: string; DlgType: TMsgDlgType; Buttons: TMsgDlgButtons;
HelpCtx: Longint): Word;
Как видно из заголовка функция имеет четыре входных параметра:
Msg – задает текст сообщения;
DlgType – задает тип сообщения, фактически задает пиктограмму (картинку) в окне;
Buttons – задает набор кнопок в окне;
HelpCtx – используется для задания файла помощи.
Для параметра DlgType возможны следующие варианты:
Значение | Описание |
mtWarning | Задает пиктограмму с изображением желтого восклицательного знака |
MtError | Задает пиктограмму с изображением красного стоп-сигнала |
mtInformation | Задает пиктограмму с изображением голубой буквы i с точкой |
mtConfirmation | Задает пиктограмму с изображением зеленого знака вопроса |
MtCustom | Не содержит пиктограммы |
Для задания кнопок, как правило, используются следующие константы:
Значение | Описание |
mbYesNoCancel | Три кнопки “Yes”, “No”, “Cancel” |
mbOKCancel | Две кнопки “Ok” и “Cancel” |
mbAbortRetryIgnore | Три кнопки “Abort”, “Retry”, “Ignore” |
Для определения возвращаемого функцией значения используются константы:
Выбранная кнопка | Возвращаемое значение |
mbOK | mrOk |
mbYes | mrYes |
mbNo | mrNo |
mbCancel | mrCancel |
mbAbort | mrAbort |
mbRetry | mrRetry |
mbIgnore | mrIgnore |
Давайте изменим программный код на событие кнопки «Удалить» примера предыдущего пункта, добавив использование функции MessgaeDlg. Программный код будет иметь такой вид:
if MessageDlg('Вы уверены?', mtConfirmation, mbOkCancel, 0) = mrOk then
ListBox1.Items.Delete(ListBox1.ItemIndex);
Теперь, в случае если пользователь ошибочно нажмет на кнопку «Удалить», удаление будет произведено, если только пользователь его подтвердит.
Задание для самостоятельной работы
1. Создать прокручиваемый список с возможностью множественного выделения элементов. Отобразить выбор пользователя с помощью функции ShowMessage.
2. Даны два прокручиваемых списка. По кнопкам организовать перемещение элементов из одного списка в другой. По кнопке «>» выделенный элемент левого списка переносится в конец правого списка. По кнопке «<», наоборот, выделенный элемент правого списка переносится в конец левого списка. По кнопке «>>» все элементы левого списка переносятся в конец правого списка, соответственно по кнопке «<<» - все элементы правого списка переносятся в конец левого списка, как показано на рисунке:
.