Как сделать функцию в лазарусе

Добавил пользователь Дмитрий К.
Обновлено: 10.09.2024

Любая программа в своей работе использует какие-то исходные данные.

Для организации ввода можно использовать компонент формы TEdit (Поле ввода), для вывода результатов – компонент Label (Поле вывода).

Другой способ организации ввода и вывода данных – использование встроенных диалоговых окон InputBox, ShowMessage. Эти диалоговые окна не устанавливаются программистом на форму во время разработки. Операторы их активации нужно вставлять в программный код.

Более подробно остановимся на втором способе.

Ввод данных

Функция InputBox() выводит на экран диалоговое окно, в котором можно ввести данные.

Аргументами этой функции являются три строки, а значением функции – строка введенная пользователем.

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

Переменная := InputBox(‘Заголовок’, ‘Подсказка’, ‘Значение по умолчанию’);

Переменная – переменная строкового типа, значение которой должно быть получено от пользователя;

Заголовок – текст заголовка окна;

Значение по умолчанию – текст, который будет находиться в поле ввода, когда окно появиться на экране.

Результат показан на рисунке:

ris1

Значение функции InputBox всегда строкового типа (String), поэтому в случае, если нужно ввести число, то введенная строка должна быть преобразована в число при помощи соответствующей функции преобразования.

В качестве примера возьмем задачу пересчета веса из фунтов в килограммы

Ввод исходных данных из окна ввода и последующее преобразование данных может выглядеть так:

funtStr:= InputBox(‘Фунты-килограммы’,’Введите вес в фунтах:’,’ ‘);

ris2

Вывод данных

Для вывода результата используется процедура ShowMessage(). Она выводит на экран диалоговое окно с текстом и командной кнопкой OK.

Общий вид инструкции вызова процедуры ShowMessage:

Например, для того чтобы вывести результат в программе пересчета веса из фунтов в килограммы, можно использовать следующую строку кода:

ShowMessage(‘Вес в килограммах: ‘+ FloatToStr(kg));

Результат показан на рисунке.

ris3

Вывод в поле вывода (Label)

Компонент TLabel(Поле вывода), в который будет осуществляться вывод, устанавливают на форме во время разработки. Содержание этого поля определяется значением свойства Caption.

Для того чтобы вывести результаты в это поле, нужно в программном коде поместить оператор присваивания, который будет изменить значение свойства Caption на нужное вам значение.

Например, для того чтобы вывести результат в поле вывода Label1 в рассмотренной выше задаче, нужно использовать следующий оператор присваивания:

Практическая работа

Задание. Поместить на форму две кнопки: Ввод данных и Выход. Пользователь должен ввести фамилию, имя и возраст. Для ввода данных использовать функцию InputBox. По окончании ввода анкетные данные вывести в поле вывода (компонент Label).

ris4

Ход выполнения

  1. Создать новый проект. Папку проекта назвать Анкетные данные.
  2. Разместить на форме две кнопки и надпись так, как показано на рисунке выше.
  3. Написать программный код для кнопки Ввод данных.

procedure TForm1.Button1Click(Sender: TObject);

label1.Caption:=InputBox(‘Ввод анкетных данных’, ‘Введите фамилию, имя,

procedure TForm1.Button2Click(Sender: TObject);

  1. Сохранить проект. Проверить работу приложения.

После щелчка на кнопке Ввод данных должно появиться диалоговое окно. Введите в него исходные данные.

После нажатия на клавишу Enter введенные данные должны отобразиться на форме.

Результат показан на рисунке.

ris5

В этом уроке мы рассмотрели способы организации ввода и вывода данных в среде Lazarus. Для ввода данных мы использовали диалоговое окно InputBox , для вывода – диалоговое окно ShowMessage и компонент формы TLabel (Поле вывода) .

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

Cоздание приложения в Lazarus состоит из следующих шагов:

  1. Подготовка
  2. Размещение компонентов интерфейса пользователя
  3. Создание процедур-обработчиков событий
  4. Тестирование и отладка приложения

Подготовка

Подготовка состоит из следующих шагов.

  1. Создать отдельную папку для каждого проекта.
    Без пробелов! Без русских букв!
    Место создания: C:\2kurs\your_name.
  2. Запустить Lazarus.
  3. Закрыть проект:
    Проект/Закрыть проект.
  4. Создать новый проект: Приложение
  5. Сохранить проект в созданной специально для него папке:
    Проект/Сохранить проект как.
  6. Проверить успешность компиляции и запуска нового пустого проекта
    клавиша F9.
  7. Закрыть запущенный пустой проект.
  8. Продолжить сборку проекта.
  9. Регулярно сохранять проект в процессе сборки
    сочетание клавиш 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 не намного сложнее:

Теперь приступим к программированию. Наша задача:

  1. Создать форму с кнопкой и лейбой;
  2. Создать свой класс Timer’a. Добавить ему необходимые методы;
  3. Создать автоматическую работу нашего таймера, на основе системного таймера.

И так, поехали. Создадим форму. Добавим на нее кнопку и лейбу. Переименуем их в понятные имена:


Создание класса в Lazarus такое же простое, как и в Delphi. Для начала создадим новый модуль (Файл — Создать модуль). В нем будет реализован наш класс. Напишем простой интерфейс класса, в разделе type:

После этого можно реализовать методы класса:

Подключили в uses наш юнит. Теперь:

Этим мы объявили саму переменную таймера. Далее необходимо ее инициализировать с помощью конструктора. Заодно и опишем событие кнопки.


Теперь реализуем событие таймера. Кликните два раза на событии OnTimer в свойствах вашего таймера, пишем код:

Создадим кнопку BtnStartStop. Запишем в ее событие Onclick следующий код:

Мы проверяем, работает ли таймер. Если нет — включаем, если да — выключаем. Не забудем добавить в событие создание формы строчку:

Что бы наш таймер не запускался сам при запуске приложения. Запускаем. Если все работает, идем дальше. Расширим наш класс TMTimer методом SetTime:

Читайте также: