Перейти до вмісту

VCL

Матеріал з K2 ERP Wiki Ukraine — База знань з автоматизації та санкцій в Україні

VCL або Visual Component Library — це бібліотека візуальних і невізуальних компонентів для швидкої розробки Windows-застосунків у Delphi та C++Builder. VCL є однією з ключових частин екосистеми Delphi й історично стала головним інструментом для створення desktop-програм, бізнес-систем, ERP/CRM-рішень, облікових програм, форм, таблиць, діалогів, звітів і застосунків для роботи з базами даних.

VCL тісно повʼязана з Windows API і орієнтована насамперед на створення нативних Windows desktop-застосунків.

VCL — це серце класичного Delphi desktop: форми, кнопки, таблиці, меню, події, компоненти й швидка розробка Windows-програм.

Коротко

Параметр Значення
Назва VCL
Повна назва Visual Component Library
Тип Бібліотека компонентів для розробки Windows-застосунків
Основна мова Object Pascal / Delphi
Також використовується C++Builder
Платформа Windows
Середовище Delphi IDE / RAD Studio
Основне призначення Швидка розробка desktop-застосунків із графічним інтерфейсом
Ключові елементи TForm, TButton, TEdit, TLabel, TPanel, TMainMenu, TDBGrid, TDataSource
Альтернатива в Delphi для cross-platform FireMonkey / FMX
Схожа open source-ідея LCL у Lazarus

Головна ідея VCL

Головна ідея VCL — дозволити розробнику швидко створювати Windows-застосунки з готових компонентів.

Типовий підхід:

створити форму;
додати компоненти;
налаштувати властивості;
підключити події;
написати бізнес-логіку;
скомпілювати нативний Windows-застосунок.

VCL дозволяє не малювати інтерфейс вручну через Windows API, а працювати з вищим рівнем абстракції: формами, кнопками, меню, таблицями, панелями, діалогами, data-aware компонентами й подіями.

VCL перетворює складну Windows GUI-розробку на роботу з компонентами, властивостями й подіями.

Важливі акценти

Статус Теза Пояснення
Ключове VCL орієнтована на Windows Це головна бібліотека Delphi для класичних Windows desktop-застосунків.
Ключове VCL є компонентною бібліотекою Інтерфейс будується з компонентів: форм, кнопок, таблиць, меню, панелей.
Ключове VCL підтримує RAD-підхід Форми можна створювати візуально через дизайнер Delphi.
Ключове VCL дуже сильна для бізнес-систем Облік, ERP, CRM, склад, документи, звіти й бази даних — класичні сценарії VCL.
Важливо VCL не є cross-platform бібліотекою Для кросплатформеності в Delphi використовується FireMonkey / FMX.
Увага VCL-проєкти часто містять багато логіки у формах Якщо не розділяти UI, бізнес-логіку й доступ до даних, проєкт швидко стає важким для підтримки.

Історія

VCL зʼявилася разом із Delphi у 1995 році як одна з головних переваг середовища.

На той час створення Windows-застосунків часто вимагало значної роботи з Windows API, ресурсами, повідомленнями й ручним керуванням інтерфейсом. Delphi запропонував інший підхід:

  • візуальний дизайнер форм;
  • компоненти;
  • Object Inspector;
  • події;
  • швидку компіляцію;
  • нативні Windows-застосунки;
  • просту роботу з базами даних;
  • зрозумілий Object Pascal.

VCL стала однією з причин популярності Delphi в корпоративній і бізнес-розробці.

VCL, Delphi і Object Pascal

VCL тісно повʼязана з Delphi та Object Pascal.

Термін Що означає
Object Pascal Мова програмування, якою пишеться Delphi-код
Delphi IDE, компілятор, платформа й екосистема
VCL Бібліотека компонентів для Windows desktop
RAD Studio Середовище Embarcadero, яке включає Delphi та C++Builder
C++Builder Інструмент RAD Studio для C++-розробки, який також може використовувати VCL

Object Pascal — це мова. Delphi — середовище. VCL — бібліотека компонентів для Windows desktop.

Для чого використовується VCL

