Как сделать функцию в лазарусе
Любая программа в своей работе использует какие-то исходные данные.
Для организации ввода можно использовать компонент формы TEdit (Поле ввода), для вывода результатов – компонент Label (Поле вывода).
Другой способ организации ввода и вывода данных – использование встроенных диалоговых окон InputBox, ShowMessage. Эти диалоговые окна не устанавливаются программистом на форму во время разработки. Операторы их активации нужно вставлять в программный код.
Более подробно остановимся на втором способе.
Ввод данных
Функция InputBox() выводит на экран диалоговое окно, в котором можно ввести данные.
Аргументами этой функции являются три строки, а значением функции – строка введенная пользователем.
В общем виде строка программного кода с использованием функции InputBox выглядит так:
Переменная := InputBox(‘Заголовок’, ‘Подсказка’, ‘Значение по умолчанию’);
Переменная – переменная строкового типа, значение которой должно быть получено от пользователя;
Заголовок – текст заголовка окна;
Значение по умолчанию – текст, который будет находиться в поле ввода, когда окно появиться на экране.
Результат показан на рисунке:
Значение функции InputBox всегда строкового типа (String), поэтому в случае, если нужно ввести число, то введенная строка должна быть преобразована в число при помощи соответствующей функции преобразования.
В качестве примера возьмем задачу пересчета веса из фунтов в килограммы
Ввод исходных данных из окна ввода и последующее преобразование данных может выглядеть так:
funtStr:= InputBox(‘Фунты-килограммы’,’Введите вес в фунтах:’,’ ‘);
Вывод данных
Для вывода результата используется процедура ShowMessage(). Она выводит на экран диалоговое окно с текстом и командной кнопкой OK.
Общий вид инструкции вызова процедуры ShowMessage:
Например, для того чтобы вывести результат в программе пересчета веса из фунтов в килограммы, можно использовать следующую строку кода:
ShowMessage(‘Вес в килограммах: ‘+ FloatToStr(kg));
Результат показан на рисунке.
Вывод в поле вывода (Label)
Компонент TLabel(Поле вывода), в который будет осуществляться вывод, устанавливают на форме во время разработки. Содержание этого поля определяется значением свойства Caption.
Для того чтобы вывести результаты в это поле, нужно в программном коде поместить оператор присваивания, который будет изменить значение свойства Caption на нужное вам значение.
Например, для того чтобы вывести результат в поле вывода Label1 в рассмотренной выше задаче, нужно использовать следующий оператор присваивания:
Практическая работа
Задание. Поместить на форму две кнопки: Ввод данных и Выход. Пользователь должен ввести фамилию, имя и возраст. Для ввода данных использовать функцию InputBox. По окончании ввода анкетные данные вывести в поле вывода (компонент Label).
Ход выполнения
- Создать новый проект. Папку проекта назвать Анкетные данные.
- Разместить на форме две кнопки и надпись так, как показано на рисунке выше.
- Написать программный код для кнопки Ввод данных.
procedure TForm1.Button1Click(Sender: TObject);
label1.Caption:=InputBox(‘Ввод анкетных данных’, ‘Введите фамилию, имя,
procedure TForm1.Button2Click(Sender: TObject);
- Сохранить проект. Проверить работу приложения.
После щелчка на кнопке Ввод данных должно появиться диалоговое окно. Введите в него исходные данные.
После нажатия на клавишу Enter введенные данные должны отобразиться на форме.
Результат показан на рисунке.
В этом уроке мы рассмотрели способы организации ввода и вывода данных в среде Lazarus. Для ввода данных мы использовали диалоговое окно InputBox , для вывода – диалоговое окно ShowMessage и компонент формы TLabel (Поле вывода) .
Компонент TLabel устанавливается на форме во время разработки, диалоговые окна выводятся в отдельном окне во время выполнения приложения, не занимают место на форме. Для их вывода нужен соответствующий программный код.
Cоздание приложения в Lazarus состоит из следующих шагов:
- Подготовка
- Размещение компонентов интерфейса пользователя
- Создание процедур-обработчиков событий
- Тестирование и отладка приложения
Подготовка
Подготовка состоит из следующих шагов.
- Создать отдельную папку для каждого проекта.
Без пробелов! Без русских букв!
Место создания: C:\2kurs\your_name. - Запустить Lazarus.
- Закрыть проект:
Проект/Закрыть проект. - Создать новый проект: Приложение
- Сохранить проект в созданной специально для него папке:
Проект/Сохранить проект как. - Проверить успешность компиляции и запуска нового пустого проекта
клавиша F9. - Закрыть запущенный пустой проект.
- Продолжить сборку проекта.
- Регулярно сохранять проект в процессе сборки
сочетание клавиш Ctrl+S.
Создание процедуры-обработчика щелчка по кнопке Button1
1. На панели компонентов Standard выберите компонент TButton.
2. Разместите компонент TButton на форме:
должна появиться кнопка Button1.
3. Выделите на форме кнопку Button1, щелкнув по ней мышкой.
Проверьте: в верхней части окна Инспектор объектов в дереве
объектов должна быть выделена кнопка Button1.
4. В нижней части окна Инспектор объектов перейдите на
вкладку События.
5. На вкладке События выберите событие OnClick: должно появиться
поле ввода, справа от которого - кнопка с многоточием ". ".
6. Щелкните по кнопке с многоточием ". " напротив события OnClick.
7. В окне редактора должна появиться заготовка для процедуры
обработчика щелчка по кнопке Button1:
8. Для объявления переменных напишите
var
со списком переменных и указанием типов
между заголовком процедуры
procedure TForm1.Button1Click(Sender: TObject);
и словом
begin.
9. Операторы подпрограммы запишите между словами
begin и end;.
Об отметках
Основные упражнения не отмечены никакими специальными знаками, их выполнения достаточно для удовлетворительной оценки. Дополнительные упражнения отмечены "звездочками", их выполнение необходимо для получения повышенной оценки.
- "5" - в отчете выполнены все основные упражнения, дополнительно выполнены упражнения с одной и двумя "звездочками".
- "4" - в отчете выполнены все основные упражнения дополнительно выполнены упражнения с одной "звездочкой".
- "3" - в отчете выполнены все основные упражнения.
Упражнения
1. В программе присвоить строковой переменной s
строковую константу, например, 'abcd'.
Вывести значение s в метку Label1 при щелчке
по кнопке Button1.
На форму поместить:
Label1
Button1
procedure TForm1.Button1Click();
var
s : string;
begin
s := 'abcd'; // Присваиваем строковую константу.
Label1.Caption := s;
end;
2. Текст из метки Label1 присвоить строковой переменной s,
а затем вывести значение в Label2.
Эти действия должны выполняться при щелчке по кнопке Button1.
На форму поместить:
Label1
Label2
Button1
procedure TForm1.Button1Click();
var
s : string;
begin
s := Label1.Caption; // Присваиваем текст из метки.
Label2.Caption := s;
end;
Но детям неинтересно писать программу для вычисления силы тяжести по непонятной им пока формуле F=mg. Практически все дети, которых я пытался учить программированию, с первого занятия хотят написать игру. К счастью, Lazarus прекрасно подходит и для написания несложных игр.
Правда, для создания анимированных спрайтов мне понадобился компонент, отображающий произвольный фрагмент изображения (на котором изображены несколько разных проекций одного и того же персонажа в разных фазах движения), а такого компонента в стандартной поставке нет. Написать его самому оказалось совсем несложно, и об этой технологии я и хочу рассказать в этой статье.
Для отображения веселого графического контента вместо сухого делового набора стандартных компонентов в Lazarus (как и в Delphi) есть 3 компонента на вкладке Additional:
— TImage (отображение картинки из произвольного файла);
— TShape (отображение одного из нескольких заранее заданных графических примитивов);
— TPaintBox (отображение холста, на котором можно рисовать программно).
Самое эффектное для школьника — загрузить небольшой спрайт в TImage и написать программу для перемещения его по экрану — по событиям мыши/клавиатуры, автоматически в цикле или автоматически по событию от таймера.
Как только это начинает работать, у школьника возникает следующий законный вопрос: а нельзя ли сделать так, чтобы персонаж двигался? И можно ли сделать сделать так, чтобы он смотрел не постоянно на нас, а поворачивался в сторону, совпадающую с направлением движения?
В Сети можно найти большое количество готовых изображений для использования при разработке игр. И многие персонажи заранее разработаны в несколько проекций и несколько кадров анимации (как, например, вот на этом сайте).
Вот пример изображения, где спрайты расположены в виде таблицы, у которой каждая строка соответствует определенной проекции, а каждый столбец — определенной фазе анимации:
Для отображения такого спрайта достаточно поместить на экран простой компонент, отображающий не все изображение целиком, а только один его фрагмент; и затем, меняя смещение выделенного фрагмента по горизонтали и вертикали, можно заставить персонаж поворачиваться в разные стороны и совершать циклические движения (например, махи крыльями или шаги ногами). Такой прием часто используется при веб-разработке: даже простые наборы иконок для деловой графики часто размещают в одном файле и отображают в разных местах страницы с разным смещением, создавая впечатление разных изображений.
К сожалению, компонент TImage, входящий в стандартную поставку Lazarus (и Delphi), не позволяет показывать произвольный фрагмент изображения: изменяя его свойства, мы можем заставить его показывать только изображение целиком, левый верхний угол или центральную его часть. Для отображения произвольного фрагмента изображения, заданного смещением и размерами по обеим осям, нужен какой-то другой компонент. Но, как выяснилось, сделать его самостоятельно в Lazarus — совсем несложно!
Создаем новый компонент
В качестве инструкции по созданию компонентов я воспользовался официальным руководством.
Там все написано достаточно подробно, дублировать не имеет смысла. Я только остановлюсь на некоторых моментах.
Если все сделано правильно, на экране должно появиться окно нового (пока пустого) пакета.
В качестве класса-предка указываем TCustomImage — этот класс фактически используется для реализации компонента TImage, но отличается от него тем, что не содержит published properties и позволяет нам самим определить набор свойств, который будет доступен в дизайнере для нашего компонента.
Для тех, кто этого не знает, уточню, что published — это раздел класса (наподобие public), в котором описываются новые или просто указываются унаследованные свойства, которые должны быть доступны в визуальном редакторе свойств на этапе разработки программы. Промежуточные классы не объявляют ничего в этой секции, оставляя возможность программисту самому вынести туда то, что он сочтет нужным. Так, класс TImage не добавляет никакой функциональности, а только помещает в раздел published ряд свойств, унаследованных от родителя TCustomImage. Часть из этих свойств нам нужно спрятать, поэтому мы также унаследуем наш новый компонент от TCustomImage и выведем в published только то, что не противоречит логике нашего компонента.
Добавляем код в новый компонент
Сразу после создания нового компонента его исходный код получается примерно таким:
Нам нужно добавить несколько унаследованных published properties, создать два своих и переопределить одну виртуальную функцию. Приступим!
0. В секции импорта нам понадобятся два дополнительных модуля: ExtCtrls и LCLProc — добавляем их в раздел uses:
1. Добавляем список published properties, полностью аналогичный компоненту TImage, за исключением нескольких properties, позволяющих изменить масштаб и позицию изображения:
Для пущей убедительности я не удалил, а закомментировал те properties, которые есть в компоненте TImage, но будут мешать в нашем новом компоненте TImageFragment.
2. Добавляем в объявление класса два новых properties для задания смещения изображения по горизонтали и по вертикали:
и не забываем добавить в имплементацию класса две объявленных процедуры:
3. Переопределяем виртуальную функцию DestRect:
и добавляем ее реализацию в имплементацию класса:
Компилируем пакет и пересобираем Lazarus
Вместо послесловия
В следующей статье Lazarus — простая анимация при помощи компонента TImageFragment я рассказал, как можно использовать такой компонент — за 5 минут создать окно, в котором анимированный персонаж будет двигаться в разные стороны и поворачиваться в сторону направления движения.
Если тема окажется интересной читателям, я могу дополнить этот цикл статьей о том, как, потратив чуть больше времени, можно сделать, к примеру, футбольное поле с парой футболистов, управляемых с клавиатуры.
А если хватит времени и желания — попробую написать разные алгоритмы управления персонажами (например, футболистами) и устроить между ними соревнования!
Я буду использовать Debian 6.0.2.1 и Lazarus 0.9.28.2-12 beta. По поводу установки. В debiane все сделалось одной командой:
В других linux’ах по разному. Например в Ubuntu — так же, потому что она построена на основе Debian. В Arch Linux не намного сложнее:
Теперь приступим к программированию. Наша задача:
- Создать форму с кнопкой и лейбой;
- Создать свой класс Timer’a. Добавить ему необходимые методы;
- Создать автоматическую работу нашего таймера, на основе системного таймера.
И так, поехали. Создадим форму. Добавим на нее кнопку и лейбу. Переименуем их в понятные имена:
Создание класса в Lazarus такое же простое, как и в Delphi. Для начала создадим новый модуль (Файл — Создать модуль). В нем будет реализован наш класс. Напишем простой интерфейс класса, в разделе type:
После этого можно реализовать методы класса:
Подключили в uses наш юнит. Теперь:
Этим мы объявили саму переменную таймера. Далее необходимо ее инициализировать с помощью конструктора. Заодно и опишем событие кнопки.
Теперь реализуем событие таймера. Кликните два раза на событии OnTimer в свойствах вашего таймера, пишем код:
Создадим кнопку BtnStartStop. Запишем в ее событие Onclick следующий код:
Мы проверяем, работает ли таймер. Если нет — включаем, если да — выключаем. Не забудем добавить в событие создание формы строчку:
Что бы наш таймер не запускался сам при запуске приложения. Запускаем. Если все работает, идем дальше. Расширим наш класс TMTimer методом SetTime:
Читайте также: