SQLite — это встраиваемая библиотека, позволяющая нам управлять базой данных в нашем приложении без сервера, типа MySQL, Oracle Database и тд. Работать с такой базой данных одновременно может несколько процессов или потоков, за исключением записи. Для записи в такую базу требуется чтобы в данный момент к ней не осуществлялось других запросов, иначе попытка записи оканчивается неудачей.
Кстати говоря, многие известные приложения используют Sqlite:
- Mozilla Firefox (начиная с версии 3.0)
- Mozilla Thunderbird
- Фреймворк Qt
- Skype
- 1С:Предприятие
- Google Chrome
- Opera
Благодаря этим приложениям, SQLite считается самой распространённой базой данных в мире.
Итак давайте попробуем создать некое приложение в котором будет использоваться база данных. Возьмем за пример «Базу сотрудников» где будет указана информация о сотрудниках некой компании, например ОАО «Devlaz.ru»
Для начала нам понадобится скачать саму библиотеку: http://www.sqlite.org/download.html
Уроки программирования в Lazarus. Урок №1. Обзор среды программирования, типов проектов в Lazarus
Если вы программируете под Ubuntu, Linux и других Debian-like дистрибутивы, то также требуется установить libsqlite-dev/libsqlite3-dev, не только sqlite/sqlite3.
Скачав DLL библиотеку sqlite3.dll (под windows) ее требуется закинуть в папку с Lazarus (По умолчанию это C:Lazarus) и в папку с проектом.
После чего требуется установить пакет sqlite3laz который по умолчанию поставляется с Lazarus и пересобрать наш IDE.
С помощью sqlite3.exe скаченного с офф. сайта создаем базу данных:
Откроем CMD, перейдем в рабочий каталог sqlite3.exe, например диск С(в данной папке должен быть наш sqlite3.exe)
В командной строке пишем: sqlite3.exe devlaz.db
где devlaz.db имя вашей базы данных.
Должно появится окно приветствия:
SQLite version 3.12.2 2016-04-18 17:30:31
Enter «.help» for usage hints.
Создаем внутри таблицу с именем например devlaz, в которой будет 3 поля: Порядковый номер, ФИО и Телефон: create table devlaz(id integer primary key, fio string, tel string);
Данные в таблицу мы будем добавлять из программы поэтому завершим работу с sqlite3.exe вводом команды: .exit
В той же папке с программой sqlite3.exe должен появится наш файл db, закидываем его в папку с проектом.
Теперь перейдем к созданию приложения. Готовое приложение вы сможете скачать в конце статьи.
Для начала добавьте на форму компоненты TSQLite3DataSet с вкладки Data Access, TSQLite3Connection, TSQLQuery и TSQLTransaction с вкладки SQLdb. А для отображения данных нашей базы я добавил на форму DBGrid и TDataSource.
Теперь для того чтобы наша база загружалась с запуском программы, на FormCreate добавим следующий код:
procedure TForm1.FormCreate(Sender: TObject); begin //******************************* SQLite3Dataset.FileName:=’devlaz.db’; SQLite3Dataset.TableName:=’devlaz’; DataSource.DataSet:=SQLite3Dataset; SQLite3Connection.DatabaseName:=’devlaz.db’; SQLite3Connection.Transaction:=SQLTransaction; SQLTransaction.DataBase:=SQLite3Connection; SQLQuery.DataBase:=SQLite3Connection; SQLQuery.Transaction:=SQLTransaction; //******************************* try SQLite3Dataset.Open; SQLite3Connection.Connected:=True; except On E:Exception do ShowMessage(‘Ошибка открытия базы: ‘+ E.Message); end; end;
Создадим на форме 2-ве кнопки, для добавления новой записи и удаления. А также 3-и Edit’a для наших данных ID, ФИО и Тел.
[Пишем программы на Lazarus]. Пишем калькулятор
Для создания новой записи впишем след. код:
procedure TForm1.ButtonAddClick(Sender: TObject); begin SQLite3Dataset.Close; with SQLQuery do begin SQL.Clear; SQL.Add(‘INSERT INTO devlaz(fio, tel) VALUES(:FIO,:TEL)’); ParamByName(‘FIO’).Text:=EditFIO.Text; ParamByName(‘TEL’).Text:=EditTEL.Text; ExecSQL; SQLTransaction.Commit; Close; end; SQLite3Dataset.Open; end;
Поле id добавится автоматически, согласно след. порядковому номеру, поэтому его мы не указываем в запросе.
Для удаления записи будем использовать ID записи:
procedure TForm1.ButtonDelClick(Sender: TObject); begin SQLite3Dataset.Close; with SQLQuery do begin SQL.Clear; SQL.Add(‘DELETE FROM devlaz where ParamByName(‘ID’).Text:=EditID.Text; ExecSQL; SQLTransaction.Commit; Close; end; SQLite3Dataset.Open; end;
Вы можете откорректировать ваш SQL запрос на свое усмотрение, например удаление по ФИО или номеру телефона.
Ну и напоследок представим ситуацию что нам нужно найти определенную запись по какому-то критерию, допустим это будем ID, после чего вывести фамилию по этой записи как сообщение. Для этого добавим еще одну кнопку и назначим ей след. код:
procedure TForm1.ButtonFindClick(Sender: TObject); begin with SQLQuery do begin SQL.Clear; SQL.Add(‘SELECT * FROM devlaz where ParamByName(‘id’).Text:=EditID.Text; Open; end; ShowMessage(SQLQuery.FieldByName(‘fio’).AsString); SQLQuery.Close; end;
Вот мы и познали азы работы с SQLite. Скачать готовый проект
SQLite в Lazarus обновлено: 22 февраля, 2017 автором: Oleg E.
25 комментариев “ SQLite в Lazarus ”
Vadim says:
Олег не могли бы вы написать о демонах в Lazarus. а то как то замудрено везде пишут.
Oleg E. says:
Вадим приветствую. Хорошо, в планах я поставлю себе пометку описать процесс создания службыдемона
Дмитрий says:
Не могу понять, как сделать это «После чего требуется установить пакет sqlite3laz который по умолчанию поставляется с Lazarus и пересобрать наш IDE.». Скачивать автоматически не хочет, а после того как нашел какой то архив с вроде как тем самым пакетом, заменил им содержимое в папке с лазарусом, то при запуске проги появилось окно с ошибкой «невозможно найти MDE» или что то таке
Oleg E. says:
Зачем вам что-то скачивать? Я же написал, данный пакет расширений уже у вас должен быть по умолчанию, его лишь надо «активировать»
Здравствуйте, Олег!
Подскажите пожалуйста средствами Lazarus можно реализовать авторизацию пользователей и разграничение прав доступа к ресурсам . Вот на вашем примере, можно ли сделать так, чтобы можно было войти с логином и паролем и иметь доступ только на поиск данных, а другой пользователь имел возможность добавлять данные в бд и удалять или только добавлять?
С уважением Олег
Oleg E. says:
Приветствую Олег.
А почему нет? Вы должны будете сделать окно входа в программу, где указывается логин и пароль, программа производит идентификацию пользователя и перед выполнением транзакции проверяет, есть ли соответствующие полномочия у данного пользователя.
В теории все просто, над реализацией нужно немного подумать, но сложностей я думаю возникнуть не должно.
Ответ будет на мой вопрос по возможности авторизации при входе в приложение средствами lazarus?
Oleg E. says:
UP, новая работа совсем не оставляет мне свободного времени
Вы сайт сделали в основном как портфолио и благодаря этому нашли новую работу?
Oleg E. says:
Привет Олег,
Нет я работаю в области информационной безопасности. Программирование — это пока лишь мое хобби
mrkaban says:
Интересная статья спасибо, мне очень полезен блок про поиск данных, он получается будет находить с точным совпадением?
Алексей says:
Компонент SQLite3Dataset является обязательным? можно как то без него реализовать поиск данных и отображение?
Как получить список всех таблиц в SQLite и вывести их, например, в ListBox?
SQL-запрос выполнил: «SELECT * FROM sqlite_master WHERE type = «table» ORDER BY name», но не понимаю, как получить таки список таблиц и вывести их в ListBox.
Спасибо.
если у кого не будет работать
в procedure TForm1.FormCreate(Sender: TObject);
найдите строки
…
try
SQLite3Dataset1.Open;
SQLite3Connection1.Connected:=True;
except
…
и поменяйте 2 строки местами,чтоб получилось так:
try
SQLite3Connection1.Connected:=True;
SQLite3Dataset1.Open;
except
если используете код автора то единички в именах объектов уберите
Александр says:
блин!
win7 х64
поставил пакет sqlite3laz, перекомпилился IDE и lazarus больше не запускается.
sqlite.dll is missing
(на сайте http://www.sqlite.org/download.html скачивается sqlite3.dll)
переименовал в sqlite.dll — тоже не запускается, выкидывает ошибки на бракованный длл (entry-point not found для х64 и еще что то более мрачное для х86).
Slomchinskiy says:
Используйте dll из архива x86, и Lazarus запуститься без ошибок.
Akvalar says:
Что не так делаю? Компиляция проекта, цель: project1.exe: Код завершения 1, ошибок: 37
unit1.pas(46,3) Error: Identifier not found «SQLite3Dataset»
unit1.pas(47,3) Error: Identifier not found «SQLite3Dataset»
unit1.pas(48,3) Error: Identifier not found «DataSource»
unit1.pas(48,23) Error: Identifier not found «SQLite3Dataset»
unit1.pas(49,3) Error: Identifier not found «SQLite3Connection»
unit1.pas(50,3) Error: Identifier not found «SQLite3Connection»
unit1.pas(50,34) Error: Identifier not found «SQLTransaction»
unit1.pas(51,3) Error: Identifier not found «SQLTransaction»
unit1.pas(51,28) Error: Identifier not found «SQLite3Connection»
unit1.pas(52,3) Error: Identifier not found «SQLQuery»
unit1.pas(52,22) Error: Identifier not found «SQLite3Connection»
unit1.pas(53,3) Error: Identifier not found «SQLQuery»
unit1.pas(53,25) Error: Identifier not found «SQLTransaction»
unit1.pas(57,6) Error: Identifier not found «SQLite3Dataset»
unit1.pas(58,6) Error: Identifier not found «SQLite3Connection»
unit1.pas(69,3) Error: Identifier not found «SQLite3Dataset»
unit1.pas(71,8) Error: Identifier not found «SQLQuery»
unit1.pas(71,17) Error: Expression type must be class or record type, got
unit1.pas(73,5) Error: Identifier not found «SQL»
unit1.pas(74,5) Error: Identifier not found «SQL»
unit1.pas(75,5) Error: Identifier not found «ParamByName»
unit1.pas(75,34) Error: Identifier not found «Edit1»
unit1.pas(76,5) Error: Identifier not found «ParamByName»
unit1.pas(76,33) Error: Identifier not found «Edit2»
unit1.pas(77,5) Error: Identifier not found «ExecSQL»
unit1.pas(78,5) Error: Identifier not found «SQLTransaction»
unit1.pas(82,3) Error: Identifier not found «SQLite3Dataset»
unit1.pas(88,3) Error: Identifier not found «SQLite3Dataset»
unit1.pas(90,8) Error: Identifier not found «SQLQuery»
unit1.pas(90,17) Error: Expression type must be class or record type, got
unit1.pas(92,5) Error: Identifier not found «SQL»
unit1.pas(93,5) Error: Identifier not found «SQL»
unit1.pas(94,5) Error: Identifier not found «ParamByName»
unit1.pas(94,29) Error: Identifier not found «EditID»
unit1.pas(95,5) Error: Identifier not found «ExecSQL»
unit1.pas(96,5) Error: Identifier not found «SQLTransaction»
unit1.pas(100,3) Error: Identifier not found «SQLite3Dataset»
Источник: devlaz.ru
Lazarus 1.8.2
Программирование – это увлекательный и творческий процесс. А если вы знаете хотя бы один язык программирования, то еще интереснее. Ну а если не знаете, то мы предлагаем вам обратить внимание на язык программирования Pascal и среду разработки программного обеспечения Lazarus.
Lazarus – бесплатная среда программирования, которая основывается на компиляторе Free Pascal. Это визуальная среда разработке. Здесь сам пользователь получает возможность не только записывать программный код, но и наглядно (визуально) показывать системе, что бы он хотел увидеть.
Создание проектов
В Lazarus работу над программой можно разделить на две части: создание интерфейса будущей программы и написание программного кода. Вам будет доступно два поля: конструктор и, собственно, текстовое поле.
Редактор кода
Удобный редактор кода в Lazarus облегчит вам работу. Во время программирования вам будут предлагать варианты окончания слов, автоисправление ошибок и автозавершение кода, все основные команды будут выделятся. Все это поможет вам сэкономить время.
Графические возможности
В Лазарусе вы можете воспользоваться модулем Graph. Он позволяет вам задействовать графические возможности языка. Так вы сможете создавать и редактировать изображения, а также масштабировать, менять цвета, уменьшать и увеличивать прозрачность, и многое другое. Но, к сожалению, вы не сможете сделать ничего более серьезного.
Кроссплатформенность
Так как Lazarus основан на Free Pascal, то он также является кроссплатформенным, но, правда, скромнее Паскаля. Это значит, что все программы, которые вы написали будут одинаково хорошо работать на разных операционных системах, среди которых Linux, Windows, Mac OS, Android и другие. Лазарус приписывает себе слоган Java «Write once, run anywhere» («Напиши один раз, запускай везде») и в каком-то роде они правы.
Визуальное программирование
Технология визуального программирования позволяет строить интерфейс будущей программы из специальных компонентов, которые совершают необходимые действия. Каждый объект уже содержит в себе программный код, вам же нужно просто определить его свойства. То есть снова экономия времени.
Лазарус отличается от Алгоритма и HiAsm тем, что он совмещает в себе и визуальное программирование, и классическое. Это значит, что для работы с ним вам все же необходимы минимальные знания языка Pascal.
Достоинства
1. Легкий и удобный интерфейс;
2. Кроссплатформенность;
3. Скорость работы;
4. Практически полная совместимость с языком Delphi;
5. Доступен русский язык.
Недостатки
1. Отсутствие полноценной документации (справки);
2. Большие размеры исполняемых файлов.
Lazarus – это хороший вариант и для новичков, и для опытных программистов. Эта IDE (Integrated Development Environment) позволит вам создавать проекты любой сложности и полностью раскрыть возможности языка Pascal.
Успехов вам и терпения!
Источник: lumpics.ru
Lazarus — пишем компонент для анимации спрайтов
В одесской школе ученики 8-го класса на уроках информатики используют бесплатную кроссплатформенную среду разработки Lazarus (официальный сайт), внешне и внутренне очень напоминающую любимый многими Delphi, использующую версию Object Pascal под названием Free Pascal и в действительности сильно упрощающую процесс вхождения в программирование.
Но детям неинтересно писать программу для вычисления силы тяжести по непонятной им пока формуле F=mg. Практически все дети, которых я пытался учить программированию, с первого занятия хотят написать игру. К счастью, Lazarus прекрасно подходит и для написания несложных игр.
Правда, для создания анимированных спрайтов мне понадобился компонент, отображающий произвольный фрагмент изображения (на котором изображены несколько разных проекций одного и того же персонажа в разных фазах движения), а такого компонента в стандартной поставке нет. Написать его самому оказалось совсем несложно, и об этой технологии я и хочу рассказать в этой статье.
Для отображения веселого графического контента вместо сухого делового набора стандартных компонентов в Lazarus (как и в Delphi) есть 3 компонента на вкладке Additional:
— TImage (отображение картинки из произвольного файла);
— TShape (отображение одного из нескольких заранее заданных графических примитивов);
— TPaintBox (отображение холста, на котором можно рисовать программно).
Самое эффектное для школьника — загрузить небольшой спрайт в TImage и написать программу для перемещения его по экрану — по событиям мыши/клавиатуры, автоматически в цикле или автоматически по событию от таймера.
Как только это начинает работать, у школьника возникает следующий законный вопрос: а нельзя ли сделать так, чтобы персонаж двигался? И можно ли сделать сделать так, чтобы он смотрел не постоянно на нас, а поворачивался в сторону, совпадающую с направлением движения?
В Сети можно найти большое количество готовых изображений для использования при разработке игр. И многие персонажи заранее разработаны в несколько проекций и несколько кадров анимации (как, например, вот на этом сайте).
Вот пример изображения, где спрайты расположены в виде таблицы, у которой каждая строка соответствует определенной проекции, а каждый столбец — определенной фазе анимации:
Зачем так много картинок?
Для отображения такого спрайта достаточно поместить на экран простой компонент, отображающий не все изображение целиком, а только один его фрагмент; и затем, меняя смещение выделенного фрагмента по горизонтали и вертикали, можно заставить персонаж поворачиваться в разные стороны и совершать циклические движения (например, махи крыльями или шаги ногами). Такой прием часто используется при веб-разработке: даже простые наборы иконок для деловой графики часто размещают в одном файле и отображают в разных местах страницы с разным смещением, создавая впечатление разных изображений.
К сожалению, компонент TImage, входящий в стандартную поставку Lazarus (и Delphi), не позволяет показывать произвольный фрагмент изображения: изменяя его свойства, мы можем заставить его показывать только изображение целиком, левый верхний угол или центральную его часть. Для отображения произвольного фрагмента изображения, заданного смещением и размерами по обеим осям, нужен какой-то другой компонент. Но, как выяснилось, сделать его самостоятельно в Lazarus — совсем несложно!
Создаем новый компонент
В качестве инструкции по созданию компонентов я воспользовался официальным руководством.
Там все написано достаточно подробно, дублировать не имеет смысла. Я только остановлюсь на некоторых моментах.
1. Стандартный Project Wizard не предлагает нам создать package, и чтобы как-то получить доступ к редактору, выбираем «New Project» (в русской версии — «Новый проект»)
и затем «Application» (в русской версии — «Приложение»):
2. Действуя далее по инструкции, в меню «Package» (в русской версии — «Пакет») выбираем верхний пункт «New package. » (в русской версии — «Новый пакет. »), выбираем имя файла и путь для сохранения. Я назвал свой новый пакет «Game» и разместил его в отдельной папке с тем же названием:
Я создал отдельную папку Lazarus/Cmp в расчете на то, что у меня может появиться несколько разных пакетов с компонентами, и уже в этой папке создал папку «Game».
Если все сделано правильно, на экране должно появиться окно нового (пока пустого) пакета.
3. Действуя дальше опять же по инструкции, для создания нового компонента в окне пакета нажимаем кнопку «Add» (в русской версии — «Добавить») и в выпадающем списке выбираем «New Component» (в русской версии — «Новый компонент»):
В качестве класса-предка указываем TCustomImage — этот класс фактически используется для реализации компонента TImage, но отличается от него тем, что не содержит published properties и позволяет нам самим определить набор свойств, который будет доступен в дизайнере для нашего компонента.
Что такое published properties?
Для тех, кто этого не знает, уточню, что published — это раздел класса (наподобие public), в котором описываются новые или просто указываются унаследованные свойства, которые должны быть доступны в визуальном редакторе свойств на этапе разработки программы. Промежуточные классы не объявляют ничего в этой секции, оставляя возможность программисту самому вынести туда то, что он сочтет нужным. Так, класс TImage не добавляет никакой функциональности, а только помещает в раздел published ряд свойств, унаследованных от родителя TCustomImage. Часть из этих свойств нам нужно спрятать, поэтому мы также унаследуем наш новый компонент от TCustomImage и выведем в published только то, что не противоречит логике нашего компонента.
Пиктограмма (иконка) для компонента
Хорошим стилем было бы рисовать персональную иконку для каждого нового компонента, но так как наша задача — показать, как это все просто, мы оставим это поле пустым, что приведет к отображению на панели инструментов стандартной иконки, используемой в Lazarus/Delphi для всех самодельных компонентов.
Кстати, упомянутая выше инструкция содержит отдельный раздел, посвященный созданию иконок для компонентов — это для тех, кого не устраивает «дефолтная» иконка.
Заполнив все поля, нажимаем кнопку «Create New Component» (в русской версии — «Создать новый компонент»).
Добавляем код в новый компонент
Сразу после создания нового компонента его исходный код получается примерно таким:
unit ImageFragment; interface uses Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs; type TImageFragment = class(TCustomImage) private protected public published end; procedure Register; implementation procedure Register; begin RegisterComponents(‘Game’, [TImageFragment]); end; end.
Как и следовало ожидать, объявление класса абсолютно пусто, а имплементация вообще отсутствует. Все, что есть — функция регистрации компонента на вкладке «Game».
Нам нужно добавить несколько унаследованных published properties, создать два своих и переопределить одну виртуальную функцию. Приступим!
0. В секции импорта нам понадобятся два дополнительных модуля: ExtCtrls и LCLProc — добавляем их в раздел uses:
uses Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs, ExtCtrls, LCLProc;
1. Добавляем список published properties, полностью аналогичный компоненту TImage, за исключением нескольких properties, позволяющих изменить масштаб и позицию изображения:
published property AntialiasingMode; property Align; property Anchors; //property AutoSize; property BorderSpacing; //property Center; //property KeepOriginXWhenClipped; //property KeepOriginYWhenClipped; property Constraints; property DragCursor; property DragMode; property Enabled; property OnChangeBounds; property OnClick; property OnDblClick; property OnDragDrop; property OnDragOver; property OnEndDrag; property OnMouseDown; property OnMouseEnter; property OnMouseLeave; property OnMouseMove; property OnMouseUp; property OnMouseWheel; property OnMouseWheelDown; property OnMouseWheelUp; property OnPaint; property OnPictureChanged; property OnPaintBackground; property OnResize; property OnStartDrag; property ParentShowHint; property Picture; property PopupMenu; //property Proportional; property ShowHint; //property Stretch; //property StretchOutEnabled; //property StretchInEnabled; property Transparent; property Visible; end;
Для пущей убедительности я не удалил, а закомментировал те properties, которые есть в компоненте TImage, но будут мешать в нашем новом компоненте TImageFragment.
2. Добавляем в объявление класса два новых properties для задания смещения изображения по горизонтали и по вертикали:
private FOffsetX: Integer; FOffsetY: Integer; procedure SetOffsetX(AValue: Integer); procedure SetOffsetY(AValue: Integer); published property OffsetX: Integer read FOffsetX write SetOffsetX default 0; property OffsetY: Integer read FOffsetY write SetOffsetY default 0;
и не забываем добавить в имплементацию класса две объявленных процедуры:
implementation procedure TImageFragment.SetOffsetX(AValue: Integer); begin if FOffsetX = AValue then exit; FOffsetX := AValue; PictureChanged(Self); end; procedure TImageFragment.SetOffsetY(AValue: Integer); begin if FOffsetY = AValue then exit; FOffsetY := AValue; PictureChanged(Self); end;
3. Переопределяем виртуальную функцию DestRect:
public function DestRect: TRect; override;
и добавляем ее реализацию в имплементацию класса:
function TImageFragment.DestRect: TRect; begin Result := inherited DestRect(); if (FOffsetX <> 0) or (FOffsetY <> 0) then LCLProc.OffsetRect(Result, -FOffsetX, -FOffsetY); end;
Компилируем пакет и пересобираем Lazarus
1. В окне пакета нажимаем кнопку «Compile» (в русской версии — «Компилировать»). Если все сделано правильно, в окне сообщений появится зеленая надпись об успешной компиляции, если нет — надпись будет желтой или красной.
2. В том же окне нажимаем на кнопку «Use» (в русской версии — «Использовать») и в выпадающем меню выбираем второй пункт «Install» (в русской версии — «Установить»). Программа предложит пересобрать и перезапустить IDE — соглашаемся:
3. После перезапуска на панели инструментов появится новая вкладка «Game», а на ней — иконка для нашего нового компонента.
Вместо послесловия
В следующей статье Lazarus — простая анимация при помощи компонента TImageFragment я рассказал, как можно использовать такой компонент — за 5 минут создать окно, в котором анимированный персонаж будет двигаться в разные стороны и поворачиваться в сторону направления движения.
Если тема окажется интересной читателям, я могу дополнить этот цикл статьей о том, как, потратив чуть больше времени, можно сделать, к примеру, футбольное поле с парой футболистов, управляемых с клавиатуры.
А если хватит времени и желания — попробую написать разные алгоритмы управления персонажами (например, футболистами) и устроить между ними соревнования!
- lazarus
- free pascal
- game development
- custom components
- Совершенный код
- Delphi
- Разработка игр
Источник: habr.com