Напрям Як використовується VCL Приклади
Windows desktop Створення нативних Windows-програм Облікові програми, утиліти, адмінпанелі
ERP Документи, склад, фінанси, довідники, звіти Desktop ERP, локальні бізнес-системи
CRM Клієнти, угоди, задачі, історія взаємодії Desktop CRM, робоче місце менеджера
Бази даних Форми, таблиці, data-aware компоненти Firebird, InterBase, PostgreSQL, MSSQL, Oracle
Звіти Друк документів, актів, накладних Рахунки, накладні, касові звіти
Склад Робота із залишками, партіями, рухами товарів Складська програма, інвентаризація
Торгівля Робочі місця оператора, касира, адміністратора POS, облік продажів, прайс-листи
Інженерні програми Спеціалізовані Windows-застосунки Розрахунки, обладнання, технічні програми
Legacy Підтримка старих корпоративних систем Delphi 5/7/XE/modern Delphi-проєкти

RAD-підхід у VCL

RAD означає Rapid Application Development — швидка розробка застосунків.

VCL є класичним прикладом RAD-підходу.

Розробник може:

  • створити форму в дизайнері;
  • додати компоненти з палітри;
  • налаштувати властивості через Object Inspector;
  • двічі натиснути на кнопку;
  • отримати готовий обробник події;
  • написати кілька рядків коду;
  • швидко запустити програму.

Приклад обробника кнопки:

procedure TForm1.Button1Click(Sender: TObject);
begin
  ShowMessage('Hello from VCL!');
end;

Основні поняття VCL

Поняття Пояснення
Form Вікно застосунку
Component Візуальний або невізуальний елемент
Control Візуальний компонент, який має інтерфейс
Property Властивість компонента
Event Подія, наприклад OnClick або OnCreate
Method Метод класу або компонента
Owner Обʼєкт, який володіє компонентом
Parent Візуальний контейнер компонента
Message Windows-повідомлення, яке може обробляти компонент

TForm

TForm — базовий клас для вікон VCL-застосунку.

Форма може містити:

  • кнопки;
  • поля введення;
  • таблиці;
  • меню;
  • панелі;
  • вкладки;
  • діалоги;
  • компоненти доступу до даних;
  • невізуальні компоненти.

Приклад класу форми:

type
  TMainForm = class(TForm)
    Button1: TButton;
    Label1: TLabel;
    procedure Button1Click(Sender: TObject);
  end;

Компоненти VCL

VCL містить багато компонентів.

Група Приклади Для чого
Standard TButton, TLabel, TEdit, TMemo Базові елементи інтерфейсу
Additional TImage, TShape, TBevel Додаткові елементи
Win32 / Common Controls TTreeView, TListView, TProgressBar Windows common controls
Dialogs TOpenDialog, TSaveDialog, TColorDialog Стандартні діалоги
Menus TMainMenu, TPopupMenu Меню застосунку
Data Access TDataSource, queries, connections Робота з даними
Data Controls TDBGrid, TDBEdit, TDBNavigator Візуальна робота з базами
System TTimer, TActionList, TImageList Невізуальні системні компоненти

Візуальні та невізуальні компоненти

У VCL є два великі типи компонентів.

Тип Пояснення Приклади
Візуальні Видимі на формі під час виконання TButton, TEdit, TLabel, TPanel
Невізуальні Не показуються користувачу, але виконують логіку TTimer, TDataSource, TOpenDialog, TActionList

Невізуальні компоненти в дизайнері видно на формі, але в запущеній програмі користувач їх не бачить.

Властивості компонентів

Властивості визначають стан і вигляд компонента.

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

  • Name;
  • Caption;
  • Text;
  • Width;
  • Height;
  • Left;
  • Top;
  • Align;
  • Anchors;
  • Font;
  • Color;
  • Enabled;
  • Visible;
  • TabOrder.

Приклад у коді:

Button1.Caption := 'Зберегти';
Button1.Enabled := True;
Label1.Caption := 'Готово';

Події

Події — основа VCL-програмування.

Типові події:

Подія Коли спрацьовує
OnClick Коли користувач натиснув компонент
OnCreate Коли форма створюється
OnDestroy Коли форма знищується
OnChange Коли змінюється значення
OnKeyDown Коли натиснута клавіша
OnMouseMove Коли рухається миша
OnClose Коли форма закривається

Приклад:

procedure TForm1.Edit1Change(Sender: TObject);
begin
  Label1.Caption := Edit1.Text;
end;

Object Inspector

Object Inspector — інструмент Delphi IDE для налаштування компонентів.

