Как сделать пазлы в лазарусе

Обновлено: 07.07.2024

Эта статья врядли будет интересна тем, кто раньше программировал в Delphi. Она в большей степени рассчитана на программистов VB, MS Access и других средств быстрой разработки. В каждой системе существуют свои правила и подходы, касающиеся программного открытия экранных форм, а также передачи и возврата пареметров. Вот я и хочу рассказать о том, как это сделано в Lazarus. При этом я предполагаю, что читатель достаточно хорошо понимает принципы ООП и уже знаком с синтаксисом языка Free Pascal.

Открытие форм в модальном режиме

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

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


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


В качестве программного интерфейса для передачи параметра будем использовать свойство TestValue, которое определим в секции public класса формы. Также определим и реализуем более чем очевидные методы для установки и считывание значения свойства, а также обработчик события нажатия на кнопку, в котором свойству формы ModalResult присваивается значение mrOK, что и приводит к закрытию (но не уничтожению!) формы.

Однако, самый большой интерес представляет функция RunTestForm. Как можно заметить, она определена вне класса формы, хотя и в том же модуле. Это может показаться странным программистам VB, где модуль класса полностью отождествляется с самим классом. Как и в Delphi, в Lazarus это не так. Хотя в одном модуле можно определить только одну форму (иначе визуальный дизайнер форм не сможет работать), другие элементы приложения не обязательно реализовывать отдельно. В нашем случае функция RunTestForm содержит код, необходимый для создания формы, передачи ей начального значения поля ввода и возврата отредактированного значения. Очевидно, что RunTestForm по смыслу связана с классом формы, поэтому будет разумно (хотя и вовсе не обязательно) расположить её в модуле формы.

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

Вот и всё. Только не забудьте в свойствах проекта удалить дополнитетьную форму из списка автоматически создающихся форм. Теперь можно потестировать, то, что у нас получилось. Запустите программу и понажимайте кнопки на главной форме. Обратите внимание, что пока дополнительная форма присутствует на экране, Вы не можете перевести фокус на какую-либо другую форму, как и положено для модального режима. И наверняка Вы подумаете, что такое поведение не всегда является подходящим. Вот это и обсудим далее.

Открытие форм в немодальном режиме

Итак, для начала определимся, что предназначение, поведение немодальной формы и принципы работы с ней совершенно другие. Прежде всего, немодальные формы не приспособлены для возврата значений, так как после их открытия программа не останавливается в ожидании закрытия формы, а продолжает выполняться. Из-за этого, если не предпринять специальных мер, указатель на открываемую форму будет утерян после завершения работы кода, который её создаёт (в нашем случае - это функция RunTestForm). Так ли это ужасно? В большинстве случаев - нет. Помните, что при создании экземпляра формы в конструктор передавался параметр Application? Так вот: Application - это объект, который представляет всё наше приложение. При таком создании формы он будет помнить о её присутствии, а мы сможем этим воспользоваться. Создадим в главной форме список, который будем заполнять именами форм, открытых в приложении. Основная форма при этом несколько изменится и будет выглядеть примерно так:


Обратите внимание, что мы задекларировали новый метод FillWindowsList, который как раз и выполняет заполнение списка форм приложения. Его реализация не слишком сложна: Здесь есть некоторый интересный момент. Дело в том, что объект Application содержит единый список всех компонент, которыми владеет, поэтому приходится проверять, что очередной компонент является именно TForm.

Однако, что толку просто выводить список форм. Нужно сделать так, чтобы можно было переключиться на любую из них. В реальном приложении это, конечно, лучше сделать с помощью меню, но код получится несколько более громоздким, поэтому в нашем простом примере во-первых будем использовать список, а во-вторых опустим необходимые в реальном приложении проверки. Ниже представлен весь код секции реализации модуля основной формы. Обратите внимание, что вызывая метод RunTestForm мы уже не ждём возвращаемого значения, но зато вызываем процедуру заполнения списка окон приложения.

Теперь создадим дополнительную форму, которую будем открывать из главной формы в немодальном режиме. Внешне она ничем не будет отличаться от рассмотренной в предыдущей главе модальной формы, а вот код несколько изменится. Обратите внимание, что свойство TestValue теперь только для записи, а метод RunTestForm стал процедурой вместо функции.

Появилась и новая глобальная переменная - счётчик форм Form2Count. Она понадобится нам, когда создаваемому экземпляру формы мы будем присваивать имя. Все объекты приложения должны иметь уникальные имена, однако LCL об этом никак не заботится, поэтому придётся действовать самостоятельно. Код, связанный с переменной Form2Count достаточно тривиален, поэтому останавливаться на нём не будем.

Реализация тоже довольно сильно изменилась. Показ формы теперь производится вызовом метода Show, а не ShowModal, поэтому выполнение программы не передаётся в создаваемую форму до её закрытия, а продолжается. О закрытии и освобождении ресурсов теперь должна заботиться сама форма. Для этого в процедуре обработки события закрытия формы мы присвоим переменной CloseAction значение caFree. Нажатие на кнопку теперь вызывает не установку значения ModalResult, а явное обращение к методу Close.

Если Вы не просто читали эту статью, а создавали попутно описанную тестовую программу, самое время её запустить. Только снова не забудьте убрать дополнительную форму из списка автоматически создающихся при старте приложения.

Исходные тексты игр (252)

Моя первая игра
*для компиляции нужен Python 3.7 и модуль к нему pyinstaller
-------
Инструкция по компиляции
переходим в папку с файлом и прописавыем в командной строке pyinstaller -F Game.py
в место proga пишем имя файла
-------
P.S. она весит мало

2D-игра Гонка на выживание, на WinAPI, среда Code::Blocks 17.12, wx2.8.12(unicode) 32-бит, версия C++14.

Полноценный сокобан. Реализовано 6 уровней(Можно больше. дорисовать их самому и закинуть в папку map). Моя первая программа. Интересно мнение.

крестики нолики со вкусом))
сами увидите обязательно прочитете тхт файл

Пример простой Raycast графики с возможностью перемещения по карте, и вращения камеры, на ассемблере компилятор FASM, работает в реальном режиме. Используется 13h видео режим BIOS 320х200, 256 цветовой режим.


Используются прерывания BIOS
- INT 10h
- INT 16h

Возможности графической оболочки:
- Заливка экрана
- Рисование спрайтов
- Рисования прямоугольников ( простых линий )
Особенности графической оболочки
- Небольшой вес, простота
- Использование видео буфера для создания фрейма

В данной версии можно вращать камеру, отрисовка сцены происходит за счет бросания луча, чем луч длиннее тем препятствие дальше, чем оно дальше тем оно меньше.

Плюсы этого исходника:
- Почти полностю рабочий raycast
- Возможность вращения камеры
-Возможность перемещения в пространстве.
Минусы:
- Низкая производительность нужна оптимизация

В стандартной поставке Delphi и Lazarus есть встроенные математические функции унаследованные из языка Паскаль:

Функция Pascal Математическая функция
sqr(x) Квадрат числа х
sqrt(x) Квадратный корень из числа х
abs(x) Модуль числа х
trunc(x) Целая часть числа х
frac(x) Дробная часть числа х
x div y Целочисленное деление x на y. Дробная часть числа отбрасывается. Например: 25 div 10 = 2
x mod y Получение дробной части при делении х на y. Например: 25 mod 10 = 5
exp(x) Число е (2,718282) в степени х
ln(x) Логарифм натуральный числа х
round(x) Округление числа х до ближайшего целого
inc(x,y) Инкремент - увеличение х на величину у. Если у не указано, то х увеличивается на 1
dec(x,y) Декремент - уменьшение х на величину у. Если у не указано, то х уменьшается на 1
randomize Включение генератора случайных чисел
random(a) Получение случайного числа в диапазоне от 0 до а (а - целое число)
sin(x) Синус аргумента х (аргумент в радианах)
cos(x) Косинус аргумента х (аргумент в радианах)
arcTan(X) Арктангенс аргумента х (аргумент в радианах)



Функции модуля Math

В списке встроенных функций явно не хватает таких функций как: возведение числа в произвольную степень; извлечение произвольного корня из числа; обратные тригонометрические функции и так далее.
Для расширения математических возможностей программ есть подключаемый модуль Math. Перед началом работы следует подключить этот модуль в разделе Uses.
Модуль Math содержит следующие математические функции:

Функция Описание
ArcSin(X) арксинус аргумента X (-1 : 1) (Возвращает значение в радианах)
ArcCos(X) арккосинус аргумента X (-1 : 1) (Возвращает значение в радианах)
Tan(X) тангенс аргумента (угол X в радианах)
Cotan(X) котангенс угла (угол X в радианах)
Log10(X) вычисление десятичного логарифма
Log2(X) вычисление двоичного логарифма числа X
LogN(y,x) вычисление логарифма числа x по основанию y
Max(a,b) возвращает максимальное число из двух чисел
Min(a,b) возвращает минимальное число из двух чисел
Power (X, N) возведение числа X в произвольную степень N
Hypot(X,Y) вычисление гипотенузы по длине катетов
RadToDeg(X) Преобразование радиан в градусы
DegToRad(X) Преобразование градусов в радианы
Floor Округление в меньшую сторону
Ceil Округление в большую сторону

Имея такой богатый набор функций можно создать серьёзный инженерный калькулятор.



Интерфейс инженерного калькулятора

Разработаем калькулятор в среде разработки Lazarus (В среде Delphi интерфейс и коды программы будут аналогичными).
Сначала расставим элементы интерфейса, так как показано на рисунке:


В заголовке окна (Caption) следует написать "Инженерный калькулятор" и для окна настроить шрифт (Font), так что бы он хорошо отображался и на дочерних объектах. Например: Arial, 12 pt, Bold (жирный).
Заголовкам объектов следует присвоить надписи, как показано на рисунке:


Рассмотрим функциональное назначение элементов интерфейса:
Label1 (?) - будет отображать знак операции или название функции;
Label2 (z) - будет отображать результат вычислений;
Edit1, Edit2 - предназначены для ввода аргументов вычислений;
Button1 (=) - вычисление;
Button2 (+) - ввод знака сложения;
Button3 (-) - ввод знака вычитания;
Button4 (/) - ввод знака деления;
Button5 (*) - ввод знака умножения;
Button6 (Sin) - ввод функции Sin;
Button7 (Cos) - ввод функции Cos;
Button8 (Power) - ввод функции возведения числа x в степень n;
Button7 (Sq) - ввод функции извлечения корня n из числа x;

В объектном паскале аргумент тригонометрических функций принято задавать в радианах. Для переключения между градусами и радианами поставим на форме группирующую панель (GroupBox1) и переключатели (RadioButton1, RadioButton2):


Для RadioButton1 в свойстве Checked следует установить значение True. Затем, у GroupBox1 удалить заголовок Caption, а у объектов RadioButton1и RadioButton2 сделать заголовки как показано на рисунке:


Для работы с калькулятором потребуется ещё одна кнопка "Сброс" (Button10), которая будет очищать поля ввода. Поставим её в любом удобном месте, например как показано на рисунке:





Реализация калькулятора

Сначала следует подключить в разделе uses модуль Math:

uses
Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls, Math;
Для идентификации нажатых кнопок арифметических знаков и функций нужна будет индексная переменная, назовём её, например Ind и поместим в разделе глобальных переменных:

var
Form1: TForm1;
Ind: Integer;

Начнём программирование с создания события (двойным щелчком) для кнопки "Сброс":

//Кнопка сброс
procedure TForm1.Button10Click(Sender: TObject);
begin
Ind:= 0;
Label1.caption:= '';
Label2.caption:= '';
Edit1.Clear;
Edit1.SetFocus;
Edit2.Clear;
Edit2.Enabled:= false;
end;

В этой процедуре мы написали Edit2.Enabled:= false; - заблокировали редактор Edit2. Это нужно для того, чтобы пользователь не мог ввести туда данные, если вычисляет функции с одним аргументом. При арифметических вычислениях и функциях с двумя аргументами мы будем разблокировать этот редактор.
Запустим программу на исполнение (F9), нажмём кнопку "Сброс" и убедимся, что все поля очищаются.


Закроем программу и сделаем ещё дополнительные настройки для кнопок. Для этого выделим, например кнопку "Sq(xn)" и в свойствах в поле ShowHint поставим значение True. Затем, в поле Hint (подсказка) напишем: Корень n из числа x.
Запустим программу и убедимся что на этой кнопке появляется подсказка при наведении курсора мыши.


Аналогичным образом следует сделать подсказки на остальные кнопки. Мы видим, что подсказка появляется и буквально через секунду исчезает. Для удобного пользования подсказками увеличим выдержку подсказки, например до 5 секунд. Для этого, выделим окно форму и двойным щелчком создадим событие FormCreate:

//Создание формы
procedure TForm1.FormCreate(Sender: TObject);
begin
Application.HintHidePause := 5000;
end;

В строке Application.HintHidePause := 5000 мы задаём время выдержки до закрытия подсказки 5 секунд (аргумент 5000 в миллисекундах).
Произведя все предварительные настройки, будем создавать код калькулятора. Выделим кнопку "+" (Button2) и двойным щелчком создадим событие:

// Кнопка +
rocedure TForm1.Button2Click(Sender: TObject);
begin
Label1.Caption:= '+';
Ind:= 1; //Индекс этой кнопки равен 1
Edit2.Enabled:= true; //Разблокируем редактор для ввода 2-го аргумента
end;

Аналогичным способом создадим события для кнопок - / * присваивая переменной Ind соответствующие значения - 2, 3, 4.

//Кнопка -
procedure TForm1.Button3Click(Sender: TObject);
begin
Label1.Caption:= '-';
Ind:= 2; //Индекс этой кнопки равен 2
Edit2.Enabled:= true;
end;
//Кнопка /
procedure TForm1.Button4Click(Sender: TObject);
begin
Label1.Caption:= '/';
Ind:= 3; //Индекс этой кнопки равен 3
Edit2.Enabled:= true;
end;
//Кнопка *
procedure TForm1.Button5Click(Sender: TObject);
begin
Label1.Caption:= '*';
Ind:= 4; //Индекс этой кнопки равен 4
Edit2.Enabled:= true;
end;

Далее, создадим событие на вычисление результата математических операций. Сначала напишем код для вычисления арифметических операций, проверим работоспособность программы, а затем, допишем строки для вычисления различных функций. Двойным щелчком на Button1 создадим событие и впишем строки:

procedure TForm1.Button1Click(Sender: TObject);
//Объявляем локальные переменные
var
x,y,z: real;
begin
//Проверяем ввод первого аргумента и преобразуем текст в число
if Edit1.Text <> '' then x:= StrToFloat(Edit1.Text) else exit;
// Проверяем ввод второго аргумента и преобразуем текст в число
if Edit2.enabled = true then
begin
if Edit2.Text <> '' then y:= StrToFloat(Edit2.Text) else exit;
end;
//Выбираем по индексу знак операции и производим вычисления
case Ind of
1: z:= x + y;
2: z:= x - y;
3: z:= x / y;
4: z:= x * y;
end;
//Выводим результат на Label2
Label2.Caption:= FloatToStr(z);
end;

Проверим, как работает программа, пока только арифметических вычислений:


Далее, будем создавать события на вычисление тригонометрических и математических функций.
Создадим двойным щелчком событие для кнопки вычисления синуса (Sin, Button6):

// Sin
procedure TForm1.Button6Click(Sender: TObject);
begin
Label1.Caption:= 'Sin';
Ind:= 5; //Индекс этой кнопки равен 5
Edit2.Enabled:= false; //Делаем недоступным ввод второго аргумента
end;

И допишем в процедуре вычисления, в разделе case (выделено жирным) строки вычисления синуса:



Такую же процедуру создадим для кнопки косинус (Cos, Button7):

