Решил освежить навыки работы в Lazarus, делаю тестовый проект just for fun.
Проект - простейшая оболочка для управления sqlite-базой медицинского учреждения. Вот он.
В паскале и lazarus не специалист (последние 2 года работаю андроид-разработчиком),
и уже столкнулся со многими неявными особенностями, поэтому решил создать эту тему.
Буду тут описывать основные выявленные проблемы и пути решения.
Возможно это поможет сделать Lazarus немного лучше.
Вводная:
- Lubuntu GNU/Linux 13.10 x86_64:
- fpc 2.6.2-5 (из штатного репозитория);
- sqlite 3.7.17 (из штатного репозитория);
- Lazarus 1.3 (svn r43678);
- RxLib (svn r2887);
Проблема №1. Путь к файлу базы данных
Проблема уже обсжудалась на этом форуме раньше.
По умолчанию в свойстве TSQLite3Connection.DatabaseName прописываю значение clinic.db, и ожидаю, что приложение будет искать базу в своём каталоге.
При открытии базы в runtime это действительно так, по нажатию на кнопку всё работает:
- Код: Выделить всё
procedure TPatientsListForm.Button1Click(Sender: TObject);
begin
sqlPatientsList.Close;
sqlPatientsList.SQL.Text:= 'select * from patients_view;';
CoreDataModule.mSQLite3Connection.Connected:= True;
CoreDataModule.mSQLTransaction.Active:= True;
sqlPatientsList.Open;
end;
Но в design-time соединиться с базой не удаётся, потому что по умолчанию приложение ищет (и создаёт) файл БД в корне домашнего каталога! Проблема решается копированием файла базы в home, тогда можно работать с проектом. Но скомпилированный бинарнитк опять будет искать файл БД рядом с собой.
Тут, кстати, есть следующие грабли, хотя и довольно тривиальные, но я наступил:
Проблема №1.1. Порядок вызова CreateForm в главном файле проекта имеет значение!
Скопировав файл базы в домашнюю папку, и настроив поля в grid-е, не сразу понял, почему собранное приложение падает с исключением TApplication.HandleException Database not assigned!. Проблема оказалась в том, что TSQLite3Connection расположен в отдельном TDataModule, и он должен иницилизироваться раньше, чем форма приложения. Это в принципе логично, но то, что при неправильном файле проекта БД спокойно открывалась в design-time и в запущенном проекте по кнопке, поначалу сбило с толку.
Проблема №2. Надпись (MEMO) вместо текста в Grid
Проблема известная. Проявляется как у стандартного DBGrid, так и у RxDBGrid.
Дело в том, что для sqlite тип TEXT - основной, и любые другие типы преобразуются к нему. Почитать об этом можно здесь.
Естественно, изначально проектируя базу я везде использовал TEXT, и в итоге получил (MEMO) вместо данных на всех полях. Нарвавшись на эти грабли, пришлось менять везде TEXT на VARCHAR: для sqlite всёравно, а гриды теперь работают. Но считаю, что это баг (ссылка на документацию по типам sqlite приведена).
... думаю, дальше найдётся ещё немало косяков, буду сообщать
Добавлено спустя 2 часа 39 минут 46 секунд:
Проблема №3. Как включить сортировку в RxDBGrid + sqlite?
Прочёл темы на форуме: Сортировщик TRxDBGrid для TSQLQuery, Сортировки в RxDBGrid, а также заметку в блоге alexs.
Заголовки грида настроил, RxSortSqlDB на форму положил. По клику на заголовки столбцов сортировки не происходят.