Через Object Inspector можна:

  • змінювати властивості;
  • призначати події;
  • редагувати Caption;
  • змінювати Align;
  • налаштовувати Font;
  • створювати обробники OnClick;
  • змінювати DataSource;
  • працювати з Action.

Object Inspector — це місце, де компонент налаштовується без ручного редагування всього коду.

DFM-файл

У VCL форма складається не тільки з Pascal-коду, а й з опису інтерфейсу.

Зазвичай є два повʼязані файли:

Файл Призначення
.pas Код форми
.dfm Опис компонентів форми

Приклад ідеї DFM:

object MainForm: TMainForm
  Caption = 'Main Form'
  object Button1: TButton
    Caption = 'OK'
    Left = 20
    Top = 20
  end
end

DFM зберігає те, що розробник розмістив на формі у дизайнері.

Owner і Parent

У VCL важливо розуміти різницю між Owner і Parent.

Поняття Значення
Owner Хто відповідає за життєвий цикл компонента
Parent У якому візуальному контейнері компонент відображається

Приклад:

Button := TButton.Create(Self);
Button.Parent := Panel1;
Button.Caption := 'OK';

Тут:

  • Self є Owner;
  • Panel1 є Parent.

Створення компонентів у коді

Компоненти можна створювати не тільки через дизайнер, а й вручну.

procedure TForm1.FormCreate(Sender: TObject);
var
  Button: TButton;
begin
  Button := TButton.Create(Self);
  Button.Parent := Self;
  Button.Caption := 'Натисни мене';
  Button.Left := 20;
  Button.Top := 20;
end;

Якщо Owner заданий як Self, форма автоматично звільнить компонент при знищенні.

TButton

TButton — стандартна кнопка.

Приклад:

procedure TForm1.ButtonSaveClick(Sender: TObject);
begin
  ShowMessage('Дані збережено');
end;

Типові властивості:

  • Caption;
  • Enabled;
  • Default;
  • Cancel;
  • ModalResult;
  • OnClick.

TEdit

TEdit — однорядкове поле введення.

procedure TForm1.Button1Click(Sender: TObject);
begin
  ShowMessage('Введено: ' + Edit1.Text);
end;

Типові властивості:

  • Text;
  • MaxLength;
  • PasswordChar;
  • ReadOnly;
  • CharCase.

TMemo

TMemo — багаторядкове поле введення.

Memo1.Lines.Add('Новий рядок');
Memo1.Lines.SaveToFile('log.txt');

TLabel

TLabel — текстовий напис.

Label1.Caption := 'Готово';

TPanel

TPanel — контейнер для інших компонентів.

Його використовують для:

  • групування елементів;
  • створення layout;
  • панелей інструментів;
  • зон форми;
  • відокремлення блоків інтерфейсу.

TMainMenu і TPopupMenu

TMainMenu створює головне меню програми.

TPopupMenu створює контекстне меню.

Приклад обробника пункту меню:

procedure TForm1.MenuItemExitClick(Sender: TObject);
begin
  Close;
end;

TActionList

TActionList дозволяє централізовано описувати дії.

Action може бути повʼязаний із:

  • кнопкою;
  • пунктом меню;
  • toolbar-кнопкою;
  • shortcut;
  • popup menu.

Це зручно, коли одна дія доступна в кількох місцях інтерфейсу.

Приклад:

procedure TForm1.ActionSaveExecute(Sender: TObject);
begin
  SaveDocument;
end;

Align і Anchors

VCL має властивості для розміщення компонентів.

Властивість Для чого
Align Автоматичне вирівнювання компонента
Anchors Привʼязка до країв форми

Типові значення Align:

  • alNone;
  • alTop;
  • alBottom;
  • alLeft;
  • alRight;
  • alClient.

Приклад:

PanelTop.Align := alTop;
Memo1.Align := alClient;

VCL і Windows API

VCL побудована поверх Windows API.

Це означає, що VCL:

  • використовує Windows controls;
  • працює з Windows messages;
  • підтримує Win32/Win64;
  • має доступ до handles;
  • дозволяє обробляти системні повідомлення;
  • може взаємодіяти з DLL, COM, ActiveX.

Приклад доступу до handle:

ShowWindow(Form1.Handle, SW_SHOW);

Messages у VCL

VCL дозволяє обробляти Windows-повідомлення.

Приклад:

