Мемориальные заметки для Lazarus
(заметка написана 9.07.2016 и перенесена сюда исключительно "на память")
После перехода с Дельфи и по мере освоения Лазаруса начинаешь понимать, что среды все-таки довольно сильно отличаются друг от друга. Это отличие особенно заметно, если писать кроссплатформенное приложение. И проявляется оно тем, что для разных ОСей одни и те же функции и константы описаны в разных модулях.
Чтобы все время не рыться в исходниках, решил положить для себя несколько напоминалок здесь, на виду.
1. Функции и константы
2. Потоки в Линукс
3. Автоинкрементация номера сборки
4. Макросы среды
5. Особенности символов переноса строки
6. Функции хэширования
7. Папка с настройками
8. Вывод исполняемого файла в отдельную папку
9. Некоторые директивы компиляции
1. Функции и константы.
Модуль для Linux Модуль для Windows Функция или константа
LCLIntf JwaWinUser GetKeyState
LCLType LCLType Virtual key code
LMessages Windows WM_USER/SendMessage
Обычно модули добавляются после Uses раздела Interface так:
{$IFDEF UNIX}
, LCLIntf //GetKeyState for LINUX
, LCLType //virtual key code for LINUX
, LMessages //WM_USER for LINUX
{$ELSE}
, JwaWinUser//GetAsyncKeyState of WINDOWS
, windows //WM_USER for WINDOWS
{$ENDIF}
2. Потоки в Linux.
При использовании потоков компилирующийся и работающий на винде проект, в Линуксе вдруг валится с ошибкой. Проблему должно решить следующее: в файл проекта в разделе uses необходимо добавить следующий код:
uses
{$IFDEF UNIX}
cthreads, cmem,
{$ENDIF}
Interfaces, // this includes the LCL widgetset
<skiped>;
{$R *.res}
uses
{$IFDEF UNIX}
cthreads, cmem,
{$ENDIF}
Interfaces, // this includes the LCL widgetset
<skiped>;
{$R *.res}
3. Автоинкрементация номера сборки
При выставлении в настройках проекта опции "Автоматически наращивать номер сборки"
фишка будет работать только в том случае, если компилировать проект <Shift + F9> (вместо привычных по Дельфям <Ctrl +F9> или просто F9)
4. Макросы среды
Вещь нужная и полезная, когда не хочется вручную прописывать различные параметры при компиляции, сборках и экспорте данных. Статья на русском тут
5. Особенности символов перевода строки
Когда я импортировал проект, успешно запускающийся под отладчиком в Lazarus на винде, в Lazarus на линуксе, то при попытке запуска получил вот такое "веселое" окошко
Проблема оказалась в следующем: в редакторе кода исходник, написанный в винде, имел "виндовое" окончание строк. После исправления этого "недоразумения" (ПКМ --> Параметры файла --> Конец строки)
Update: начиная с версии lazarus 1.7 такой ошибки в Линуксе больше нет, несмотря на разную кодировку конца строки. Для Windows ошибка сохраняется, если окончание строки указано не CRLF.
6. Функции хэширования.
Оказывается в FPC уже есть готовые и удобные функции для получения хэша, которые находятся здесь ...\fpc\3.0.0\source\packages\hash\src\ в файлах md5.pp и sha1.pp
Для получения строки хэша необходимо написать свою обертку с использованием функций MDPrint и MDString/MDBuffer/MDFile (для MD5) или SHA1Print и SHA1String/SHA1Buffer/SHA1File (для SHA1).
Пример взят отсюда
uses ..., md5, LCLProc;
function Get_md5hash(aStr: UTF8String): ansistring;
var
a: TMDDigest;
i: integer;
begin
Result := '';
a := MD5String(aStr);
for i := Low(a) to High(a) do
Result := Result + IntToHex(a[i], 1);
end;
.....
var
s: AnsiString;
begin
.......
s := Get_md5hash('test');
.....
end;
7. Папка с настройками.
Иногда надо, чтобы IDE загружала свои настройки из произвольной папки. В таком случае необходимо в корневую папку с лазарусом положить файл lazarus.cfg со следующим содержанием
--primary-config-path=/<полный абсолютный путь к папке с настройками>/<папка с настройками>
Таким образом можно иметь на одной машине несколько версий среды, каждая из которых будет иметь свой каталог настроек.
8. Вывод исполняемого файла в отдельную папку
Поскольку в Лазарусе есть возможность создания исполняемого файла как с отладочной информацией (режим Debug, или Default), так и без нее (режим Release), то возникает потребность, чтобы эти файлы "складывались" в "свои" отдельные папки. Для этого следует сделать следующее:
1. Создаем новый проект, сохраняем его куда-нибудь на диск, затем открываем опции проекта Project --> Project Options (<Ctrl>+<Shift>+<F11>) и переходим на вкладку Compiler Options --> Paths
4. Затем удаляем режим "Debug", ставим галку "Active" напротив строки с режимом "Default" и сохраняем настройки
6. То же самое проделываем для режима "Release", только вводим release\$NameOnly($(ProjFile))-$(TargetCPU)-$(TargetOS)-$(LCLWidgetType). В этом случае в название файла еще будет входить и название виджета, под который он собран (на скрине ниже будет собран файл под win x32).
На выходе получаем "большой" файл с отладочной информацией в папке debug
Также можно собрать исполняемый файл без отладочной информации для всех указанных в проекте платформ.
Процесс сборки будет сопровождаться пояснениями
Как видно из их размера, один из файлов содержит отладочную информацию, а другой нет
9. Некоторые директивы компиляции
1. Выше уже говорилось о двух режимах компиляции проекта: debug и release. Чтобы разделить режим сборки в коде, можно использовать директиву компилятора {$IFOPT D+}
{$IFOPT D+}
//код для режима сборки debug
{$ELSE}
//код для режима сборки release
{$ENDIF}