Перенесення Delphi-проєкту в Lazarus без зайвих помилок
27.05.2026Як перенести старий Delphi-проєкт у Lazarus і не зламати все одразу
Найчастіша ситуація виглядає знайомо: ви відкриваєте старий Delphi-код у Lazarus, натискаєте Compile — і отримуєте десятки повідомлень про відсутні ідентифікатори, несумісні типи або проблеми з формами. Це не означає, що проєкт “не переноситься”. Зазвичай потрібно правильно увімкнути Delphi-сумісний режим, прибрати зайві залежності й перевіряти код поетапно.
Запит як перенести проект Delphi в Lazarus часто зводиться до одного: як зробити так, щоб старий код хоча б зібрався, а вже потім адаптувати його під Free Pascal і LCL. Саме такий підхід і працює найкраще.
Що таке Free Pascal, Lazarus і {$mode Delphi}
Плутанина зазвичай починається тут. Free Pascal — це компілятор. Lazarus — середовище розробки та візуальний фреймворк поверх нього. А {$mode Delphi} — це режим синтаксису, який робить код ближчим до того, до чого звикли розробники Delphi.
Іншими словами, Lazarus не є “Delphi-клон у точному сенсі”. Він може працювати з багатьма Delphi-патернами, але не гарантує, що старий проєкт збереться без жодних правок. Режим {$mode Delphi} допомагає наблизити синтаксис, але не замінює повну сумісність бібліотек, компонентів і особливостей середовища.
Коли вмикати Delphi mode
Якщо ви переносите старий код, який писався під Delphi-стиль: з використанням class of, властивостей, RTTI-особливостей, старого синтаксису оголошень або специфічних конструкцій, почати варто саме з {$mode Delphi} у вихідних файлах. Часто його ставлять на початку модуля після unit:
{$mode Delphi}
У деяких випадках додатково потрібні директиви на кшталт {$H+}, якщо проєкт розрахований на довгі рядки типу AnsiString/String поведінки, знайомої з Delphi.
Перший крок міграції: зібрати мінімальну версію
Найкраща стратегія — не переносити все одразу. Спочатку спробуйте зібрати мінімальний варіант проєкту без сторонніх бібліотек, без складних компонентів і без нестандартних обробників. Якщо це GUI-проєкт, почніть із головної форми та базових подій.
- Відкрийте проєкт у Lazarus і подивіться, чи імпортуються форми.
- Приберіть або тимчасово закоментуйте сторонні компоненти, які не входять до стандартного набору.
- Перевірте, які юніти підключені в
uses. - Підключайте залежності по одній, а не всі одразу.
Такий підхід дає змогу швидко зрозуміти, чи проблема в синтаксисі, чи в бібліотеці, чи у візуальному компоненті.
Типові помилки після перенесення Delphi-коду
1. Identifier not found
Це одна з найчастіших помилок після міграції. Вона означає, що компілятор не бачить тип, змінну, функцію або константу. Причина може бути різною: відсутній юніт у uses, інша назва класу, невірний режим мови або залежність, яка була доступна в Delphi, але не підключена в Lazarus.
Що робити: перевірити uses, порядок підключення юнітів, наявність потрібного пакета й те, чи не використовує код імена з іншого namespace.
2. Mode-related syntax issues
Іноді код виглядає правильним, але Lazarus сприймає його як інший діалект Pascal. Наприклад, можуть виникати проблеми з оголошенням властивостей, типів процедур, перевантаженням методів або старими Delphi-конструкціями. Якщо бачите незрозумілі синтаксичні помилки, перш за все перевірте, чи дійсно модуль компілюється в {$mode Delphi}.
3. Рядки та Unicode
Під час перенесення старих Delphi-проєктів часто спливають відмінності у роботі зі строками. Старий код може розраховувати на іншу поведінку String, AnsiString або символів, що впливає на роботу з файлами, БД та UI. Якщо в проєкті є конвертації між байтами, кодовими сторінками та текстом, ці місця треба перевіряти особливо уважно.
Не варто вважати, що будь-який рядковий код автоматично працюватиме однаково. Саме тут часто з’являються помилки “наче компілюється, але поводиться не так”.
4. Проблеми зі сторонніми компонентами
Компонент, який був у Delphi-проєкті, може не мати прямого аналога в Lazarus або вимагати окремого пакета. Часто це стосується візуальних віджетів, звітів, графіки, мережевих бібліотек і старих обгорток над API.
У таких випадках є три варіанти: знайти компонент із LCL-сумісним аналогом, замінити його на стандартний, або ізолювати залежність і переписати тільки проблемний модуль.
5. Помилки з формами та властивостями компонентів
Delphi-форма може відкриватися, але деякі властивості компонентів будуть втрачені або змінені. Lazarus використовує LCL, а це означає, що не всі властивості й події мапляться один в один. Якщо форма “з’їхала”, перевірте, чи не залежить вона від специфічної поведінки VCL-компонентів.
6. База даних, ODBC і старі драйвери
У legacy-проєктах часто є підключення до БД через старі компоненти або ODBC. Тут міграція може зламатися не на рівні коду, а на рівні доступних драйверів і налаштувань середовища. Насамперед варто перевірити, чи компонент підтримується в Lazarus, чи правильний тип з’єднання використовується, і чи не залежить код від Delphi-специфічного провайдера.
7. Потоки та синхронізація інтерфейсу
Код, що працював у Delphi, може поводитися інакше в Lazarus через відмінності у взаємодії з GUI. Якщо є потоки, таймери або фонова обробка, перевірте оновлення форми з неосновного потоку. Для LCL це особливо важливо: будь-яке пряме втручання в інтерфейс із потоку може призводити до нестабільної роботи.
Практичний порядок діагностики
Щоб не витрачати час на хаотичні правки, йдіть у такому порядку:
- Увімкніть {$mode Delphi} у модулях, де це потрібно.
- Зберіть проєкт без сторонніх бібліотек.
- Виправте синтаксичні помилки та відсутні ідентифікатори.
- Підключайте компоненти по одному.
- Перевірте форми, події та властивості.
- Окремо протестуйте рядки, файли, БД та потоки.
- Після успішної збірки перевірте роботу на тій ОС, де плануєте запуск.
Які компоненти зазвичай сумісні, а які потребують заміни
Найменше проблем зазвичай зі стандартними елементами Lazarus і з кодом, що використовує базові класи Pascal. Більше складнощів виникає з компонентами, які щільно прив’язані до Delphi VCL або до специфічних бібліотек Windows.
Якщо компонент працює через стандартні абстракції і має LCL-версію або сумісний пакет, перенесення йде легше. Якщо ж це вузькоспеціалізований візуальний елемент або старий комерційний пакет без підтримки, часто простіше замінити його, ніж намагатися “дотиснути” сумісність.
Короткий чекліст міграції
- Перевірте, чи потрібен проєкту {$mode Delphi}.
- Почніть із компіляції базових модулів без зовнішніх залежностей.
- Виправте
usesі відсутні юніти. - Порівняйте рядкову логіку та кодування тексту.
- Окремо протестуйте БД, потоки й обробники форм.
- Додавайте сторонні компоненти поступово.
- Після Windows-збірки перевірте поведінку на Linux, якщо це потрібно проєкту.
Висновок
Перенесення Delphi-проєкту в Lazarus — це не одна кнопка, а послідовний процес. Якщо почати з Delphi compatibility mode, спочатку зібрати мінімальну версію й лише потім повертати бібліотеки, шанси швидко знайти проблемне місце значно вищі. У більшості випадків ламається не весь проєкт, а кілька типових зон: синтаксис, рядки, компоненти, БД або GUI-специфіка.
Саме тому найкраща стратегія — рухатися від простого до складного. Спершу компіляція, потім інтерфейс, далі залежності, а вже після цього повноцінне тестування логіки. Такий підхід допомагає безболісно адаптувати старий код під Lazarus і зберегти максимум готової роботи.