type
  TForm1 = class(TForm)
  private
    procedure WMSize(var Message: TWMSize); message WM_SIZE;
  end;

procedure TForm1.WMSize(var Message: TWMSize);
begin
  inherited;
  // логіка при зміні розміру
end;

Це корисно для глибшої інтеграції з Windows.

VCL і бази даних

VCL історично дуже сильна в роботі з базами даних.

Типові компоненти:

  • TDataSource;
  • TDBGrid;
  • TDBEdit;
  • TDBNavigator;
  • TDBComboBox;
  • TDBLookupComboBox;
  • TDBMemo;
  • TDBText.

Для доступу до даних у сучасному Delphi часто використовується FireDAC.

Data-aware компоненти

Data-aware компоненти автоматично повʼязуються з джерелом даних.

Типова схема:

База даних
→ Connection
→ Query / Dataset
→ DataSource
→ DBGrid / DBEdit / DBNavigator

Приклад:

DBGrid1.DataSource := DataSource1; DBEditName.DataSource := DataSource1; DBEditName.DataField := 'name';

Data-aware компоненти — одна з причин, чому Delphi/VCL був таким сильним для облікових і бізнес-систем.

TDBGrid

TDBGrid — таблиця для відображення dataset.

Використовується для:

  • списків клієнтів;
  • товарів;
  • документів;
  • замовлень;
  • залишків;
  • платежів;
  • довідників.

Типова схема:

FDQueryCustomers
→ DataSourceCustomers
→ DBGridCustomers

FireDAC і VCL

FireDAC — сучасна бібліотека доступу до даних у Delphi.

У VCL-застосунках FireDAC часто використовується для підключення до:

  • SQLite;
  • Firebird;
  • InterBase;
  • PostgreSQL;
  • MySQL;
  • MariaDB;
  • Microsoft SQL Server;
  • Oracle Database;
  • ODBC-джерел.

Приклад SQL-запиту:

FDQuery1.SQL.Text := 'SELECT * FROM customers WHERE city = :city';
FDQuery1.ParamByName('city').AsString := 'Київ';
FDQuery1.Open;

VCL у ERP

VCL дуже часто використовувалася для ERP-систем.

Причини:

  • швидка розробка форм;
  • зручна робота з таблицями;
  • data-aware компоненти;
  • нативний Windows UI;
  • хороша робота з базами даних;
  • просте розгортання в локальній мережі;
  • стабільність;
  • можливість інтеграції з обладнанням;
  • довгий життєвий цикл застосунків.

Типові ERP-модулі на VCL:

Модуль Що автоматизує
Склад Залишки, рух товарів, партії, інвентаризація
Продажі Замовлення, рахунки, накладні, акти
Закупівлі Постачальники, надходження, заявки
Фінанси Оплати, каса, банк, взаєморозрахунки
CRM Клієнти, контакти, історія взаємодії
Виробництво Специфікації, операції, плани
Документообіг Договори, акти, внутрішні документи

VCL у CRM

VCL підходить для desktop CRM-систем.

Типові можливості:

  • картка клієнта;
  • список клієнтів;
  • історія контактів;
  • угоди;
  • задачі;
  • дзвінки;
  • документи;
  • комерційні пропозиції;
  • календар;
  • звіти.

VCL і звіти

У VCL-застосунках часто потрібні звіти.

Приклади:

  • рахунок;
  • накладна;
  • акт;
  • касовий звіт;
  • залишки товарів;
  • продажі за період;
  • звіт по клієнтах;
  • фінансовий звіт;
  • друк етикеток.

Для звітів можуть використовуватись:

  • FastReport;
  • QuickReport;
  • ReportBuilder;
  • DevExpress VCL Reports;
  • власна генерація HTML/PDF/Excel;
  • друк через Canvas.

VCL і друк

VCL дозволяє працювати з друком через стандартні механізми Windows і компоненти.

Типові задачі:

  • друк документа;
  • попередній перегляд;
  • вибір принтера;
  • друк етикетки;
  • друк чека;
  • друк звіту;
  • експорт у PDF через сторонні компоненти.

VCL і обладнання

VCL-застосунки часто використовувалися для інтеграції з обладнанням.

Приклади:

  • фіскальні реєстратори;
  • касові апарати;
  • сканери штрихкодів;
  • принтери етикеток;
  • ваги;
  • POS-термінали;
  • COM-порти;
  • USB-пристрої;
  • DLL-драйвери;
  • промислові контролери.