//Cos
procedure TForm1.Button7Click(Sender: TObject);
begin
Label1.Caption:= 'Cos';
Ind:= 6; //Индекс этой кнопки равен 6
Edit2.Enabled:= false;
end;

В процедуру вычисления (=), в разделе case добавим строки:

И так, мы сделали вычисление функций с одним аргументом. Далее, разработаем алгоритм вычисления для функций с двумя аргументами. Выделим кнопку возведения в степень (Power, Button8) и двойным щелчком создадим событие:

// Power
procedure TForm1.Button8Click(Sender: TObject);
begin
Label1.Caption:= 'Power';
Ind:= 7; //Индекс этой кнопки равен 7
Edit2.Enabled:= true; //Включаем второй редактор
end;

Дописываем в процедуре (=) в разделе Case следующую строку:

Запускаем калькулятор, и убеждаемся, что возведение в степень работает исправно:


Аналогичным образом напишем процедуру для кнопки извлечения корня (Sq, Button9):

// Sq(x,n)
procedure TForm1.Button9Click(Sender: TObject);
begin
Label1.Caption:= 'Sq';
Ind:= 8; //Индекс этой кнопки равен 8
Edit2.Enabled:= true; //Включаем второй редактор
end;

И дописываем в раздел Case процедуры (=) следующую строку:

8: z:= power(x,1/y);
Запускаем калькулятор, и убеждаемся, что извлечение корня работает исправно:

Данная глава посвящена графическим средствам языка. Рассмотрены основные процедуры и функции работы с графикой. Приведён пример построения графика функции.

10.1 Средства рисования в Lazarus

При разработке проекта, в котором можно рисовать, в распоряжении программиста находится полотно (холст) — свойство Canvas , карандаш — свойство Pen , и кисть — свойство Brush .

Свойством Canvas обладают следующие компоненты:

  • форма (класс Tform );
  • таблица (класс TSringGrid );
  • растровая картинка (класс Timage );
  • принтер (класс TPrinter ).

При рисовании компонента, обладающего свойством Canvas , сам компонент рассматривается как прямоугольная сетка, состоящая из отдельных точек, называемых пикселями. Положение пикселя характеризуется его вертикальной (X) и горизонтальной (Y) координатами. Левый верхний пиксель имеет координаты (0,0) . Вертикальная координата возрастает сверху вниз, горизонтальная — слева направо. Общее количество пикселей по вертикали определяется свойством Height , а по горизонтали — свойством Weight . Каждый пиксель может иметь свой цвет. Для доступа к любой точке полотна используется свойство Pixels[X,Y]:TColor . Это свойство определяет цвет пикселя с координатами X(integer), Y(integer) .

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

Компонент . Canvas . Pixels [X,Y] : = Color ;

где Color — переменная или константа типа Tcolor .

Определены следующие константы цветов (табл. 10.1).

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

Color := Компонент . Canvas . Pixels [X,Y ];

где Color — переменная типа Tcolor .

Класс цвета точки Tcolor определяется как длинное целое longint . Переменные этого типа занимают в памяти четыре байта. Четыре байта переменных этого типа содержат информацию о долях синего (B), зелёного (G) и красного (R) цветов и устроены следующим образом: $00BBGGRR .

Для рисования используются методы класса TСanvas , позволяющие изобразить фигуру (линию, прямоугольник и т. д.) или вывести текст в графическом режиме, и три класса, определяющие инструменты вывода фигур и текстов:

  • TFont (шрифты);
  • TPen (карандаш, перо);
  • TBrush (кисть).

Класс TFONT. Можно выделить следующие свойства соответствующего объекта Canvas.TFont :

  • Name (тип string ) — имя используемого шрифта.
  • Size (тип integer ) — размер шрифта в пунктах ( points ). Пункт — это единица измерения шрифта, равная 0,353 мм или 1/72 дюйма.
  • Style — стиль начертания символов, который может быть обычным, полужирным ( fsBold ), курсивным ( fsItalic ), подчёркнутым ( fsUnderline ) и перечёркнутым ( fsStrikeOut ). В программе можно комбинировать необходимые стили, например, чтобы установить стиль "полужирный курсив" необходимо написать следующий оператор: Объект. Canvas. Font. Style : = [ fsItalic, fsBold ]
  • Color (тип Tcolor ) — цвет символов.
  • Charset (тип 0..255 ) — набор символов шрифта. Каждый вид шрифта, определяемый его именем, поддерживает один или более наборов символов. В табл. 10.2 приведены некоторые значения Charset .

Класс TPEN. Карандаш (перо) используется как инструмент для рисования точек, линий, контуров геометрических фигур. Основные свойства объекта Canvas.TPen :

  • Color (тип Tcolor ) — определяет тип линии;
  • Width (тип Integer ) — задаёт толщину линии в пикселях;
  • Style — даёт возможность выбрать вид линии. Это свойство может принимать значение, указанное в таблице 10.3.

Класс TBRUSH. Кисть ( Canvas.Brush ) используется методами, обеспечивающими вычерчивание замкнутых фигур для заливки. Кисть обладает двумя основными свойствами:

  • Color (тип Tcolor ) — цвет закрашивания замкнутой области;
  • Style (тип TBrushStyle ) — определяет стиль заполнения области ( bsSolid — сплошное заполнение, bsClear — прозрачное, bsHorizontal — горизонтальные линии, bsVertical — вертикальные линии, bsFDiagonal, bsBDiagonal — диагональные линии, bsCross — решётка, bsDiagCross — диагональная решетка).

