- •Лабораторная работа №7. Работа в delphi.
- •Процедуры и функции
- •Задание 1.1 Опишем процедуру вычисления корней квадратного уравнения.
- •Заметьте что, прототип процедуры указывается в разделе interface, а заготовка процедуры в разделе реализации который предваряет ключевое слово implementation.
- •Ключевое слово Result в функции, содержит возвращаемый ею результат определенного типа. Вместо этого слова можно писать имя самой функции.
- •Задание 1.3. Создадим функцию, подсчитывающую количество букв «f» в введённой пользователем строке.
- •Задание 1.5. Создадим простую, отдельную от какого либо класса функцию с именем Bush(X,y:integer):integer возвращающую значение произведения X*y.
- •Перегрузка функций.
- •Задание 1.6. Напишем ещё две перегруженные функции с тем же именем Bush.
- •Задание 1.7. Изучим Основной блок Begin и End модуля.
Задание 1.5. Создадим простую, отдельную от какого либо класса функцию с именем Bush(X,y:integer):integer возвращающую значение произведения X*y.
Создайте новый проект.
Опишем её в окне редактора кода, в разделе реализации после ключевого слова implementation и директивы {$R *.dfm}, должно выглядеть следующим образом:
Рис. 9 Описание функции с именем «Bush» отдельной от какого–либо класса
Сбросьте Button1 и RichEdit1 из палитры Win32 на форму (RichEdit1 очень похож на Memo1, но по функциональности RichEdit1 значительно лучше).
Сначала, как и ранее будем вызывать процедуру Bush из обработчика щелчка на Button1 и выводить возвращаемое ей значение в RichEdit1. Напишите в обработчике щелчка на Button1 следующее:
var a:integer;
begin
RichEdit1.Clear; //очищаем RichEdit1
a:=bush(3,5);// помещаем возвращаемое функцией значение в переменную a
RichEdit1.Lines.Add('Bush ='+IntToStr(a)); // выводим это значение в Richedit1
end;
Запустите программу, убедитесь в правильности её работы, вернитесь в режим программирования.
Перегрузка функций.
В Delphi две или более функций могут иметь одинаковое имя, отличаясь либо типом входных параметром, либо их числом, либо и тем и другим.
Таким образом, если две или более функции имеют одинаковое имя, то говорят что они перегружены. Это воплощение одного из базисных принципов программирования под названием – полиморфизм (от греческого polymorphos) – свойство, которое позволяет использовать одно и то же имя для решения схожих задач.
Задание 1.6. Напишем ещё две перегруженные функции с тем же именем Bush.
Bush(X, Y, Z:word):word; //будет возвращать значение выражения (X+Y)*Z
// типа word
Bush(S, C:string):string; //будет возвращать строку «склеенную» из S и C
// типа string
Каждая перегруженная процедура или функция обозначается ключевым словом Overload справа от её объявления.
Конечно, функции и процедуры можно перегружать и когда они принадлежат некоторому классу, то есть можно перегружать методы класса.
В окне редактора кода допишите следующие две дополнительные функции отмеченные, словом Overload:
Рис. 10 Описание перегруженных функций с одинаковым именем «Bush»
Теперь, как и прежде вызовем из обработчика Button1 всё варианты функции Bush.
Измените код в обработчике щелчка Button1 на следующий:
var a:integer; b:word; Stroka:string;
begin
RichEdit1.Clear; //очищаем
a:=Bush(3,5);
RichEdit1.Lines.Add('Bush(X,Y:integer):integer; ='+IntToStr(a));
b:=Bush(1,3,5);
RichEdit1.Lines.Add('Bush(X,Y,Z:word):word; ='+IntToStr(b));
Stroka:=Bush('Мощный ','Процессор');
RichEdit1.Lines.Add('Bush(S,C:string):string; ='+Stroka);
end;
Запустите программу, убедитесь в правильности её работы, вернитесь в режим программирования.
Задание 1.7. Изучим Основной блок Begin и End модуля.
Обратим внимание на структуру модуля Unit1.pas.
Найдите самый последний End который заканчивается точкой назовем его “Главный End” модуля. И сразу перед ним напишите слово Begin назовем его “Главный Begin” модуля.
Можно сказать, что Главный Begin и Главный End образуют Основной блок модуля. Внутри данного блока может располагаться любой код.
Причем при запуске программы данный код будет исполняться сразу же первым. Также над главным Begin может сразу располагаться Var.
Добавьте следующий код в основной блок:
var a:integer; b:word; Stroka:string;
Begin // Главный Begin модуля
Application.CreateForm(TForm1, Form1);
Form1.RichEdit1.Clear;
Form1.RichEdit1.Lines.Add('Я ОСНОВНОЙ БЛОК МОДУЛЯ - ВЫПОЛНЯЮСЬ ВНАЧАЛЕ');
end. // Самый последний, Главный End модуля
Обратите внимание, что теперь всегда требуется указывать полностью имя метода объекта, который вызывается, и вместо RichEdit1.Lines.Add('') требуется писать Form1.RichEdit1.Lines.Add(''); так как вызов метода Lines.Add объекта RichEdit1 вызывается из основного блока, а не из метода класса TForm1 как в обработчике TForm1.Button1Click(Sender: TObject).
Также обратите внимание на инструкцию Application.CreateForm(TForm1, Form1); Она нужна для того, чтобы сформировать в памяти компьютера саму форму (объект Form1 класса TForm1) со всеми компонентами располагающимися на ней. Если её не написать в самом начале, то невозможно будет обратиться ни к одному компоненту, ни к самой форме, так как она не сформирована в памяти и для неё не существует дескриптора.
Но нам не нужно вызывать эту инструкцию дважды, нажмите Ctrl+F12, выберете Project1 и нажмите OK. Теперь закомментируйте инструкцию Application.CreateForm(TForm1, Form1); так, чтобы компилятор её не воспринимал, или просто сотрите её (рис. ):
Рис. 11 Редактирование файла проекта
Запустите программу, убедитесь, что при запуске в RichEdit1 сразу же отображаются результаты работы вашего кода в основном блоке. Вернитесь в режим программирования.
автор и разработчик лабораторных
работ по Delphi
доцент кафедры Информационных технологий и систем
кандидат физ.-мат. наук
Санников Е.В.