VCL часто зустрічається там, де Windows-програма керує реальним робочим місцем: касою, складом, оператором, обладнанням або локальною базою.

VCL і багатопоточність

VCL не є потокобезпечною для прямого доступу з фонових потоків до UI.

Якщо фоновий потік має оновити інтерфейс, потрібно використовувати синхронізацію.

Приклад ідеї:

TThread.Synchronize(nil,
  procedure
  begin
    Label1.Caption := 'Готово';
  end
);

Або:

TThread.Queue(nil,

 procedure
 begin
   ProgressBar1.Position := 50;
 end

);

UI VCL потрібно оновлювати з головного потоку.

VCL Styles

VCL Styles дозволяють змінювати зовнішній вигляд VCL-застосунку.

Вони можуть використовуватись для:

  • темної теми;
  • світлої теми;
  • корпоративного стилю;
  • сучаснішого вигляду старої програми;
  • єдиного оформлення інтерфейсу.

Але при використанні стилів потрібно перевіряти:

  • сторонні компоненти;
  • custom drawing;
  • діалоги;
  • старі форми;
  • нестандартні controls;
  • продуктивність.

VCL і DPI

Сучасні Windows-застосунки мають враховувати DPI scaling.

Проблеми можуть виникати на:

  • 125%;
  • 150%;
  • 200%;
  • 4K-моніторах;
  • кількох моніторах із різним DPI.

Для якісного VCL-застосунку потрібно тестувати масштабування інтерфейсу.

VCL і Unicode

Старі Delphi/VCL-проєкти могли використовувати ANSI-рядки. Сучасні версії Delphi використовують Unicode-рядки.

Це важливо при:

  • міграції старого коду;
  • роботі з файлами;
  • роботі з базами даних;
  • інтеграції з API;
  • кирилиці;
  • імпорті/експорті;
  • старих компонентів.

VCL і Unicode-міграція

При модернізації старих Delphi-проєктів часто потрібно перевірити:

  • string / AnsiString / UnicodeString;
  • кодування файлів;
  • SQL-запити;
  • драйвери баз даних;
  • сторонні компоненти;
  • API-виклики;
  • роботу з кирилицею.

VCL і legacy

VCL дуже часто зустрічається в legacy-системах.

Legacy VCL-проєкти можуть містити:

  • великі форми;
  • багато бізнес-логіки у подіях;
  • старі компоненти;
  • старі бази даних;
  • складні SQL-запити;
  • інтеграції з обладнанням;
  • звіти;
  • локальні налаштування;
  • залежність від Windows API.

У старих VCL-системах найбільша цінність часто не у формах, а в бізнес-логіці, яка роками накопичувалась у коді.

Проблеми старих VCL-проєктів

Проблема Пояснення
Логіка у формах Бізнес-правила змішані з UI
Великі форми Один form unit може містити тисячі рядків коду
Старі компоненти Частина бібліотек може не підтримуватися
Залежність від Windows API Ускладнює міграцію
Старі бази даних Можуть використовуватись застарілі драйвери або схеми
Відсутність тестів Будь-яка зміна ризикована
Немає документації Систему важко підтримувати новим розробникам

Модернізація VCL-проєктів

Модернізація VCL не обовʼязково означає повне переписування.

Можливі підходи:

Підхід Опис
Оновлення Delphi Перехід на сучасну версію RAD Studio
Рефакторинг форм Зменшення коду у формах
Винесення бізнес-логіки Перенесення правил у сервіси
Оновлення доступу до БД Перехід на FireDAC або сучасні драйвери
Додавання API Створення REST-шару для інтеграцій
Оновлення UI Стилі, DPI, сучасні компоненти
Поступова заміна модулів Модернізація по частинах
Документація Опис форм, таблиць, бізнес-правил

Хороша архітектура VCL-проєкту

У невеликих VCL-проєктах логіку часто пишуть прямо у формах. Для великих систем краще розділяти шари.

Рекомендована структура:

Project/
├── Forms/
│   ├── MainForm.pas
│   └── CustomerForm.pas
├── DataModules/
│   └── MainDataModule.pas
├── Services/
│   ├── CustomerService.pas
│   └── InvoiceService.pas
├── Repositories/
│   ├── CustomerRepository.pas
│   └── InvoiceRepository.pas
├── Models/
│   ├── Customer.pas
│   └── Invoice.pas
├── Reports/
├── Integrations/
└── Project.dpr