Класс TCANVAS. Этот класс является основным инструментом для рисования графики. Рассмотрим его наиболее часто используемые методы.

procedure MoveTo(X, Y : integer );

Метод MoveTo изменяет текущую позицию пера на позицию, заданную точкой (X,Y) . Текущая позиция хранится в переменной PenPos типа Tpoint . Определение типа TPoint следующее:

Текущую позицию пера можно считывать с помощью свойства PenPos следующим образом:

procedure LineTo (X, Y : integer);

Метод LineTo соединяет прямой линией текущую позицию пера и точку с координатами (X,Y) . При этом текущая позиция пера перемещается в точку с координатами (X,Y) .

Рассмотрим работу процедуры на примере. Расположим на форме кнопку и рассмотрим процедуру обработки события TForm1.Button1Click , которая рисует прямые линии:

В результате щелчка по кнопке на форме будет нарисована прямая линия, соединяющая точку с координатами (0,0) и точку с координатами (30,50). При повторном щелчке по кнопке процедура продолжит рисовать эту же линию.

Теперь перепишем процедуру обработки события следующим образом:

При первом щелчке по кнопке на экране прорисуется аналогичная линия. Но при повторном щелчке процедура рисует линию, которая соединяет текущую точку с точкой, получившейся из текущей добавлением к координате X числа 30, а к координате Y — числа 50. Т. е. при повторном щелчке по кнопке процедура соединяет прямой линией точки (30,50) и (60,100) . При третьем щелчке по кнопке будут соединяться прямой линией точки (60,100) и (90,150) и т. д.

procedure PolyLine ( const Points array of TPoint );

Метод PolyLine рисует ломаную линию, координаты вершин которой определяются массивом Points .

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

После запуска программы и щелчка по кнопке Рисовать окно формы будет выглядеть, как на рисунке 10.1.

procedure Ellipse (X1, Y1, X2, Y2 : integer );

Метод Ellipse вычерчивает на холсте эллипс или окружность . X1, Y1, X2, Y2 — это координаты прямоугольника, внутри которого вычерчивается эллипс . Если прямоугольник является квадратом, то вычерчивается окружность .

procedure Arc (X1, Y1, X2, Y2, X3, Y3, X4, Y4 : integer );

Метод Arc вычерчивает дугу эллипса. X1, Y1, X2, Y2 — это координаты , определяющие эллипс , частью которого является дуга ; X3, Y3 — координаты , определяющие начальную точку дуги; X4, Y4 — координаты , определяющие конечную точку дуги. Дуга рисуется против часовой стрелки.

procedure Rectangle (X1, Y1, X2, Y2 : integer );

Метод Rectangle рисует прямоугольник . X1, Y1, X2, Y2 — координаты верхнего левого и нижнего правого углов прямоугольника.

Пример использования процедуры PolyLine

procedure RoundRect (X1, Y1, X2, Y2, X3, Y3 : integer );

Это метод вычерчивания прямоугольника со скруглёнными углами. X1, Y1, X2, Y2 — координаты верхнего левого и нижнего правого углов прямоугольника, а X3, Y3 — размер эллипса, одна четверть которого используется для вычерчивания скругленного угла.

procedure PolyGon ( const Points array of TPoint );

Метод PolyGon рисует замкнутую фигуру (многоугольник) по множеству угловых точек, заданному массивом Points . При этом первая точка соединяется прямой линией с последней. Этим метод PolyGon отличается от метода Poliline , который не замыкает конечные точки. Рисование осуществляется текущим пером Pen , а внутренняя область фигуры закрашивается текущей кистью Brush .

procedure Pie (X1, Y1, X2, Y2, X3, Y3, X4, Y4 : integer );

Метод Pie рисует замкнутую фигуру — сектор окружности или эллипса — с помощью текущих параметров пера Pen , внутренняя область закрашивается текущей кистью Brush . Точки (X1,Y1) и (X2,Y2) задают прямоугольник , описывающий эллипс . Начальная точка дуги определяется пересечением эллипса с прямой , проходящей через его его центр и точку (X3,Y3) . Конечная точка дуги определяется пересечением эллипса с прямой , проходящей через его центр и точку (X4,Y4) . Дуга рисуется против часовой стрелки от начальной до конечной точки. Рисуются прямые, ограничивающие сегмент и проходящие через центр эллипса и точки (X3,Y3) и (X4,Y4) .

Пример использования методов рисования фигур

Создадим форму, установим ей размеры Heigth — 500, Weight — 500. Внизу разместим кнопку, зададим ей свойство Caption — "Рисовать". При запуске программы и щелчке по этой кнопке на форме прорисуются различные фигуры (см. рис. 10.2). Ниже приведён листинг программы , демонстрирующий работу перечисленных методов. Результат работы программы приведен на рис. 10.2.

procedure TextOut (X, Y : integer; const Text : String );

Эта функция пишет строку текста Text , начиная с позиции с координатами (X,Y) . Текущая позиция PenPos пера Pen перемещается в конец выведенного текста. Надпись выводится в соответствии с текущими установками шрифта Font , фон надписи определяется установками текущей кисти. Для выравнивания позиции текста на канве можно использовать методы, позволяющие определить высоту и длину текста в пикселях — TextExtent, TextHeight и TextWidth . Рассмотрим эти функции.

function TextExtent ( const Text : String ) : Tsize;

Эта функция возвращает структуру типа Tsize , содержащую длину и высоту в пикселях текста Text , который предполагается написать на канве текущим шрифтом.

function TextHeight ( const Text : String ) : integer;

Функция возвращает высоту в пикселях текста Text , который предполагается написать на канве текущим шрифтом.

function TextWidth ( const Text : String ) : integer;

Функция возвращает длину в пикселях текста Text , который предполагается написать на канве текущим шрифтом. Это позволяет перед выводом текста на канву определить размер надписи и расположить её и другие элементы изображения наилучшим образом.

Если цвет кисти в момент вывода текста отличается от того, которым закрашена канва, то текст будет выведен в цветной прямоугольной рамке, но её размеры будут точно равны размерам надписи.

Мы рассмотрели основные функции рисования. Теперь можно перейти непосредственно к рисованию. Но перед этим следует заметить, что если вы свернёте окно с графикой, а затем его восстановите, то картинка на форме исчезнет. Изменение размеров окна также может испортить графическое изображение в нём. Для решения этой проблемы существуют процедуры обработки событий Объект.FormPaint и Объект.FormResize . Процедура Объект.FormPaint выполняется после появления формы на экране, а процедура Объект.FormResize — после изменения размера формы. Следовательно, все операторы рисования нужно помещать внутрь Объект.FormPaint и дублировать в процедуре Объект.FormResize .

Lazarus - это бесплатный инструмент разработки с открытым исходным кодом для Free Pascal compiler, который, в свою очередь, также является бесплатным и с открытым исходным кодом. Интегрированная среда разработки Lazarus (IDE, см. Скриншоты)) - это среда программирования для создания автономных графических и консольных приложений.

В настоящее время Lazarus работает на Linux, macOS, FreeBSD и Windows и предоставляет настраиваемый редактор исходного кода и среду создания визуальных форм вместе с менеджером пакетов, отладчиком и полной интеграцией графического интерфейса с Free Pascal Compiler ,

Contents

Обзор

Lazarus это бесплатный инструмент разработки с открытым кодом, предназначенный для также бесплатного компилятора с открытым кодом Free Pascal (object pascal). IDE Lazarus (screenshot) это стабильная богатая возможностями среда разработки для создания самостоятельных графических и консольных приложений. В настоящее время она работает на Linux, FreeBSD и Win32 и предоставляет настраиваемый редактор кода и визуальную среду создания форм вместе с менеджером пакетов, отладчиком и GUI полноcтью интегрированным с компилятором FreePascal.

Начнем - Ваша первая Lazarus-программа!

Найдите, установите(Installing Lazarus) и запустите Lazarus, который кроме того содержит и компилятор FreePascal.

На экране появятся несколько окон: главное окно вверху, Инспектор Объектов (Object Inspector) слева, занимаюший большую часть экрана Редактор Кода Lazarus (Lazarus Source Editor), и готовое к использованию окно Form1 поверх окна Редактора.

В главном окне сверху, под строкой меню располагается строка вкладок. Если вкладка 'Standard' еще не выбрана, выберите ее, щелкнув на ней левой кнопкой мыши. Затем найдите иконку Button (прямоугольник с текстом 'Ok' на нем) и щелкните на ней мышкой. Затем щелкните в окне Form1, где-нибудь слева от середины. Появится затененный прямоугольник с надписью 'Button1'. Вновь щелкните на иконке Button на вкладке Standard и щелкните на Form1 где-нибудь справа от центра: появится прямоугольник с надписью 'Button2'.

Теперь щелкните на Button1 чтобы выбрать ее. Инспектор Объектов отобразит свойства объекта Button1. Не далеко от верхнего края располагается свойство с именем 'Caption', в котором отображается значение 'Button1'. Щелкните в этой строке и измените 'Button1' на 'Нажми меня' (прим.пер.: в оригинальном тексте 'Press'. Далее будет приводиться только русский текст надписей, а оригинальный можно посмотреть на странице с английским текстом). Если вы нажмете клавишу ENTER или щелкнете в другой строке, то увидите, что надпись на первой кнопке Form1 изменилась на 'Нажми меня'. Теперь щелкните в Инспекторе объектов на вкладке Events (События) и вы увидите различные события, на которые может реагировать кнопка. Среди них OnClick, OnEnter, OnExit и так далее. Щелкните в строке справа от OnClick: появится маленькая кнопка с троеточием (. ). Если вы ее нажмете, то автоматически перенесетесь в Редактор Кода и курсор окажется в участке кода, начинающегося с:

Нажмите F12 для переключения от Редактора Кода к окну формы Form1.

Теперь отредактируйте свойства кнопки2 (Button2): щелкните на Button2 для отображения ее свойств в Инспекторе Объектов. Измените свойство Caption на 'Выход' вместо 'Button2'. Теперь перейдите на вкладку событий (Events) и щелкните в строке OnClick. Щелкните на кнопке с троеточием и перенеситесь в Редактор Кода, в тело другой процедуры:

Теперь нажмите F12 чтобы увидеть форму Form1 вновь. Теперь вы можете попытаться скомпилировать. Простейшим способом сделать это является выбор в главном меню пункта 'Run' а в появившемся подменю пункта 'Run'. Вы также можете просто нажать клавишу F9. Сначала произойдет компиляция, а затем (если все в порядке) линковка и запуск вашей программы.