Рекомендовані шари

Шар Призначення
Forms Інтерфейс користувача
DataModules Підключення, datasets, shared components
Services Бізнес-логіка
Repositories SQL і доступ до даних
Models Структури даних
Reports Друк і звіти
Integrations API, обладнання, файли, зовнішні системи

Форма має керувати інтерфейсом, а не містити всю бізнес-логіку системи.

DataModule у VCL

DataModule — невізуальний контейнер для компонентів.

У VCL DataModule часто використовують для:

  • database connection;
  • queries;
  • transactions;
  • datasets;
  • image lists;
  • action lists;
  • REST clients;
  • shared services;
  • конфігурації;
  • бізнес-логіки без UI.

Приклад:

procedure TMainDataModule.OpenCustomers;
begin
  FDQueryCustomers.Close;
  FDQueryCustomers.SQL.Text := 'SELECT * FROM customers ORDER BY name';
  FDQueryCustomers.Open;
end;

VCL і API

VCL-застосунок може працювати з API.

Типові задачі:

  • REST-запити;
  • JSON;
  • інтеграція з CRM;
  • інтеграція з ERP;
  • інтеграція з банком;
  • інтеграція з касами;
  • обмін із сайтом;
  • синхронізація довідників;
  • відправка документів.

Приклад JSON-даних:

{
  "customerId": 123,
  "amount": 1500.00,
  "status": "paid"
}

VCL і WebView

Сучасні VCL-застосунки можуть використовувати WebView-компоненти для показу web-контенту всередині desktop-програми.

Можливі сценарії:

  • показ HTML-документа;
  • перегляд карти;
  • авторизація через web;
  • інтеграція з web-кабінетом;
  • hybrid desktop;
  • показ dashboard.

VCL і сторонні компоненти

Навколо VCL існує велика екосистема сторонніх компонентів.

Приклади категорій:

  • grids;
  • reports;
  • charts;
  • ribbons;
  • docking;
  • editors;
  • schedulers;
  • PDF;
  • Excel;
  • printing;
  • UI themes;
  • database tools.

Відомі постачальники:

  • DevExpress;
  • TMS Software;
  • FastReport;
  • Steema TeeChart;
  • Raize / Konopka components;
  • ReportBuilder.

VCL і DevExpress

DevExpress VCL — це популярний набір комерційних компонентів для Delphi/C++Builder.

Він може включати:

  • advanced grid;
  • ribbon;
  • scheduler;
  • pivot grid;
  • reports;
  • charts;
  • layout controls;
  • editors;
  • themes;
  • printing.

Такі компоненти часто використовують у складних бізнес-застосунках.

VCL і TMS Software

TMS Software пропонує багато компонентів для Delphi, включно з VCL.

Типові напрямки:

  • UI controls;
  • grids;
  • planners;
  • charts;
  • cloud integrations;
  • web integrations;
  • maps;
  • reporting helpers.

VCL і FastReport

FastReport часто використовується у Delphi/VCL для звітів.

Типові задачі:

  • рахунки;
  • накладні;
  • акти;
  • звіти;
  • друк;
  • експорт у PDF;
  • експорт в Excel;
  • шаблони документів.

VCL і FMX

У Delphi існують дві важливі UI-бібліотеки:

VCL FireMonkey / FMX
Для Windows desktop Для cross-platform застосунків
Тісно повʼязана з Windows API Має власну cross-platform UI-модель
Дуже сильна для legacy і бізнес-систем Корисна для Windows, macOS, mobile і cross-platform сценаріїв
Класичний Delphi desktop Сучасніший multi-platform підхід

Якщо потрібен найкращий класичний Windows desktop у Delphi — зазвичай обирають VCL. Якщо потрібні кілька платформ — дивляться у бік FMX.

VCL і LCL

LCL у Lazarus схожа за ідеєю на VCL, але це інша бібліотека.

VCL LCL
Використовується в Delphi Використовується в Lazarus
Орієнтована на Windows Орієнтована на cross-platform desktop
Комерційна Delphi/RAD Studio екосистема Open source Free Pascal/Lazarus екосистема
Має багату історію сторонніх компонентів Має відкриту екосистему, але меншу кількість компонентів