Попробуйте щелкнуть на кнопке 'Нажми меня'. Вы увидите, что надпись на ней сменится на 'Нажми еще раз'. Если вы нажмете еще раз, то на кнопке так и останется надпись 'Нажми еще раз'!!

Теперь щелкните на кнопке с надписью 'Выход'. Окно закроется и программа завершится. Вновь появится окно формы Form1 с точечной сеткой, готовое для редактирования.

Теперь (и вообще почаще) вы можете сохранить свою работу выбрав последовательно пункты меню Project > Save Project As > имя_вашего_файла.pas

Вторая попытка.

Вновь откройте сохраненный вами проект.

На форме Form1 щелкните на кнопке 'Нажми меня' (Button1) чтобы выбрать ее. В Инспекторе Объектов перейдите на вкладку событий (Events), щелкните на строке справа от события OnClick, щелкните на кнопке с многоточием, чтобы перенестись к соответствующему участку кода в Редакторе.

Измените код, на приведенный ниже:

Сделай дело - гуляй смело!

Если вы хотите писать консольные или программы с текстовым интерфейсом на Pascal (например, если вы следуете стандартному курсу изучения программирования на Pascal, или вам нужно написать программу для работы в командном режиме или системную программу) вы также можете использовать Lazarus для написания, компилирования и выполнения ваших программ. Это прекрасная среда для программирования на Pascal. Смотри Console Mode Pascal.

Редактор

Когда вы запускаете Lazarus в первый раз, на вашем рабочем столе появляется набор несвязанных 'плавающих' окошек.

Первое, расположенное в самом верху рабочего стола имеет название Lazarus Editor vXXXXXX - project1 (название зависит от используемой версии и названия открытого проекта). Это главное окно управления проектом и оно содержит Главное Меню и Палитру Компонентов (Component Palette).

Lazmain.jpg

Строкой ниже располагается Главное Меню с обычными пунктами File, Edit, Search, View и некоторыми специфичными для Lazarus. Ниже Слева располагается набор кнопок, предоставляющих быстрый доступ к некоторым функциям главного меню, и справа - Палитра Компонентов. (Примечание переводчика: если при установке вы выбираете русский язык, то весь интерфейс будет на русском, то есть пункты меню, названия окон и вкладок, а также подсказки. В связи с этим далее все названия указаны на русском, а в скобках (на английском) языке. В любой момент можно переключить язык интерфеса в пункте меню Окружение. )

Под окном редактора Lazarus слева располагается окно Инспектора Объектов, а справа Редактор Исходного Кода (Lazarus Source Editor). Может быть и другое окно меньшего размера, озаглавленное Form1, расположенное поверх Редактора Исходного Кода. Если его в данный момент не видно, то можно переключиться к нему, нажав клавишу F12, которая позволяет переключаться между Редактором Исходного Кода и Окном Формы. Окно формы это то место, где вы разрабатываете графический интерфейс вашей программы, а в Редакторе Исходного Кода отображается разрабатываемый вами Pascal-код вашего приложения. Использование Инспектора Объектов детально обсуждается ниже после описания Палитры Компонентов.

Когда вы начинаете новый проект (или впервые запускаете Lazarus) по умолчанию создается стандартная форма, состоящая из прямоугольника с точечной сеткой для более легкого позиционирования различных компонентов на форме и системная строка сверху, которая обычно содержит кнопки Свернуть, Развернуть и Закрыть. Если вы щелкните мышкой в любом месте формы, вы увидите ее свойства в Инспекторе Объектов у левого края экрана.

Главное меню

For a detailed description of every menu item which is accessible from the Lazarus IDE Main Menu, please refer to the Main menu/ru page.

Кнопочная панель

Маленькая панель в левой верхней части основного окна, слева от палитры компонентов, имеет набор кнопок, повторяющих наиболее часто применяемые выборы основного меню:

Создать модуль, Открыть (со стрелкой вниз для отображения списка недавно использованных файлов), Сохранить, Сохранить все, Создать форму, Переключить Форма/Модуль (т.е. показать либо форму, либо модуль исходного кода), Показать модули, Показать формы, Запуск (т.е. компиляция и выполнение), Пауза, Шаг со входом, Шаг в обход (последние два – функции отладчика).

Палитра Компонентов

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

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

Если навести курсор мыши на иконку палитры компонентов без нажатия, появится название данной компоненты. Заметьте, что каждое название начинается с 'T', что означает 'Тип', а точнее 'Класс' компоненты. При выборе компоненты для размещения на форме, Class добавится в секцию type раздела interface модуля (обычно в виде части на TForm1), и instance (образец) этого класса добавится в секцию var (обычно как переменная Form1). Все Methods (методы), разработанные для формы или ее компонент (процедуры или функции) будут помещены в раздел implementation модуля.

В приведенном ниже списке компонентов можно найти связи с файлами, которые содержат описания модулей, в которых они найдены. Если нужно узнать о свойствах конкретного компонента, зачастую следует обратить внимание на Наследование этого компонента и просмотреть свойства базового типа, из которого он произведен. Например, для изучения TMaskEdit очень полезно просмотреть TCustomMaskEdit.

ВКЛАДКИ (их имена понятны и не требуют разъяснений):

  • Standard
  • Additional
  • Common Controls
  • Dialogs

Некоторые полезные процедуры или функции группы Dialog не размещены на Палитре, но легко применяются путем прямого вызова из исходной программы.

Несколько хороших примеров использования компонентов находятся в папке $LazarusPath/lazarus/examples исходной установки. Многие программы показывают способы применения диалогов и других компонентов без использования IDE и палитры компонентов, при наличии файла определения отдельной формы: все компоненты явно и полно определены в основной программе. Другие программы примеров полностью используют IDE.

Некоторые примеры не будут сначала работоспособны: понадобится настройка путей и разрешений для файлов и папок. При желании скомпилировать пример убедитесь, что для файлов и папок установлены разрешения read/write/execute, или скопируйте файлы в папку с подходящими разрешениями.

Попробуйте выполнить программу 'testall' для просмотра меню доступных компонентов совместно с маленькими примерами тестовых форм для большинства из них; затем просмотрите исходный код для понимания принципов их работы!

  • Misc
  • Data Controls
  • Data Access
  • System
  • SynEdit

Для работы с палитрой нужно открыть форму (если форма не открыта, выбрать Файл -> Создать Форму). Щелкните на иконке нужного компонента на нужной вкладке Палитры, затем щелкните на форме, и этот компонент появится на ней. После этого можно выбрать новый компонент щелчком мыши, переместить его в желаемое место и подогнать размеры. Эти установки можно сделать также с помощью Инспектора Объектов, регулируя значения соответствующих свойств данного компонента.

При установке дополнительных компонентов, разработанных самостоятельно, или полученных со стороны, появятся дополнительные вкладки с соответствующими иконками на Палитре компонентов. Эти новые компоненты могут быть выбраны и использованы на формах, как и те, что поставлены по умолчанию.

Отладчик

Писал и редактировал: Romlo

Настройки

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

проект > параметры компилятора > вкладка "Связывание" >

  • галочка "Выдавать номера строк в ошибках времени исполнения"
  • галочка "Генерировать отладочную информацию для GDB (замедляет сборку)"

Кнопки

Управление отладкой производится вот этими пятью кнопками:

  • Зеленый треугольник - "Запуск" - скомпилировать и запустить приложение под отладчиком.
  • Вертикальные палочки - "Пауза" - здесь серые, а вообще синие - это пауза, можно приостановить приложение, например, при трассировке.
  • Квадратик - "Останов" - здесь серый, а вообще красный - закрыть приложение. Это если оно повисло (напр. в бесконечном цикле).

Остальные две кнопки используются при трассировке программы, про которую мы поговорим подробнее.

Трассировка

Трассировать программу - значит выполнять её шаг за шагом, построчно. Для трассировки какого-либо участка программы, нужно установить в нужном месте "точку останова". Для этого надо найти начало участка программы в редакторе кода, а затем щёлкнуть по его номеру слева. При этом сама строчка выделится красным, а рядом с номером появится красный кружок.

str debugger.PNG

После нажатия на "запуск", знак вопроса в кружке должен смениться галочкой. Если вместо галочки там крестик, значит, точка останова не была установлена по каким-то причинам. В этом случае лучше ещё раз проверить настройки и перезапустить Lazarus. Если же всё получилось, продолжим. Далее, нужно вызвать то событие, при котором начнёт выполняться данный участок кода (то есть если вы поставили точку останова в начале button1_click, например, то теперь вам надо нажать эту кнопку). При этом должен показаться редактор кода. Ранее красная строчка теперь станет серой, а галочка в кружке сменится стрелочкой:

str2 debugger.PNG

Вот теперь и вспомним про те две кнопки, что мы не рассмотрели. первая называется "Шаг со входом", вторая - "Шаг в обход". Смысл первой заключается в том, что если сейчас вы "стоите" на строчке с какой-то процедурой или функцией, то нажав эту кнопку, вы перейдете на эту процедуру и будете выполнять пошагово уже её. Когда она закончится, вы вернётесь обратно, но уже на следующую строку. Как несложно догадаться, нажав на вторую кнопку, вы не зайдёте в процедуру, она просто выполнится, а вы перейдёте на следующую строку.

Отдельно надо сказать, что "Шаг со входом" не работает, если функция, на которой вы "стоите", экспортирована из библиотеки (например, в WinAPI-функцию вы зайти не сможете).

Также имеется возможность просматривать содержимое переменных, для этого надо просто навести на неё мышку прямо в редакторе кода, во всплывающей подсказке будет указан адрес переменной и её содержимое:

var debugger.jpg

Ну и в дополнение к сказанному добавлю, что чтобы продолжить выполнение программы в обычном режиме (если вам надоело её трассировать), достаточно нажать кнопку "запуск". Ну а чтобы убрать точку останова, надо закрыть приложение и ещё раз щёлкнуть по номеру строки, на которой эта точка стоит. ну и после этого заново откомпилировать приложение.

Файлы Lazarus

Когда вы выполняете сохранение на самом деле вы сохраняете два файла:

(Вы сохраняете и больше, но это те файлы, которым вы даете имена). Файл проекта (lpr) и файл модуля (pas) должны иметь разные имена, потому что Lazarus присваивает имя модулю (в исходном коде) также, как и имя файла модуля, а программе по имени файла проекта (это необходимо сделать иначе компилятор может впоследствии не найти модуль по ссылке на него в файле проекта). Во избежание противоречий (ошибок) следует изменить все упоминания Unit1 на xxx.

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