VCL і тестування

Тестування VCL-застосунків може бути складнішим, якщо вся логіка знаходиться у формах.

Щоб спростити тестування, бажано:

  • виносити бізнес-логіку у сервіси;
  • відокремлювати SQL у repositories;
  • не писати складну логіку в OnClick;
  • використовувати інтерфейси;
  • покривати сервіси unit-тестами;
  • мінімізувати залежність логіки від TForm.

Приклад поганого підходу:

procedure TForm1.ButtonSaveClick(Sender: TObject);
begin
  // 300 рядків бізнес-логіки, SQL, перевірок і UI
end;

Кращий підхід:

procedure TForm1.ButtonSaveClick(Sender: TObject); begin

 InvoiceService.SaveInvoice(CurrentInvoice);

end;

VCL і безпека

У VCL-бізнес-застосунках важливо враховувати:

  • права доступу;
  • захист паролів;
  • шифрування конфігурацій;
  • безпечні SQL-запити;
  • журналювання дій;
  • резервні копії;
  • контроль ролей;
  • безпечну роботу з файлами;
  • перевірку даних користувача.

Особливо важливо не склеювати SQL із введенням користувача.

Небезпечний підхід:

FDQuery1.SQL.Text :=
  'SELECT * FROM users WHERE name = ''' + EditName.Text + '''';

Кращий підхід:

FDQuery1.SQL.Text :=

 'SELECT * FROM users WHERE name = :name';

FDQuery1.ParamByName('name').AsString := EditName.Text;

VCL і продуктивність

На продуктивність VCL-застосунку впливають:

  • SQL-запити;
  • індекси в базі;
  • кількість рядків у grids;
  • завантаження даних;
  • робота в UI-потоці;
  • сторонні компоненти;
  • rendering;
  • робота з файлами;
  • мережеві затримки;
  • кешування.

Типова помилка — завантажувати занадто багато даних одразу в DBGrid.

Краще:

  • використовувати фільтри;
  • пагінацію;
  • пошук;
  • обмеження вибірки;
  • індекси;
  • background loading.

VCL і розгортання

VCL-застосунки часто зручно розгортати у Windows-середовищі.

Можливі варіанти:

  • один EXE-файл;
  • EXE + DLL;
  • EXE + конфігураційні файли;
  • інсталятор;
  • portable-версія;
  • мережеве розгортання;
  • auto-update;
  • terminal server;
  • RemoteApp.

VCL і оновлення застосунків

Для бізнес-систем часто потрібне автоматичне оновлення.

Підходи:

  • перевірка версії при старті;
  • завантаження нового EXE;
  • launcher;
  • окремий updater;
  • мережевий каталог;
  • MSI/installer;
  • централізоване оновлення через адміністратора.

Переваги VCL

Перевага Пояснення
Швидка розробка Windows desktop Форми й компоненти дозволяють швидко створювати UI
Нативність VCL-застосунки добре інтегруються з Windows
Стабільність Багато VCL-систем працюють десятиліттями
Сильна робота з базами даних Data-aware компоненти й FireDAC дуже зручні для бізнес-систем
Велика історія Багато готових рішень, компонентів і практик
Сторонні компоненти DevExpress, TMS, FastReport та інші
Добре для ERP/CRM desktop Форми, таблиці, документи, звіти — природний сценарій VCL

Недоліки VCL

Недолік Пояснення
Тільки Windows VCL не є cross-platform UI-бібліотекою
Legacy-репутація Часто асоціюється зі старими Delphi-системами
Ризик великих форм Без архітектури форми стають занадто складними
Залежність від Delphi/RAD Studio Повноцінна робота повʼязана з комерційною екосистемою Embarcadero
Менше нових розробників Молодші розробники частіше обирають web, Python, JavaScript, C#
Не підходить для web frontend Для web frontend потрібні JavaScript/TypeScript
Не основний вибір для mobile Для mobile у Delphi використовується FMX або інші технології

Типові помилки новачків у VCL

Помилка Чому це проблема
Писати всю логіку у формі Код стає важким для підтримки
Зловживати глобальними змінними Важко контролювати стан програми
Склеювати SQL рядками Ризик SQL Injection і помилок
Не використовувати DataModule Підключення й datasets розкидані по формах
Не враховувати DPI Інтерфейс погано виглядає на сучасних моніторах
Оновлювати UI з фонового потоку Можливі помилки й нестабільність
Не розділяти Owner і Parent Можливі проблеми з життєвим циклом компонентів

Коли VCL — хороший вибір

Задача Чи підходить VCL?
Windows desktop-застосунок Дуже добре
ERP desktop Дуже добре
CRM desktop Добре
Облікова програма з базою даних Дуже добре
Підтримка старого Delphi-проєкту Найкращий практичний вибір
Інтеграція з Windows API або обладнанням Добре
Cross-platform desktop Краще розглянути FMX або LCL
Web frontend Не підходить
Mobile app Не підходить

VCL у порівнянні з іншими UI-технологіями

Технологія Порівняння з VCL
FireMonkey / FMX FMX кросплатформений, VCL сильніший для класичного Windows desktop
LCL LCL open source і cross-platform, VCL комерційна Delphi Windows-бібліотека
WinForms Обидві технології орієнтовані на Windows desktop, але WinForms належить .NET
WPF WPF сучасніший у .NET UI, VCL сильна в Delphi legacy/business desktop
Qt Qt кросплатформений C++ framework, VCL простіша для Delphi Windows desktop
Electron Electron використовує web-технології, VCL створює нативні Windows-застосунки

Рекомендований шлях навчання VCL

Етап Що вивчати
1 Основи Object Pascal
2 Delphi IDE і створення VCL Application
3 TForm, властивості, події
4 TButton, TEdit, TLabel, TMemo
5 Layout: Align, Anchors, Panels
6 Меню, діалоги, ActionList
7 DataModule
8 FireDAC і підключення до бази
9 DataSource, DBGrid, DBEdit
10 Звіти й друк
11 Архітектура Forms/Services/Repositories
12 Потоки й оновлення UI
13 DPI, Unicode, VCL Styles
14 Модернізація legacy VCL-коду

Мінімальний набір для першого VCL-проєкту

Компонент Рекомендація
IDE Delphi / RAD Studio
Тип проєкту VCL Forms Application
Перші компоненти TButton, TEdit, TLabel, TMemo
Для layout TPanel, Align, Anchors
Для бази даних FireDAC + SQLite або Firebird для старту
Для таблиці TDBGrid + TDataSource
Контроль версій Git
Архітектура Forms, DataModules, Services, Repositories

Приклад простої VCL-форми

Ідея:

Форма містить:
- EditName
- ButtonHello
- LabelResult

Користувач вводить імʼя.
Натискає кнопку.
Label показує привітання.

Код:

procedure TMainForm.ButtonHelloClick(Sender: TObject); begin

 LabelResult.Caption := 'Привіт, ' + EditName.Text;

end;

Приклад сервісу для VCL-проєкту

Краще не писати всю логіку у формі. Можна створити сервіс.

unit GreetingService;

interface

type
  TGreetingService = class
  public
    function BuildGreeting(const Name: string): string;
  end;

implementation

function TGreetingService.BuildGreeting(const Name: string): string;
begin
  Result := 'Привіт, ' + Name;
end;

end.

Використання у формі:

procedure TMainForm.ButtonHelloClick(Sender: TObject); var

 Service: TGreetingService;

begin

 Service := TGreetingService.Create;
 try
   LabelResult.Caption := Service.BuildGreeting(EditName.Text);
 finally
   Service.Free;
 end;

end;

Простими словами

VCL — це набір готових деталей для створення Windows-програм у Delphi.

Якщо Delphi — це майстерня, Object Pascal — мова майстра, то VCL — це набір інструментів, кнопок, форм, таблиць і компонентів, з яких швидко збирається Windows-застосунок.

Висновок

VCL — одна з найважливіших частин Delphi-екосистеми.

Вона сильна там, де потрібні:

  • нативні Windows desktop-застосунки;
  • швидка розробка форм;
  • бізнес-програми;
  • ERP і CRM;
  • робота з базами даних;
  • таблиці й довідники;
  • документи й звіти;
  • інтеграція з обладнанням;
  • підтримка legacy Delphi-систем.

VCL не є універсальним рішенням для всіх платформ і не підходить для web frontend або mobile, але для класичного Windows desktop вона залишається дуже практичною, стабільною й сильною технологією.

VCL — це технологія, яка зробила Delphi легендарним інструментом для Windows desktop і досі тримає багато реальних бізнес-систем.

Джерела