{"id":497447,"date":"2026-10-05T16:18:29","date_gmt":"2026-10-05T16:18:29","guid":{"rendered":"https:\/\/savepearlharbor.com\/?p=497447"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=497447","title":{"rendered":"OpenRTL: \u0413\u043e\u0432\u043e\u0440\u0438\u043b\u0438, \u0447\u0442\u043e RAD \u043d\u0430 \u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u043e\u043c C++ \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u0435\u043d. \u042f \u043f\u043e\u0432\u0442\u043e\u0440\u0438\u043b RTL \u0438 VCL-\u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0443 RAD Studio \u0437\u0430 1500 \u0441\u0442\u0440\u043e\u043a"},"content":{"rendered":"<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>C++Builder \u0440\u0435\u0430\u043b\u044c\u043d\u043e \u043a\u043b\u0430\u0441\u0441\u043d\u0430\u044f \u0448\u0442\u0443\u043a\u0430: \u043a\u0438\u0434\u0430\u0435\u0448\u044c \u0444\u043e\u0440\u043c\u0443 \u043c\u044b\u0448\u043a\u043e\u0439, \u043d\u0430\u043a\u0438\u0434\u044b\u0432\u0430\u0435\u0448\u044c \u043a\u043d\u043e\u043f\u043e\u043a, \u0434\u0432\u0430\u0436\u0434\u044b \u043a\u043b\u0438\u043a\u0430\u0435\u0448\u044c \u0438 \u043f\u0438\u0448\u0435\u0448\u044c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a.<\/p>\n<p>\u041d\u043e \u043e\u0434\u043d\u0430\u0436\u0434\u044b \u044f \u0437\u0430\u0434\u0430\u043b \u0441\u0435\u0431\u0435 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0432\u043e\u043f\u0440\u043e\u0441. \u042d\u0442\u0430 \u043f\u0440\u043e \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u044e \u0438\u043b\u0438 \u043f\u0440\u043e \u043f\u0440\u043e\u0434\u0443\u043a\u0442? <\/p>\n<p>\u0418 \u0440\u0435\u0448\u0438\u043b \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c. \u0422\u0430\u043a \u043f\u043e\u044f\u0432\u0438\u043b\u0441\u044f OpenRTL, \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u044f\u0434\u0440\u0430 RTL\/VCL-\u043f\u0430\u0440\u0430\u0434\u0438\u0433\u043c\u044b \u043d\u0430 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u043c C++17. \u0411\u0435\u0437 \u043f\u0440\u043e\u043f\u0440\u0438\u0435\u0442\u0430\u0440\u043d\u044b\u0445 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u043e\u0432, \u0431\u0435\u0437 \u0437\u0430\u043a\u0440\u044b\u0442\u044b\u0445 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a, \u0431\u0435\u0437 \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u0439.<\/p>\n<p>\u0422\u043e, \u043d\u0430 \u0447\u0442\u043e \u0443 Embarcadero \u0443\u0448\u043b\u0438 \u0434\u0435\u0441\u044f\u0442\u0438\u043b\u0435\u0442\u0438\u044f, \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0437\u0430 1500 \u0441\u0442\u0440\u043e\u043a, \u0435\u0441\u043b\u0438 \u043f\u043e\u043d\u0438\u043c\u0430\u0435\u0448\u044c \u043f\u0430\u0440\u0430\u0434\u0438\u0433\u043c\u0443. \u041d\u0435 \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u044f \u0433\u0435\u043d\u0438\u0439. \u0410 \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0432\u0441\u0435\u0445 \u0443\u0431\u0435\u0434\u0438\u043b\u0438, \u0447\u0442\u043e \u044d\u0442\u043e \u0441\u043b\u043e\u0436\u043d\u043e. \u041d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u043d\u0435 \u0441\u043b\u043e\u0436\u043d\u043e. \u041f\u0440\u043e\u0441\u0442\u043e \u043d\u0438\u043a\u0442\u043e \u043d\u0435 \u0431\u0440\u0430\u043b\u0441\u044f.  <\/p>\n<h3>\u041f\u043e\u0447\u0435\u043c\u0443 \u044d\u0442\u043e \u0432\u043e\u043e\u0431\u0449\u0435 \u0432\u0430\u0436\u043d\u043e<\/h3>\n<p>C++Builder Professional \u0441\u0442\u043e\u0438\u0442 $1,599. RAD Studio Architect \u0441\u0442\u043e\u0438\u0442 $4,199. \u041f\u0440\u0438\u0447\u0451\u043c C++Builder \u0434\u043e\u0440\u043e\u0436\u0435 Delphi, \u0430 \u0443\u043c\u0435\u0435\u0442 \u043c\u0435\u043d\u044c\u0448\u0435. Embarcadero \u043f\u0440\u043e\u0434\u0430\u0451\u0442 \u043d\u0435 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u044e. \u0422\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u044f \u0441\u0442\u0430\u0440\u0430\u044f \u0438 \u0434\u0430\u0432\u043d\u043e \u043d\u0435 \u0441\u0435\u043a\u0440\u0435\u0442. \u041e\u043d\u0438 \u043f\u0440\u043e\u0434\u0430\u044e\u0442 \u043c\u043e\u043d\u043e\u043f\u043e\u043b\u0438\u044e. \u041f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0430\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u044b \u043d\u0435\u0442.<\/p>\n<p>\u0415\u0441\u0442\u044c Lazarus \u0438 Project Fresnel. \u041e\u043d\u0438 \u043b\u043e\u043c\u0430\u044e\u0442 \u043c\u043e\u043d\u043e\u043f\u043e\u043b\u0438\u044e, \u043d\u043e \u0438\u0434\u0443\u0442 \u0441\u043e \u0441\u0442\u043e\u0440\u043e\u043d\u044b Pascal \u0438 \u043e\u0442\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u043e\u0442 VCL-\u043f\u0430\u0440\u0430\u0434\u0438\u0433\u043c\u044b. \u041c\u043d\u0435 \u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u0434\u0440\u0443\u0433\u043e\u0433\u043e. \u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0441\u0430\u043c\u0443 VCL-\u043f\u0430\u0440\u0430\u0434\u0438\u0433\u043c\u0443, \u043d\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0435\u0451 \u043d\u0430 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u043c C++. \u041d\u043e \u0431\u044b\u043b\u0430 \u0438 \u0432\u0442\u043e\u0440\u0430\u044f \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430, \u0441\u0435\u0440\u044c\u0451\u0437\u043d\u0435\u0435 \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u0439.<\/p>\n<h2>\u041a\u0430\u043a \u0443\u0441\u0442\u0440\u043e\u0435\u043d\u0430 VCL<\/h2>\n<p>\u041f\u0440\u0435\u0436\u0434\u0435 \u0447\u0435\u043c \u0433\u043e\u0432\u043e\u0440\u0438\u0442\u044c \u043f\u0440\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e, \u043d\u0430\u043f\u043e\u043c\u043d\u044e, \u0438\u0437 \u0447\u0435\u0433\u043e \u0432\u043e\u043e\u0431\u0449\u0435 \u0441\u043e\u0441\u0442\u043e\u0438\u0442 VCL<\/p>\n<p>\u0418\u0435\u0440\u0430\u0440\u0445\u0438\u044f. \u0412\u0441\u0451 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0441 TObject, \u044d\u0442\u043e \u043a\u043e\u0440\u0435\u043d\u044c. \u0423 \u043d\u0435\u0433\u043e \u0435\u0441\u0442\u044c ClassName() \u0438 InheritsFrom() \u2014 \u0440\u0443\u0447\u043d\u043e\u0439 RTTI, \u0431\u0435\u0437 typeid \u0438 dynamic_cast \u043a\u0430\u043a \u043e\u0441\u043d\u043e\u0432\u044b. \u0414\u0430\u043b\u044c\u0448\u0435 \u0438\u0434\u0451\u0442 TComponent: \u0432\u0441\u0451, \u0447\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u0447\u0435\u043c-\u0442\u043e \u0432\u043b\u0430\u0434\u0435\u0442\u044c. \u041f\u043e\u0442\u043e\u043c TControl: \u0432\u0441\u0451, \u0447\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u043d\u0430 \u044d\u043a\u0440\u0430\u043d\u0435. \u041f\u043e\u0442\u043e\u043c TOSControl, TCustomForm, TForm, \u0438 \u0443\u0436\u0435 \u043e\u0442 \u043d\u0438\u0445 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0435 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044b: TButton, TLabel, TEdit, TComboBox, TCheckBox, TPanel.<\/p>\n<p>\u0412\u043b\u0430\u0434\u0435\u043d\u0438\u0435. TComponent \u0432\u043b\u0430\u0434\u0435\u0435\u0442 \u0434\u0440\u0443\u0433\u0438\u043c\u0438 TComponent \u0447\u0435\u0440\u0435\u0437 Owner \u0438 OwnedComponents. \u041a\u043d\u043e\u043f\u043a\u0430 \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u0438\u043d\u0430\u0434\u043b\u0435\u0436\u0430\u0442\u044c \u0444\u043e\u0440\u043c\u0435, \u0437\u043d\u0430\u0447\u0438\u0442 \u0444\u043e\u0440\u043c\u0430 \u0435\u0451 \u0443\u0434\u0430\u043b\u0438\u0442. \u042d\u0442\u043e \u043d\u0435 \u0442\u043e \u0436\u0435 \u0441\u0430\u043c\u043e\u0435, \u0447\u0442\u043e \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c \u043d\u0430 \u044d\u043a\u0440\u0430\u043d\u0435, \u0438 \u043f\u0443\u0442\u0430\u0442\u044c \u0438\u0445 \u043d\u0435 \u043d\u0430\u0434\u043e.<\/p>\n<p>\u0412\u0438\u0437\u0443\u0430\u043b\u044c\u043d\u0430\u044f \u0438\u0435\u0440\u0430\u0440\u0445\u0438\u044f. TControl \u0437\u043d\u0430\u0435\u0442 \u0441\u0432\u043e\u0435\u0433\u043e Parent \u0438 \u0441\u043f\u0438\u0441\u043e\u043a ChildControls. \u042d\u0442\u043e \u043f\u0440\u043e \u0442\u043e, \u043a\u0442\u043e \u043a\u043e\u0433\u043e \u0440\u0438\u0441\u0443\u0435\u0442 \u0438 \u043a\u0442\u043e \u0432 \u043a\u043e\u0433\u043e \u043f\u043e\u043f\u0430\u0434\u0430\u0435\u0442 \u043c\u044b\u0448\u044c\u044e. \u0412 VCL \u044d\u0442\u043e \u0434\u0432\u0435 \u0440\u0430\u0437\u043d\u044b\u0435 \u0432\u0435\u0449\u0438, \u0438 \u044d\u0442\u043e \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0438\u0430\u043b\u044c\u043d\u043e. \u041a\u043d\u043e\u043f\u043a\u0430 \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u0438\u043d\u0430\u0434\u043b\u0435\u0436\u0430\u0442\u044c \u0444\u043e\u0440\u043c\u0435 (\u0444\u043e\u0440\u043c\u0430 \u0435\u0451 \u0443\u0434\u0430\u043b\u0438\u0442), \u043d\u043e \u0432\u0438\u0437\u0443\u0430\u043b\u044c\u043d\u043e \u043b\u0435\u0436\u0430\u0442\u044c \u043d\u0430 \u043f\u0430\u043d\u0435\u043b\u0438. \u0412 Qt \u044d\u0442\u043e \u0441\u043b\u0438\u0442\u043e \u0432 QObject::parent. \u0412 VCL \u0436\u0435 \u044d\u0442\u043e \u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u043e.<\/p>\n<p>\u0421\u043e\u0431\u044b\u0442\u0438\u044f. OnClick, OnChange, OnClose, OnMouseDown, OnKeyDown. \u0412 C++ \u044d\u0442\u043e std::function, \u0432 Object Pascal method pointer. \u0421\u043e\u0431\u044b\u0442\u0438\u0435 \u044d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u043e\u043b\u0435. \u0415\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0437\u043d\u0430\u0447\u0438\u0442\u044c, \u043f\u0435\u0440\u0435\u043d\u0430\u0437\u043d\u0430\u0447\u0438\u0442\u044c, \u043e\u0447\u0438\u0441\u0442\u0438\u0442\u044c. \u041d\u0438\u0447\u0435\u0433\u043e \u043e\u0441\u043e\u0431\u043e \u043d\u043e\u0432\u043e\u0433\u043e.<\/p>\n<p>\u0421\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043a\u043e\u0434. IDE \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u043a\u043b\u0430\u0441\u0441 \u0444\u043e\u0440\u043c\u044b: \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u044b\u0439 Application, \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u044b\u0439 Form1, _tWinMain \u0441 Application-&gt;Initialize(), Application-&gt;CreateForm(Form1), Application-&gt;Run(). \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 TForm1 \u0441\u043e\u0437\u0434\u0430\u0451\u0442 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044b \u0438 \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u0442 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430. \u0412\u0441\u0451 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u043e\u0435 \u043b\u0435\u0436\u0438\u0442 \u0432 DFM-\u0444\u0430\u0439\u043b\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 IDE \u0447\u0438\u0442\u0430\u0435\u0442 \u0438 \u043f\u0438\u0448\u0435\u0442.<\/p>\n<p>\u0427\u0442\u043e \u0437\u0434\u0435\u0441\u044c \u0432\u0430\u0436\u043d\u043e \u0434\u043b\u044f \u043d\u0430\u0441. \u0412\u0441\u0451 \u044d\u0442\u043e \u0438\u0434\u0435\u0438. \u041d\u0438 \u043e\u0434\u043d\u0430 \u0438\u0437 \u043d\u0438\u0445 \u043d\u0435 \u043f\u0440\u0438\u0432\u044f\u0437\u0430\u043d\u0430 \u043a Win32, \u043a \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u043c\u0443 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0443 \u0438\u043b\u0438 \u043a \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u043c\u0443 \u0432\u0435\u043d\u0434\u043e\u0440\u0443. TObject \u044d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u043a\u043b\u0430\u0441\u0441. Owner \u044d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c. OnClick \u044d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u044f. \u0418\u0435\u0440\u0430\u0440\u0445\u0438\u044f \u044d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0430\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u0435. \u0412\u0441\u0451 \u044d\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043d\u0430 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u043c C++.<\/p>\n<h3>\u0410 \u0442\u0435\u043f\u0435\u0440\u044c \u043f\u043e\u0435\u0445\u0430\u043b\u0438: VCL \u043d\u0435 \u0434\u043e\u043b\u0436\u0435\u043d \u0437\u043d\u0430\u0442\u044c \u043f\u0440\u043e Win32<\/h3>\n<p>C++Builder \u044d\u0442\u043e \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0434 Windows, \u0438 VCL \u0442\u043e\u0436\u0435 \u0437\u0430\u0432\u044f\u0437\u0430\u043d \u043d\u0430 Windows. TWinControl \u0437\u043d\u0430\u0435\u0442 \u043f\u0440\u043e HWND, TCanvas \u0437\u043d\u0430\u0435\u0442 \u043f\u0440\u043e HDC, TForm \u0437\u043d\u0430\u0435\u0442 \u043f\u0440\u043e WndProc. \u041f\u0435\u0440\u0435\u043d\u0435\u0441\u0442\u0438 \u044d\u0442\u043e \u043d\u0430 Linux \u0431\u0435\u0437 \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u044b\u0432\u0430\u043d\u0438\u044f \u043f\u043e\u043b\u043e\u0432\u0438\u043d\u044b \u043a\u043e\u0434\u0430 \u043d\u0435 \u0432\u044b\u0439\u0434\u0435\u0442. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 Embarcadero \u0438 \u043d\u0435 \u0434\u0435\u043b\u0430\u0435\u0442 VCL \u043a\u0440\u043e\u0441\u0441\u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435\u043d\u043d\u044b\u043c: \u0443 \u043d\u0438\u0445 \u044d\u0442\u043e \u043d\u0430\u0434\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u043d\u0430\u0434 Win32, \u0430 \u043d\u0435 \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u043f\u0430\u0440\u0430\u0434\u0438\u0433\u043c\u0430. FireMonkey \u043e\u043d\u0438 \u043f\u0438\u0441\u0430\u043b\u0438 \u0441 \u043d\u0443\u043b\u044f, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e VCL \u043f\u043e\u0434 \u0434\u0440\u0443\u0433\u0438\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0443\u0436\u0435 \u043d\u0435 \u043f\u0435\u0440\u0435\u0434\u0435\u043b\u0430\u0442\u044c<\/p>\n<p><strong>\u0412 \u044d\u0442\u043e\u043c \u0438 \u0435\u0441\u0442\u044c \u0433\u043b\u0430\u0432\u043d\u0430\u044f \u0438\u0434\u0435\u044f OpenRTL<\/strong><\/p>\n<p>VCL-\u0441\u043b\u043e\u0439 \u043d\u0435 \u0437\u043d\u0430\u0435\u0442, \u043f\u043e\u0434 \u043a\u0430\u043a\u043e\u0439 \u041e\u0421 \u043e\u043d \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442. \u0421\u043e\u0432\u0441\u0435\u043c. TControl \u043d\u0435 \u0437\u043d\u0430\u0435\u0442 \u043f\u0440\u043e HWND. TForm \u043d\u0435 \u0437\u043d\u0430\u0435\u0442 \u043f\u0440\u043e WndProc. TCanvas \u043d\u0435 \u0437\u043d\u0430\u0435\u0442 \u043f\u0440\u043e HDC. \u0412\u0441\u0451, \u0447\u0442\u043e VCL \u0437\u043d\u0430\u0435\u0442 \u043f\u0440\u043e \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0443, \u044d\u0442\u043e \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0442\u043d\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 IOSDriver.<\/p>\n<pre><code class=\"cpp\">class IOSDriver {public:    virtual ~IOSDriver() = default;    virtual std::unique_ptr&lt;IOSHandle&gt;        CreateControl(const ControlDesc&amp; d) = 0;    virtual std::unique_ptr&lt;TCanvas&gt;        CreateCanvas(IOSHandle* h) = 0;    virtual const char* Name() const = 0;    virtual int  RunMessageLoop() = 0;    virtual void SetBounds(IOSHandle* h, int l, int t, int w, int ht) = 0;    virtual void SetVisible(IOSHandle* h, bool v) = 0;    virtual void SetText(IOSHandle* h, const std::string&amp; text) = 0;    virtual std::string GetText(IOSHandle* h) const = 0;    virtual void SetEnabled(IOSHandle* h, bool e) = 0;    virtual void Invalidate(IOSHandle* h) = 0;    virtual void SetCheck(IOSHandle* h, bool c) = 0;    virtual bool GetCheck(IOSHandle* h) const = 0;    virtual void AddString(IOSHandle* h, const std::string&amp; s) = 0;    virtual void SetSel(IOSHandle* h, int idx) = 0;    virtual int  GetSel(IOSHandle* h) const = 0;    virtual void SetEventSink(IOSHandle* h, IEventSink* sink) = 0;};<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper\"><\/span><\/a><\/div><\/pre>\n<p>\u0421 \u0434\u0440\u0443\u0433\u043e\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u044b &#8212;\u00a0<code>IEventSink<\/code>. \u042d\u0442\u043e \u0442\u043e, \u043a\u0430\u043a \u041e\u0421 \u0441\u043e\u043e\u0431\u0449\u0430\u0435\u0442 VCL, \u0447\u0442\u043e \u0447\u0442\u043e-\u0442\u043e \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u043e<\/p>\n<pre><code class=\"cpp\">struct OSEvent {    enum Type {        MouseDown, MouseUp, MouseMove,        KeyDown, KeyUp,        Resize, Move, Close, Paint,        Show, Hide, Command, Change    };    Type type = Paint;    int  x = 0, y = 0;    int  button = 0;    int  key = 0;    int  width = 0, height = 0;    uint32_t timestamp = 0;    bool cancel = false;};class IEventSink {public:    virtual ~IEventSink() = default;    virtual void OnOSEvent(OSEvent&amp; e) = 0;};<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p><strong>OSEvent \u044d\u0442\u043e \u043d\u043e\u0440\u043c\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u043e\u0435 \u0441\u043e\u0431\u044b\u0442\u0438\u0435<\/strong><\/p>\n<p>\u041d\u0435 WM_PAINT, \u043d\u0435 WM_LBUTTONDOWN. \u041f\u0440\u043e\u0441\u0442\u043e Paint, MouseDown. \u041f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0430 \u0441\u0430\u043c\u0430 \u043e\u0431\u044f\u0437\u0430\u043d\u0430 \u043f\u0435\u0440\u0435\u0432\u0435\u0441\u0442\u0438 \u0441\u0432\u043e\u0451 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0432 \u044d\u0442\u043e\u0442 \u0444\u043e\u0440\u043c\u0430\u0442.<\/p>\n<p>\u041c\u0435\u0436\u0434\u0443 \u043d\u0438\u043c\u0438 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f IOSHandle. \u042d\u0442\u043e \u043d\u0435\u043f\u0440\u043e\u0437\u0440\u0430\u0447\u043d\u044b\u0439 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u0442\u043e, \u0447\u0442\u043e \u041e\u0421 \u0441\u0447\u0438\u0442\u0430\u0435\u0442 \u043e\u043a\u043d\u043e\u043c<\/p>\n<pre><code class=\"cpp\">struct IOSHandle {    virtual ~IOSHandle() = default;};<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>VCL \u043d\u0435 \u0437\u043d\u0430\u0435\u0442, \u0447\u0442\u043e \u0432\u043d\u0443\u0442\u0440\u0438. \u0414\u043b\u044f Win32 \u044d\u0442\u043e HWND. \u0414\u043b\u044f GTK4 \u044d\u0442\u043e GtkWidget<em>. \u0414\u043b\u044f Cocoa \u044d\u0442\u043e NSView<\/em>. \u041e\u043d\u0430 \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u0442 \u0435\u0433\u043e \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0443 \u0438 \u0433\u043e\u0432\u043e\u0440\u0438\u0442: \u0441\u0434\u0435\u043b\u0430\u0439 \u0441 \u043d\u0438\u043c \u0432\u043e\u0442 \u044d\u0442\u043e<\/p>\n<h3>\u041a\u0430\u043a \u044d\u0442\u043e \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0432 \u0446\u0435\u043f\u043e\u0447\u043a\u0435<\/h3>\n<pre><code class=\"css\">Win32 message (WM_COMMAND)-&gt;WndProc (Win32-\u0441\u043f\u0435\u0446\u0438\u0444\u0438\u0447\u043d\u044b\u0439)-&gt;Win* \u0438\u0437 GWLP_USERDATA (Win32-\u0441\u043f\u0435\u0446\u0438\u0444\u0438\u0447\u043d\u044b\u0439)-&gt;ITWindowsDriver::OnCommand (Win32-\u0441\u043f\u0435\u0446\u0438\u0444\u0438\u0447\u043d\u044b\u0439)\/\/ ===========&gt; \u041f\u0435\u0440\u0435\u0445\u043e\u0434\u043d\u0430\u044f \u0433\u0440\u0430\u043d\u0438\u0446\u0430 Emit() \u2192 OSEvent{type=Command}-&gt;IEventSink::OnOSEvent(OSEvent)-&gt;TControl::OnOSEvent-&gt;FOnClick<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u0412\u044b\u0448\u0435 \u0433\u0440\u0430\u043d\u0438\u0446\u044b \u0436\u0438\u0432\u0451\u0442 Win32. \u041d\u0438\u0436\u0435 \u0433\u0440\u0430\u043d\u0438\u0446\u044b \u0436\u0438\u0432\u0451\u0442 \u0447\u0438\u0441\u0442\u044b\u0439 VCL. TControl \u043d\u0435 \u0437\u043d\u0430\u0435\u0442, \u0447\u0442\u043e WM_COMMAND \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442. \u041e\u043d \u0437\u043d\u0430\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e, \u0447\u0442\u043e \u043f\u0440\u0438\u0448\u0451\u043b OSEvent::Command<\/p>\n<h3>\u041a\u0430\u043a \u044d\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435<\/h3>\n<pre><code class=\"cpp\">virtual void CreateHandle(IOSHandle* parentHandle) {    if (FHandle) return;    if (!FDriver) return;    ControlDesc d;    d.kind = Kind();    d.caption = FCaption;    d.x = FLeft; d.y = FTop; d.w = FWidth; d.h = FHeight;    d.visible = FVisible;    d.enabled = FEnabled;    d.id = FId;    d.parent = parentHandle;    FHandle = FDriver-&gt;CreateControl(d);    \/\/...}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>TOSControl \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u0430, ControlDesc, \u0438 \u043e\u0442\u0434\u0430\u0451\u0442 \u0435\u0433\u043e \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0443. \u0427\u0442\u043e \u0434\u0440\u0430\u0439\u0432\u0435\u0440 \u0441 \u043d\u0438\u043c \u0441\u0434\u0435\u043b\u0430\u0435\u0442, \u0443\u0436\u0435 \u043d\u0435 \u0435\u0433\u043e \u0434\u0435\u043b\u043e. TWindowsDriver \u0432\u044b\u0437\u043e\u0432\u0435\u0442 CreateWindowExW. TGTKDriver \u0432\u044b\u0437\u043e\u0432\u0435\u0442 gtk_button_new. TCocoaDriver \u0432\u044b\u0437\u043e\u0432\u0435\u0442 [[NSButton alloc] init]. TOSControl \u043e\u0431 \u044d\u0442\u043e\u043c \u043d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u0443\u0437\u043d\u0430\u0435\u0442.<\/p>\n<pre><code class=\"cpp\">void OnOSEvent(OSEvent&amp; e) override {    switch (e.type) {    case OSEvent::KeyDown: {        int key = e.key;        if (FOnKeyDown) FOnKeyDown(this, key, 0);        break;    }    case OSEvent::Change:        if (FOnChange) FOnChange(this);        break;    case OSEvent::Close:        if (FOnClose) FOnClose(this, e.cancel);        return;    default:        inherited::OnOSEvent(e);        return;    }}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u0421 \u0441\u043e\u0431\u044b\u0442\u0438\u044f\u043c\u0438 \u0442\u0430 \u0436\u0435 \u043b\u043e\u0433\u0438\u043a\u0430. TOSControl \u043d\u0435 \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0435\u0442 WM_KEYDOWN. \u041e\u043d \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 OSEvent::KeyDown \u0441 \u043f\u043e\u043b\u0435\u043c key. \u041e\u0442\u043a\u0443\u0434\u0430 \u0432\u0437\u044f\u043b\u0441\u044f key, \u0438\u0437 Win32 WPARAM, \u0438\u0437 GTK GdkEventKey::keyval \u0438\u043b\u0438 \u0438\u0437 Cocoa NSEvent::keyCode, \u043d\u0435 \u0432\u0430\u0436\u043d\u043e. \u0414\u0440\u0430\u0439\u0432\u0435\u0440 \u0443\u0436\u0435 \u043d\u043e\u0440\u043c\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043b<\/p>\n<h3>\u0427\u0442\u043e \u044d\u0442\u043e \u0434\u0430\u0451\u0442<\/h3>\n<ol>\n<li>\n<p>\u041a\u0440\u043e\u0441\u0441\u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435\u043d\u043d\u043e\u0441\u0442\u044c \u043d\u0435 \u043f\u043e\u0442\u043e\u043c, \u0430 \u043f\u043e \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0435.<\/p>\n<\/li>\n<\/ol>\n<p>\u042f \u043d\u0435 \u043f\u0438\u0448\u0443\u00a0<code>#ifdef _WIN32<\/code>\u00a0\u0432 VCL-\u0441\u043b\u043e\u0435. \u0421\u043e\u0432\u0441\u0435\u043c. \u041f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e VCL-\u0441\u043b\u043e\u0439 \u043d\u0435 \u0437\u043d\u0430\u0435\u0442, \u0447\u0442\u043e \u0442\u0430\u043a\u043e\u0435 Windows. \u0415\u0441\u043b\u0438 \u0437\u0430\u0432\u0442\u0440\u0430 \u044f \u043d\u0430\u043f\u0438\u0448\u0443 TGTKDriver, VCL-\u0441\u043b\u043e\u0439 \u043d\u0435 \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u0441\u044f \u043d\u0438 \u043d\u0430 \u0441\u0442\u0440\u043e\u043a\u0443. \u0414\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c IOSDriver \u0434\u043b\u044f GTK4.<\/p>\n<ol start=\"2\">\n<li>\n<p>Win32 \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u044c, \u043d\u0435 \u0442\u0440\u043e\u0433\u0430\u044f VCL.<\/p>\n<\/li>\n<\/ol>\n<p>\u0415\u0441\u043b\u0438 \u0437\u0430\u0432\u0442\u0440\u0430 Microsoft \u043f\u043e\u043c\u0435\u043d\u044f\u0435\u0442 Win32 \u043d\u0430 \u0447\u0442\u043e-\u0442\u043e \u0434\u0440\u0443\u0433\u043e\u0435 (\u0448\u0443\u0442\u043a\u0430, \u043d\u043e \u0432\u0441\u0451 \u0436\u0435), \u044f \u043f\u0435\u0440\u0435\u043f\u0438\u0448\u0443 TWindowsDriver, \u0430 VCL \u043e\u0441\u0442\u0430\u043d\u0435\u0442\u0441\u044f. \u0415\u0441\u043b\u0438 \u044f \u0437\u0430\u0445\u043e\u0447\u0443 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c WinRT \u0438\u043b\u0438 UWP, \u043f\u0435\u0440\u0435\u043f\u0438\u0448\u0443 \u0434\u0440\u0430\u0439\u0432\u0435\u0440.<\/p>\n<ol start=\"3\">\n<li>\n<p>\u041e\u0442\u043b\u0430\u0434\u043a\u0430 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u043f\u0440\u043e\u0449\u0435.<\/p>\n<\/li>\n<\/ol>\n<p>\u041a\u043e\u0433\u0434\u0430 \u0447\u0442\u043e-\u0442\u043e \u043d\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442, \u044f \u0442\u043e\u0447\u043d\u043e \u0437\u043d\u0430\u044e, \u0433\u0434\u0435 \u0438\u0441\u043a\u0430\u0442\u044c. \u041f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0441 \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u043e\u0439? \u041b\u0438\u0431\u043e TCanvas \u0432 VCL, \u043b\u0438\u0431\u043e TWindowsCanvas \u0432 \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0435. \u041f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0441 \u0441\u043e\u0431\u044b\u0442\u0438\u0435\u043c? \u041b\u0438\u0431\u043e TControl::OnOSEvent \u0432 VCL, \u043b\u0438\u0431\u043e Emit \u0432 \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0435. \u0413\u0440\u0430\u043d\u0438\u0446\u0430 \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u0442 \u043f\u043e OSEvent, \u0438 \u044d\u0442\u043e \u0442\u043e\u0447\u043a\u0430 \u0440\u0430\u0437\u0440\u0435\u0437\u0430.<\/p>\n<ol start=\"4\">\n<li>\n<p>\u041c\u043e\u0436\u043d\u043e \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c VCL \u0431\u0435\u0437 \u041e\u0421.<\/p>\n<\/li>\n<\/ol>\n<p>\u0412 \u0442\u0435\u043e\u0440\u0438\u0438 \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c\u00a0<code>TNullDriver<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0441\u043e\u0437\u0434\u0430\u0451\u0442, \u043d\u043e \u043b\u043e\u0433\u0438\u0440\u0443\u0435\u0442 \u0432\u044b\u0437\u043e\u0432\u044b. \u0418 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043b\u043e\u0433\u0438\u043a\u0443 VCL \u0431\u0435\u0437 \u0435\u0434\u0438\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430. \u042f \u044d\u0442\u043e\u0433\u043e \u043f\u043e\u043a\u0430 \u043d\u0435 \u0441\u0434\u0435\u043b\u0430\u043b, \u043d\u043e \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 \u044d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442. \u042d\u0442\u043e \u043f\u0440\u044f\u043c\u043e\u0435 \u0441\u043b\u0435\u0434\u0441\u0442\u0432\u0438\u0435 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e VCL \u043d\u0435 \u0437\u043d\u0430\u0435\u0442 \u043f\u0440\u043e Win32.<\/p>\n<h3>\u041a\u0430\u043a \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0434\u0440\u0430\u0439\u0432\u0435\u0440<\/h3>\n<p><strong>\u0417\u0434\u0435\u0441\u044c \u0432\u0435\u0441\u044c Win32<\/strong><\/p>\n<p>\u0412\u043e\u0442 \u043a\u043e\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u00a0<code>ControlDesc<\/code>\u00a0\u0432 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e Win32. \u042d\u0442\u043e \u0441\u0435\u0440\u0434\u0446\u0435\u00a0<code>TWindowsDriver<\/code>  <\/p>\n<pre><code class=\"cpp\">std::unique_ptr&lt;IOSHandle&gt; CreateControl(const ControlDesc&amp; d) override {    HWND parent = d.parent ? static_cast&lt;Win*&gt;(d.parent)-&gt;hwnd.get() : nullptr;    DWORD style = 0, exStyle = 0;    const wchar_t* cls = nullptr;    switch (d.kind) {    case ControlKind::Form:        cls = L\"VCLFormClass\";        style = WS_OVERLAPPEDWINDOW;        EnsureClass(cls);        break;    case ControlKind::Panel:        cls = L\"VCLPanelClass\";        style = WS_CHILD | WS_VISIBLE | WS_CLIPCHILDREN | WS_CLIPSIBLINGS;        EnsureClass(cls);        break;    case ControlKind::Label:        cls = L\"STATIC\";        style = WS_CHILD | WS_VISIBLE | SS_LEFT;        break;    case ControlKind::Button:        cls = L\"BUTTON\";        style = WS_CHILD | WS_VISIBLE | WS_TABSTOP | BS_PUSHBUTTON;        break;    case ControlKind::CheckBox:        cls = L\"BUTTON\";        style = WS_CHILD | WS_VISIBLE | WS_TABSTOP | BS_AUTOCHECKBOX;        break;    case ControlKind::Edit:        cls = L\"EDIT\";        style = WS_CHILD | WS_VISIBLE | WS_TABSTOP | ES_LEFT | ES_AUTOHSCROLL;        exStyle = WS_EX_CLIENTEDGE;        break;    case ControlKind::ComboBox:        cls = L\"COMBOBOX\";        style = WS_CHILD | WS_VISIBLE | WS_TABSTOP | CBS_DROPDOWNLIST | WS_VSCROLL;        break;    case ControlKind::ListBox:        cls = L\"LISTBOX\";        style = WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_VSCROLL | LBS_NOTIFY;        exStyle = WS_EX_CLIENTEDGE;        break;    }    if (!d.visible) style &amp;= ~WS_VISIBLE;    if (!d.enabled) style |= WS_DISABLED;    int x = d.x, y = d.y, ww = d.w, hh = d.h;    if (d.kind == ControlKind::Form) {        RECT r{ 0, 0, ww, hh };        AdjustWindowRectEx(&amp;r, style, FALSE, exStyle);        ww = r.right - r.left;        hh = r.bottom - r.top;    }    int ctrlId = 0;    if (d.kind != ControlKind::Form &amp;&amp; d.kind != ControlKind::Panel)        ctrlId = (d.id ? d.id : FNextId++);    return CreateWin(d, cls, style, exStyle, parent, x, y, ww, hh, ctrlId);}std::unique_ptr&lt;Win&gt; CreateWin(const ControlDesc&amp; d,    const wchar_t* cls,    DWORD style, DWORD exStyle,    HWND parent,    int x, int y, int w, int h,    int ctrlId){    auto win = std::make_unique&lt;Win&gt;();    win-&gt;driver = this;    win-&gt;kind = d.kind;    win-&gt;id = d.id;    win-&gt;isForm = (d.kind == ControlKind::Form);    win-&gt;hwnd.reset(::CreateWindowExW(        exStyle, cls, Utf8ToW(d.caption).c_str(), style,        x, y, w, h, parent, (HMENU)(INT_PTR)ctrlId,        FInst, nullptr));    if (!win-&gt;hwnd) return nullptr;    AttachWin(win-&gt;hwnd.get(), win.get());    return win;}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>CreateControl \u0434\u043e\u0441\u0442\u0430\u0451\u0442 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0439\u00a0<code>HWND<\/code>\u00a0\u0438\u0437\u00a0<code>IOSHandle<\/code>.\u00a0<code>d.parent<\/code>\u00a0&#8212;  \u044d\u0442\u043e\u00a0<code>IOSHandle*<\/code>, \u0432\u043d\u0443\u0442\u0440\u0438 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043b\u0435\u0436\u0438\u0442\u00a0<code>Win*<\/code>, \u0430 \u0432\u043d\u0443\u0442\u0440\u0438\u00a0<code>Win<\/code>\u00a0\u2014 \u0441\u0430\u043c\u00a0<code>HWND<\/code>. VCL-\u0441\u043b\u043e\u0439 \u043e\u0431 \u044d\u0442\u043e\u043c \u043d\u0435 \u0437\u043d\u0430\u0435\u0442: \u043e\u043d \u043f\u0435\u0440\u0435\u0434\u0430\u043b \u043d\u0435\u043f\u0440\u043e\u0437\u0440\u0430\u0447\u043d\u044b\u0439 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c, \u0434\u0440\u0430\u0439\u0432\u0435\u0440 \u0441\u0430\u043c \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u043b\u0441\u044f, \u0447\u0442\u043e \u0441 \u043d\u0438\u043c \u0434\u0435\u043b\u0430\u0442\u044c.  <\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043e\u043a\u043d\u0430<\/p>\n<pre><code class=\"cpp\">std::unique_ptr&lt;Win&gt; CreateWin(const ControlDesc&amp; d,    const wchar_t* cls,    DWORD style, DWORD exStyle,    HWND parent,    int x, int y, int w, int h,    int ctrlId){    auto win = std::make_unique&lt;Win&gt;();    win-&gt;driver = this;    win-&gt;kind = d.kind;    win-&gt;id = d.id;    win-&gt;isForm = (d.kind == ControlKind::Form);    win-&gt;hwnd.reset(::CreateWindowExW(        exStyle, cls, Utf8ToW(d.caption).c_str(), style,        x, y, w, h, parent, (HMENU)(INT_PTR)ctrlId,        FInst, nullptr));    if (!win-&gt;hwnd) return nullptr;    AttachWin(win-&gt;hwnd.get(), win.get());    return win;}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p><code>Win<\/code>\u00a0&#8212; \u044d\u0442\u043e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430-\u043e\u0431\u0451\u0440\u0442\u043a\u0430 \u043d\u0430\u0434\u00a0<code>HWND<\/code>. \u041e\u043d\u0430 \u0445\u0440\u0430\u043d\u0438\u0442 \u0441\u0430\u043c \u0445\u0435\u043d\u0434\u043b, \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u0434\u0440\u0430\u0439\u0432\u0435\u0440,\u00a0<code>IEventSink<\/code>, \u0442\u0438\u043f \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u0430 \u0438 id.  <\/p>\n<p>\u042d\u0442\u043e \u043d\u0443\u0436\u043d\u043e, \u0447\u0442\u043e\u0431\u044b\u00a0<code>WndProc<\/code>\u00a0\u043c\u043e\u0433 \u0434\u043e\u0441\u0442\u0430\u0442\u044c\u00a0<code>Win*<\/code>\u00a0\u0438\u0437\u00a0<code>HWND<\/code>\u00a0\u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0434\u0430\u043b\u044c\u0448\u0435 &#8212; \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0443, \u0430 \u0442\u043e\u0442 \u0443\u0436\u0435 \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442 \u0435\u0433\u043e \u0432 VCL \u043a\u0430\u043a\u00a0<code>OSEvent<\/code><\/p>\n<p><code>CreateControl<\/code>\u00a0&#8212; \u044d\u0442\u043e \u0431\u043e\u043b\u044c\u0448\u043e\u0439\u00a0<code>switch<\/code>\u00a0\u043f\u043e\u00a0<code>ControlKind<\/code>. \u041a\u0430\u0436\u0434\u043e\u043c\u0443 \u0442\u0438\u043f\u0443 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u0430 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0441\u0432\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 Win32 (<code>BUTTON<\/code>,\u00a0<code>EDIT<\/code>,\u00a0<code>STATIC<\/code>,\u00a0<code>COMBOBOX<\/code>) \u0438 \u043d\u0430\u0431\u043e\u0440 \u0441\u0442\u0438\u043b\u0435\u0439 (<code>WS_*<\/code>,\u00a0<code>BS_*<\/code>,\u00a0<code>ES_*<\/code>,\u00a0<code>CBS_*<\/code>). VCL \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u0442\u00a0<code>ControlDesc<\/code>, \u0434\u0440\u0430\u0439\u0432\u0435\u0440 \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0438\u0442 \u0435\u0433\u043e \u0432 \u0432\u044b\u0437\u043e\u0432\u00a0<code>CreateWindowExW<\/code>. \u0414\u043b\u044f \u0444\u043e\u0440\u043c\u044b \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f\u00a0<code>AdjustWindowRectEx<\/code>\u00a0\u2014 \u043e\u043d\u0430 \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0438\u0442 \u043a\u043b\u0438\u0435\u043d\u0442\u0441\u043a\u0438\u0435 \u0440\u0430\u0437\u043c\u0435\u0440\u044b \u0432 \u0440\u0430\u0437\u043c\u0435\u0440\u044b \u043e\u043a\u043d\u0430 \u0441 \u0440\u0430\u043c\u043a\u043e\u0439. \u041f\u043e\u0441\u043b\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043e\u043a\u043d\u0430 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430\u00a0<code>Win<\/code>\u00a0\u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0432\u00a0<code>GWLP_USERDATA<\/code>, \u0447\u0442\u043e\u0431\u044b\u00a0<code>WndProc<\/code>\u00a0\u043c\u043e\u0433 \u043d\u0430\u0439\u0442\u0438 \u0434\u0440\u0430\u0439\u0432\u0435\u0440. \u041d\u0438\u043a\u0430\u043a\u0438\u0435 Win32-\u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u044b \u043d\u0430\u0440\u0443\u0436\u0443 \u043d\u0435 \u0443\u0445\u043e\u0434\u044f\u0442: VCL \u0437\u043d\u0430\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e\u00a0<code>ControlKind::Button<\/code>, \u0430 \u043d\u0435\u00a0<code>BS_PUSHBUTTON<\/code> <\/p>\n<pre><code class=\"cpp\">void OnCommand(HWND, Win*, WORD code, HWND child, WORD) override {    if (!child) return;    auto* sink = SinkForHwnd(child);    if (!sink) return;    OSEvent e; e.key = (int)code;    switch (code) {    case BN_CLICKED:        e.type = OSEvent::Command;        sink-&gt;OnOSEvent(e);        break;    case CBN_SELCHANGE:    case EN_CHANGE:        e.type = OSEvent::Change;        sink-&gt;OnOSEvent(e);        break;    }}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<h3>\u041a\u0430\u043a \u044d\u0442\u043e \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0446\u0435\u043b\u0438\u043a\u043e\u043c<\/h3>\n<pre><code class=\"cpp\">class TForm1 : public TForm {    INHERITED(TForm);public:    explicit TForm1(TComponent* owner) : TForm(owner) {        SetCaption(\"Hello VCL (Win32)\");        SetBounds(200, 200, 480, 320);        OnClose() = [](TObject*, bool&amp; CanClose) {            int r = MessageBoxW(nullptr, L\"\u0422\u043e\u0447\u043d\u043e \u0437\u0430\u043a\u0440\u044b\u0442\u044c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435?\",                L\"\u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u0435\", MB_YESNO | MB_ICONQUESTION);            CanClose = r == IDNO;        };        auto* panel = new TPanel(this);        panel-&gt;SetParent(this);        panel-&gt;SetBounds(10, 10, 460, 80);        auto* label = new TLabel(panel);        label-&gt;SetParent(panel);        label-&gt;SetBounds(20, 30, 400, 24);        label-&gt;SetCaption(\"Press the button!\");        auto* button = new TButton(this);        button-&gt;SetParent(this);        button-&gt;SetBounds(20, 120, 160, 40);        button-&gt;SetCaption(\"Click me\");        button-&gt;OnClick() = [label](TObject*) {            label-&gt;SetCaption(\"Clicked at \" + std::to_string(GetTickCount64()));        };    }};<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u0418\u0435\u0440\u0430\u0440\u0445\u0438\u044f \u0432\u044b\u0437\u043e\u0432\u043e\u0432 <\/p>\n<pre><code class=\"css\">Win32 message    =&gt; WndProc        =&gt; Win* (GWLP_USERDATA)            =&gt; ITWindowsDriver::OnXxx()                =&gt; Emit() \u2192 IEventSink::OnOSEvent(OSEvent)                    =&gt; TControl::OnOSEvent \/ TOSControl::OnOSEvent                        =&gt; FOnClick \/ FOnChange \/ FOnKeyDown<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p><strong>RTL-\u0441\u043b\u043e\u0439 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0438\u0434\u0438\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u043d \u0442\u043e\u0447\u043a\u0435 \u0432\u0445\u043e\u0434\u0443 \u0441\u0430\u043c\u043e\u0439 RAD Studio<\/strong><\/p>\n<p>\u041d\u0430 \u043c\u043e\u043c\u0435\u043d\u0442 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438 RTL-\u0441\u043b\u043e\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e: TObject, TComponent, Exception, \u0438\u0435\u0440\u0430\u0440\u0445\u0438\u044f \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0439, \u0432\u043b\u0430\u0434\u0435\u043d\u0438\u0435. \u0412\u0441\u0451, \u0447\u0442\u043e \u0435\u0441\u0442\u044c \u0432 \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0435\u043c RTL. \u0410 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 \u0444\u043e\u0440\u043c\u044b (TForm1) \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c \u0438 \u043f\u043e\u0445\u043e\u0436 \u043d\u0430 \u0442\u043e, \u0447\u0442\u043e \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 RAD Studio, \u0432\u043f\u043b\u043e\u0442\u044c \u0434\u043e Application, Form1, _tWinMain \u0438 \u043f\u043e\u0440\u044f\u0434\u043a\u0430 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438. \u0420\u0430\u0437\u043d\u0438\u0446\u0430 \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0435 \u043f\u043e\u0434 \u043a\u0430\u043f\u043e\u0442\u043e\u043c.<\/p>\n<p>\u042d\u0442\u043e \u0440\u043e\u0432\u043d\u043e \u0442\u043e\u0442 \u043a\u043e\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043b\u0430 \u0431\u044b RAD Studio, \u0435\u0441\u043b\u0438 \u0431\u044b \u0443 \u043d\u0435\u0451 \u0431\u044b\u043b \u0442\u0430\u043a\u043e\u0439 \u0431\u044d\u043a\u0435\u043d\u0434. Application, Form1, _tWinMain, \u043f\u043e\u0440\u044f\u0434\u043e\u043a \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438, \u0441\u043f\u043e\u0441\u043e\u0431 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043e\u0432 \u0447\u0435\u0440\u0435\u0437 new + SetParent + SetBounds, \u043b\u044f\u043c\u0431\u0434\u044b \u0432\u043c\u0435\u0441\u0442\u043e published-\u043c\u0435\u0442\u043e\u0434\u043e\u0432. \u0412\u0441\u0451 \u044d\u0442\u043e \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e \u0438 \u043f\u043e\u0445\u043e\u0436\u0435 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043a\u043e\u0434. \u0415\u0441\u043b\u0438 \u0442\u044b \u043f\u0438\u0441\u0430\u043b \u043d\u0430 C++Builder, \u0442\u044b \u0443\u0437\u043d\u0430\u0435\u0448\u044c \u044d\u0442\u043e\u0442 \u043a\u043e\u0434 \u0441 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0432\u0437\u0433\u043b\u044f\u0434\u0430.<\/p>\n<pre><code class=\"cpp\">\/\/ \u0413\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u044b\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b - \u043a\u0430\u043a \u0432 IDE VCLstd::unique_ptr&lt;TApplication&gt; Application;TForm1* Form1 = nullptr;\/\/ _tWinMain - \u0431\u0438\u043b\u0434\u0435\u0440\u043e\u0432\u0441\u043a\u0438\u0439 \u0432\u0445\u043e\u0434 \u0432 \u0441\u0442\u0438\u043b\u0435 IDE.int WINAPI _tWinMain(HINSTANCE, HINSTANCE, LPTSTR, int){    try    {        Application-&gt;Initialize();        Application-&gt;MainFormOnTaskBar = true;        Application-&gt;CreateForm(Form1);        Application-&gt;Run();    }    catch (Exception&amp; exception)    {        Application-&gt;ShowException(&amp;exception);    }    catch (...)    {        try        {            throw Exception(\"\");        }        catch (Exception&amp; exception)        {            Application-&gt;ShowException(&amp;exception);        }    }    return 0;}\/\/  wWinMain - \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0430\u044f \u0442\u043e\u0447\u043a\u0430 \u0432\u0445\u043e\u0434\u0430 CRT.int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE, PWSTR, int){    TWindowsDriver driver(hInstance);    Application = std::make_unique&lt;TApplication&gt;(nullptr);    Application-&gt;SetDriver(&amp;driver);    Application-&gt;SetTitle(\"VCL Demo\");    Form1 = new TForm1(Application.get());    return _tWinMain(hInstance, nullptr, nullptr, 0);}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u041f\u043e\u043b\u043d\u044b\u0439 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u043e\u0431\u044b\u0447\u043d\u043e\u0439 \u0441\u0442\u0443\u0434\u0438\u0435\u0439 MSVC<\/p>\n<details class=\"spoiler\">\n<summary>\u0421\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 GitHub-\u043f\u0440\u043e\u0435\u043a\u0442<\/summary>\n<div class=\"spoiler__content\">\n<p><a href=\"https:\/\/github.com\/QbitQuantum\/GUIFramework\" rel=\"noopener nofollow\">https:\/\/github.com\/QbitQuantum\/GUIFramework<\/a><\/p>\n<\/div>\n<\/details>\n<\/div>\n<p>\u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/1090676\/\">https:\/\/habr.com\/ru\/articles\/1090676\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>C++Builder \u0440\u0435\u0430\u043b\u044c\u043d\u043e \u043a\u043b\u0430\u0441\u0441\u043d\u0430\u044f \u0448\u0442\u0443\u043a\u0430: \u043a\u0438\u0434\u0430\u0435\u0448\u044c \u0444\u043e\u0440\u043c\u0443 \u043c\u044b\u0448\u043a\u043e\u0439, \u043d\u0430\u043a\u0438\u0434\u044b\u0432\u0430\u0435\u0448\u044c \u043a\u043d\u043e\u043f\u043e\u043a, \u0434\u0432\u0430\u0436\u0434\u044b \u043a\u043b\u0438\u043a\u0430\u0435\u0448\u044c \u0438 \u043f\u0438\u0448\u0435\u0448\u044c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a.\u041d\u043e \u043e\u0434\u043d\u0430\u0436\u0434\u044b \u044f \u0437\u0430\u0434\u0430\u043b \u0441\u0435\u0431\u0435 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0432\u043e\u043f\u0440\u043e\u0441. \u042d\u0442\u0430 \u043f\u0440\u043e \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u044e \u0438\u043b\u0438 \u043f\u0440\u043e \u043f\u0440\u043e\u0434\u0443\u043a\u0442? \u0418 \u0440\u0435\u0448\u0438\u043b \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c. \u0422\u0430\u043a \u043f\u043e\u044f\u0432\u0438\u043b\u0441\u044f OpenRTL, \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u044f\u0434\u0440\u0430 RTL\/VCL-\u043f\u0430\u0440\u0430\u0434\u0438\u0433\u043c\u044b \u043d\u0430 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u043c C++17. \u0411\u0435\u0437 \u043f\u0440\u043e\u043f\u0440\u0438\u0435\u0442\u0430\u0440\u043d\u044b\u0445 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u043e\u0432, \u0431\u0435\u0437 \u0437\u0430\u043a\u0440\u044b\u0442\u044b\u0445 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a, \u0431\u0435\u0437 \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u0439.\u0422\u043e, \u043d\u0430 \u0447\u0442\u043e \u0443 Embarcadero \u0443\u0448\u043b\u0438 \u0434\u0435\u0441\u044f\u0442\u0438\u043b\u0435\u0442\u0438\u044f, \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0437\u0430 1500 \u0441\u0442\u0440\u043e\u043a, \u0435\u0441\u043b\u0438 \u043f\u043e\u043d\u0438\u043c\u0430\u0435\u0448\u044c \u043f\u0430\u0440\u0430\u0434\u0438\u0433\u043c\u0443. \u041d\u0435 \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u044f \u0433\u0435\u043d\u0438\u0439. \u0410 \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0432\u0441\u0435\u0445 \u0443\u0431\u0435\u0434\u0438\u043b\u0438, \u0447\u0442\u043e \u044d\u0442\u043e \u0441\u043b\u043e\u0436\u043d\u043e. \u041d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u043d\u0435 \u0441\u043b\u043e\u0436\u043d\u043e. \u041f\u0440\u043e\u0441\u0442\u043e \u043d\u0438\u043a\u0442\u043e \u043d\u0435 \u0431\u0440\u0430\u043b\u0441\u044f.  \u041f\u043e\u0447\u0435\u043c\u0443 \u044d\u0442\u043e \u0432\u043e\u043e\u0431\u0449\u0435 \u0432\u0430\u0436\u043d\u043eC++Builder Professional \u0441\u0442\u043e\u0438\u0442 $1,599. RAD Studio Architect \u0441\u0442\u043e\u0438\u0442 $4,199. \u041f\u0440\u0438\u0447\u0451\u043c C++Builder \u0434\u043e\u0440\u043e\u0436\u0435 Delphi, \u0430 \u0443\u043c\u0435\u0435\u0442 \u043c\u0435\u043d\u044c\u0448\u0435. Embarcadero \u043f\u0440\u043e\u0434\u0430\u0451\u0442 \u043d\u0435 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u044e. \u0422\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u044f \u0441\u0442\u0430\u0440\u0430\u044f \u0438 \u0434\u0430\u0432\u043d\u043e \u043d\u0435 \u0441\u0435\u043a\u0440\u0435\u0442. \u041e\u043d\u0438 \u043f\u0440\u043e\u0434\u0430\u044e\u0442 \u043c\u043e\u043d\u043e\u043f\u043e\u043b\u0438\u044e. \u041f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0430\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u044b \u043d\u0435\u0442.\u0415\u0441\u0442\u044c Lazarus \u0438 Project Fresnel. \u041e\u043d\u0438 \u043b\u043e\u043c\u0430\u044e\u0442 \u043c\u043e\u043d\u043e\u043f\u043e\u043b\u0438\u044e, \u043d\u043e \u0438\u0434\u0443\u0442 \u0441\u043e \u0441\u0442\u043e\u0440\u043e\u043d\u044b Pascal \u0438 \u043e\u0442\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u043e\u0442 VCL-\u043f\u0430\u0440\u0430\u0434\u0438\u0433\u043c\u044b. \u041c\u043d\u0435 \u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u0434\u0440\u0443\u0433\u043e\u0433\u043e. \u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0441\u0430\u043c\u0443 VCL-\u043f\u0430\u0440\u0430\u0434\u0438\u0433\u043c\u0443, \u043d\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0435\u0451 \u043d\u0430 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u043c C++. \u041d\u043e \u0431\u044b\u043b\u0430 \u0438 \u0432\u0442\u043e\u0440\u0430\u044f \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430, \u0441\u0435\u0440\u044c\u0451\u0437\u043d\u0435\u0435 \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u0439.\u041a\u0430\u043a \u0443\u0441\u0442\u0440\u043e\u0435\u043d\u0430 VCL\u041f\u0440\u0435\u0436\u0434\u0435 \u0447\u0435\u043c \u0433\u043e\u0432\u043e\u0440\u0438\u0442\u044c \u043f\u0440\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e, \u043d\u0430\u043f\u043e\u043c\u043d\u044e, \u0438\u0437 \u0447\u0435\u0433\u043e \u0432\u043e\u043e\u0431\u0449\u0435 \u0441\u043e\u0441\u0442\u043e\u0438\u0442 VCL\u0418\u0435\u0440\u0430\u0440\u0445\u0438\u044f. \u0412\u0441\u0451 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0441 TObject, \u044d\u0442\u043e \u043a\u043e\u0440\u0435\u043d\u044c. \u0423 \u043d\u0435\u0433\u043e \u0435\u0441\u0442\u044c ClassName() \u0438 InheritsFrom() \u2014 \u0440\u0443\u0447\u043d\u043e\u0439 RTTI, \u0431\u0435\u0437 typeid \u0438 dynamic_cast \u043a\u0430\u043a \u043e\u0441\u043d\u043e\u0432\u044b. \u0414\u0430\u043b\u044c\u0448\u0435 \u0438\u0434\u0451\u0442 TComponent: \u0432\u0441\u0451, \u0447\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u0447\u0435\u043c-\u0442\u043e \u0432\u043b\u0430\u0434\u0435\u0442\u044c. \u041f\u043e\u0442\u043e\u043c TControl: \u0432\u0441\u0451, \u0447\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u043d\u0430 \u044d\u043a\u0440\u0430\u043d\u0435. \u041f\u043e\u0442\u043e\u043c TOSControl, TCustomForm, TForm, \u0438 \u0443\u0436\u0435 \u043e\u0442 \u043d\u0438\u0445 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0435 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044b: TButton, TLabel, TEdit, TComboBox, TCheckBox, TPanel.\u0412\u043b\u0430\u0434\u0435\u043d\u0438\u0435. TComponent \u0432\u043b\u0430\u0434\u0435\u0435\u0442 \u0434\u0440\u0443\u0433\u0438\u043c\u0438 TComponent \u0447\u0435\u0440\u0435\u0437 Owner \u0438 OwnedComponents. \u041a\u043d\u043e\u043f\u043a\u0430 \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u0438\u043d\u0430\u0434\u043b\u0435\u0436\u0430\u0442\u044c \u0444\u043e\u0440\u043c\u0435, \u0437\u043d\u0430\u0447\u0438\u0442 \u0444\u043e\u0440\u043c\u0430 \u0435\u0451 \u0443\u0434\u0430\u043b\u0438\u0442. \u042d\u0442\u043e \u043d\u0435 \u0442\u043e \u0436\u0435 \u0441\u0430\u043c\u043e\u0435, \u0447\u0442\u043e \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c \u043d\u0430 \u044d\u043a\u0440\u0430\u043d\u0435, \u0438 \u043f\u0443\u0442\u0430\u0442\u044c \u0438\u0445 \u043d\u0435 \u043d\u0430\u0434\u043e.\u0412\u0438\u0437\u0443\u0430\u043b\u044c\u043d\u0430\u044f \u0438\u0435\u0440\u0430\u0440\u0445\u0438\u044f. TControl \u0437\u043d\u0430\u0435\u0442 \u0441\u0432\u043e\u0435\u0433\u043e Parent \u0438 \u0441\u043f\u0438\u0441\u043e\u043a ChildControls. \u042d\u0442\u043e \u043f\u0440\u043e \u0442\u043e, \u043a\u0442\u043e \u043a\u043e\u0433\u043e \u0440\u0438\u0441\u0443\u0435\u0442 \u0438 \u043a\u0442\u043e \u0432 \u043a\u043e\u0433\u043e \u043f\u043e\u043f\u0430\u0434\u0430\u0435\u0442 \u043c\u044b\u0448\u044c\u044e. \u0412 VCL \u044d\u0442\u043e \u0434\u0432\u0435 \u0440\u0430\u0437\u043d\u044b\u0435 \u0432\u0435\u0449\u0438, \u0438 \u044d\u0442\u043e \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0438\u0430\u043b\u044c\u043d\u043e. \u041a\u043d\u043e\u043f\u043a\u0430 \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u0438\u043d\u0430\u0434\u043b\u0435\u0436\u0430\u0442\u044c \u0444\u043e\u0440\u043c\u0435 (\u0444\u043e\u0440\u043c\u0430 \u0435\u0451 \u0443\u0434\u0430\u043b\u0438\u0442), \u043d\u043e \u0432\u0438\u0437\u0443\u0430\u043b\u044c\u043d\u043e \u043b\u0435\u0436\u0430\u0442\u044c \u043d\u0430 \u043f\u0430\u043d\u0435\u043b\u0438. \u0412 Qt \u044d\u0442\u043e \u0441\u043b\u0438\u0442\u043e \u0432 QObject::parent. \u0412 VCL \u0436\u0435 \u044d\u0442\u043e \u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u043e.\u0421\u043e\u0431\u044b\u0442\u0438\u044f. OnClick, OnChange, OnClose, OnMouseDown, OnKeyDown. \u0412 C++ \u044d\u0442\u043e std::function, \u0432 Object Pascal method pointer. \u0421\u043e\u0431\u044b\u0442\u0438\u0435 \u044d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u043e\u043b\u0435. \u0415\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0437\u043d\u0430\u0447\u0438\u0442\u044c, \u043f\u0435\u0440\u0435\u043d\u0430\u0437\u043d\u0430\u0447\u0438\u0442\u044c, \u043e\u0447\u0438\u0441\u0442\u0438\u0442\u044c. \u041d\u0438\u0447\u0435\u0433\u043e \u043e\u0441\u043e\u0431\u043e \u043d\u043e\u0432\u043e\u0433\u043e.\u0421\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043a\u043e\u0434. IDE \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u043a\u043b\u0430\u0441\u0441 \u0444\u043e\u0440\u043c\u044b: \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u044b\u0439 Application, \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u044b\u0439 Form1, _tWinMain \u0441 Application-&gt;Initialize(), Application-&gt;CreateForm(Form1), Application-&gt;Run(). \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 TForm1 \u0441\u043e\u0437\u0434\u0430\u0451\u0442 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044b \u0438 \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u0442 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430. \u0412\u0441\u0451 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u043e\u0435 \u043b\u0435\u0436\u0438\u0442 \u0432 DFM-\u0444\u0430\u0439\u043b\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 IDE \u0447\u0438\u0442\u0430\u0435\u0442 \u0438 \u043f\u0438\u0448\u0435\u0442.\u0427\u0442\u043e \u0437\u0434\u0435\u0441\u044c \u0432\u0430\u0436\u043d\u043e \u0434\u043b\u044f \u043d\u0430\u0441. \u0412\u0441\u0451 \u044d\u0442\u043e \u0438\u0434\u0435\u0438. \u041d\u0438 \u043e\u0434\u043d\u0430 \u0438\u0437 \u043d\u0438\u0445 \u043d\u0435 \u043f\u0440\u0438\u0432\u044f\u0437\u0430\u043d\u0430 \u043a Win32, \u043a \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u043c\u0443 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0443 \u0438\u043b\u0438 \u043a \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u043c\u0443 \u0432\u0435\u043d\u0434\u043e\u0440\u0443. TObject \u044d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u043a\u043b\u0430\u0441\u0441. Owner \u044d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c. OnClick \u044d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u044f. \u0418\u0435\u0440\u0430\u0440\u0445\u0438\u044f \u044d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0430\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u0435. \u0412\u0441\u0451 \u044d\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043d\u0430 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u043c C++.\u0410 \u0442\u0435\u043f\u0435\u0440\u044c \u043f\u043e\u0435\u0445\u0430\u043b\u0438: VCL \u043d\u0435 \u0434\u043e\u043b\u0436\u0435\u043d \u0437\u043d\u0430\u0442\u044c \u043f\u0440\u043e Win32C++Builder \u044d\u0442\u043e \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0434 Windows, \u0438 VCL \u0442\u043e\u0436\u0435 \u0437\u0430\u0432\u044f\u0437\u0430\u043d \u043d\u0430 Windows. TWinControl \u0437\u043d\u0430\u0435\u0442 \u043f\u0440\u043e HWND, TCanvas \u0437\u043d\u0430\u0435\u0442 \u043f\u0440\u043e HDC, TForm \u0437\u043d\u0430\u0435\u0442 \u043f\u0440\u043e WndProc. \u041f\u0435\u0440\u0435\u043d\u0435\u0441\u0442\u0438 \u044d\u0442\u043e \u043d\u0430 Linux \u0431\u0435\u0437 \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u044b\u0432\u0430\u043d\u0438\u044f \u043f\u043e\u043b\u043e\u0432\u0438\u043d\u044b \u043a\u043e\u0434\u0430 \u043d\u0435 \u0432\u044b\u0439\u0434\u0435\u0442. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 Embarcadero \u0438 \u043d\u0435 \u0434\u0435\u043b\u0430\u0435\u0442 VCL \u043a\u0440\u043e\u0441\u0441\u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435\u043d\u043d\u044b\u043c: \u0443 \u043d\u0438\u0445 \u044d\u0442\u043e \u043d\u0430\u0434\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u043d\u0430\u0434 Win32, \u0430 \u043d\u0435 \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u043f\u0430\u0440\u0430\u0434\u0438\u0433\u043c\u0430. FireMonkey \u043e\u043d\u0438 \u043f\u0438\u0441\u0430\u043b\u0438 \u0441 \u043d\u0443\u043b\u044f, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e VCL \u043f\u043e\u0434 \u0434\u0440\u0443\u0433\u0438\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0443\u0436\u0435 \u043d\u0435 \u043f\u0435\u0440\u0435\u0434\u0435\u043b\u0430\u0442\u044c\u0412 \u044d\u0442\u043e\u043c \u0438 \u0435\u0441\u0442\u044c \u0433\u043b\u0430\u0432\u043d\u0430\u044f \u0438\u0434\u0435\u044f OpenRTLVCL-\u0441\u043b\u043e\u0439 \u043d\u0435 \u0437\u043d\u0430\u0435\u0442, \u043f\u043e\u0434 \u043a\u0430\u043a\u043e\u0439 \u041e\u0421 \u043e\u043d \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442. \u0421\u043e\u0432\u0441\u0435\u043c. TControl \u043d\u0435 \u0437\u043d\u0430\u0435\u0442 \u043f\u0440\u043e HWND. TForm \u043d\u0435 \u0437\u043d\u0430\u0435\u0442 \u043f\u0440\u043e WndProc. TCanvas \u043d\u0435 \u0437\u043d\u0430\u0435\u0442 \u043f\u0440\u043e HDC. \u0412\u0441\u0451, \u0447\u0442\u043e VCL \u0437\u043d\u0430\u0435\u0442 \u043f\u0440\u043e \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0443, \u044d\u0442\u043e \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0442\u043d\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 IOSDriver.class IOSDriver {public:    virtual ~IOSDriver() = default;    virtual std::unique_ptr&lt;IOSHandle&gt;        CreateControl(const ControlDesc&amp; d) = 0;    virtual std::unique_ptr&lt;TCanvas&gt;        CreateCanvas(IOSHandle* h) = 0;    virtual const char* Name() const = 0;    virtual int  RunMessageLoop() = 0;    virtual void SetBounds(IOSHandle* h, int l, int t, int w, int ht) = 0;    virtual void SetVisible(IOSHandle* h, bool v) = 0;    virtual void SetText(IOSHandle* h, const std::string&amp; text) = 0;    virtual std::string GetText(IOSHandle* h) const = 0;    virtual void SetEnabled(IOSHandle* h, bool e) = 0;    virtual void Invalidate(IOSHandle* h) = 0;    virtual void SetCheck(IOSHandle* h, bool c) = 0;    virtual bool GetCheck(IOSHandle* h) const = 0;    virtual void AddString(IOSHandle* h, const std::string&amp; s) = 0;    virtual void SetSel(IOSHandle* h, int idx) = 0;    virtual int  GetSel(IOSHandle* h) const = 0;    virtual void SetEventSink(IOSHandle* h, IEventSink* sink) = 0;};\u0421 \u0434\u0440\u0443\u0433\u043e\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u044b &#8212;\u00a0IEventSink. \u042d\u0442\u043e \u0442\u043e, \u043a\u0430\u043a \u041e\u0421 \u0441\u043e\u043e\u0431\u0449\u0430\u0435\u0442 VCL, \u0447\u0442\u043e \u0447\u0442\u043e-\u0442\u043e \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u043estruct OSEvent {    enum Type {        MouseDown, MouseUp, MouseMove,        KeyDown, KeyUp,        Resize, Move, Close, Paint,        Show, Hide, Command, Change    };    Type type = Paint;    int  x = 0, y = 0;    int  button = 0;    int  key = 0;    int  width = 0, height = 0;    uint32_t timestamp = 0;    bool cancel = false;};class IEventSink {public:    virtual ~IEventSink() = default;    virtual void OnOSEvent(OSEvent&amp; e) = 0;};OSEvent \u044d\u0442\u043e \u043d\u043e\u0440\u043c\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u043e\u0435 \u0441\u043e\u0431\u044b\u0442\u0438\u0435\u041d\u0435 WM_PAINT, \u043d\u0435 WM_LBUTTONDOWN. \u041f\u0440\u043e\u0441\u0442\u043e Paint, MouseDown. \u041f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0430 \u0441\u0430\u043c\u0430 \u043e\u0431\u044f\u0437\u0430\u043d\u0430 \u043f\u0435\u0440\u0435\u0432\u0435\u0441\u0442\u0438 \u0441\u0432\u043e\u0451 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0432 \u044d\u0442\u043e\u0442 \u0444\u043e\u0440\u043c\u0430\u0442.\u041c\u0435\u0436\u0434\u0443 \u043d\u0438\u043c\u0438 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f IOSHandle. \u042d\u0442\u043e \u043d\u0435\u043f\u0440\u043e\u0437\u0440\u0430\u0447\u043d\u044b\u0439 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u0442\u043e, \u0447\u0442\u043e \u041e\u0421 \u0441\u0447\u0438\u0442\u0430\u0435\u0442 \u043e\u043a\u043d\u043e\u043cstruct IOSHandle {    virtual ~IOSHandle() = default;};VCL \u043d\u0435 \u0437\u043d\u0430\u0435\u0442, \u0447\u0442\u043e \u0432\u043d\u0443\u0442\u0440\u0438. \u0414\u043b\u044f Win32 \u044d\u0442\u043e HWND. \u0414\u043b\u044f GTK4 \u044d\u0442\u043e GtkWidget. \u0414\u043b\u044f Cocoa \u044d\u0442\u043e NSView. \u041e\u043d\u0430 \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u0442 \u0435\u0433\u043e \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0443 \u0438 \u0433\u043e\u0432\u043e\u0440\u0438\u0442: \u0441\u0434\u0435\u043b\u0430\u0439 \u0441 \u043d\u0438\u043c \u0432\u043e\u0442 \u044d\u0442\u043e\u041a\u0430\u043a \u044d\u0442\u043e \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0432 \u0446\u0435\u043f\u043e\u0447\u043a\u0435Win32 message (WM_COMMAND)-&gt;WndProc (Win32-\u0441\u043f\u0435\u0446\u0438\u0444\u0438\u0447\u043d\u044b\u0439)-&gt;Win* \u0438\u0437 GWLP_USERDATA (Win32-\u0441\u043f\u0435\u0446\u0438\u0444\u0438\u0447\u043d\u044b\u0439)-&gt;ITWindowsDriver::OnCommand (Win32-\u0441\u043f\u0435\u0446\u0438\u0444\u0438\u0447\u043d\u044b\u0439)\/\/ ===========&gt; \u041f\u0435\u0440\u0435\u0445\u043e\u0434\u043d\u0430\u044f \u0433\u0440\u0430\u043d\u0438\u0446\u0430 Emit() \u2192 OSEvent{type=Command}-&gt;IEventSink::OnOSEvent(OSEvent)-&gt;TControl::OnOSEvent-&gt;FOnClick\u0412\u044b\u0448\u0435 \u0433\u0440\u0430\u043d\u0438\u0446\u044b \u0436\u0438\u0432\u0451\u0442 Win32. \u041d\u0438\u0436\u0435 \u0433\u0440\u0430\u043d\u0438\u0446\u044b \u0436\u0438\u0432\u0451\u0442 \u0447\u0438\u0441\u0442\u044b\u0439 VCL. TControl \u043d\u0435 \u0437\u043d\u0430\u0435\u0442, \u0447\u0442\u043e WM_COMMAND \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442. \u041e\u043d \u0437\u043d\u0430\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e, \u0447\u0442\u043e \u043f\u0440\u0438\u0448\u0451\u043b OSEvent::Command\u041a\u0430\u043a \u044d\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435virtual void CreateHandle(IOSHandle* parentHandle) {    if (FHandle) return;    if (!FDriver) return;    ControlDesc d;    d.kind = Kind();    d.caption = FCaption;    d.x = FLeft; d.y = FTop; d.w = FWidth; d.h = FHeight;    d.visible = FVisible;    d.enabled = FEnabled;    d.id = FId;    d.parent = parentHandle;    FHandle = FDriver-&gt;CreateControl(d);    \/\/&#8230;}TOSControl \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u0430, ControlDesc, \u0438 \u043e\u0442\u0434\u0430\u0451\u0442 \u0435\u0433\u043e \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0443. \u0427\u0442\u043e \u0434\u0440\u0430\u0439\u0432\u0435\u0440 \u0441 \u043d\u0438\u043c \u0441\u0434\u0435\u043b\u0430\u0435\u0442, \u0443\u0436\u0435 \u043d\u0435 \u0435\u0433\u043e \u0434\u0435\u043b\u043e. TWindowsDriver \u0432\u044b\u0437\u043e\u0432\u0435\u0442 CreateWindowExW. TGTKDriver \u0432\u044b\u0437\u043e\u0432\u0435\u0442 gtk_button_new. TCocoaDriver \u0432\u044b\u0437\u043e\u0432\u0435\u0442 [[NSButton alloc] init]. TOSControl \u043e\u0431 \u044d\u0442\u043e\u043c \u043d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u0443\u0437\u043d\u0430\u0435\u0442.void OnOSEvent(OSEvent&amp; e) override {    switch (e.type) {    case OSEvent::KeyDown: {        int key = e.key;        if (FOnKeyDown) FOnKeyDown(this, key, 0);        break;    }    case OSEvent::Change:        if (FOnChange) FOnChange(this);        break;    case OSEvent::Close:        if (FOnClose) FOnClose(this, e.cancel);        return;    default:        inherited::OnOSEvent(e);        return;    }}\u0421 \u0441\u043e\u0431\u044b\u0442\u0438\u044f\u043c\u0438 \u0442\u0430 \u0436\u0435 \u043b\u043e\u0433\u0438\u043a\u0430. TOSControl \u043d\u0435 \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0435\u0442 WM_KEYDOWN. \u041e\u043d \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 OSEvent::KeyDown \u0441 \u043f\u043e\u043b\u0435\u043c key. \u041e\u0442\u043a\u0443\u0434\u0430 \u0432\u0437\u044f\u043b\u0441\u044f key, \u0438\u0437 Win32 WPARAM, \u0438\u0437 GTK GdkEventKey::keyval \u0438\u043b\u0438 \u0438\u0437 Cocoa NSEvent::keyCode, \u043d\u0435 \u0432\u0430\u0436\u043d\u043e. \u0414\u0440\u0430\u0439\u0432\u0435\u0440 \u0443\u0436\u0435 \u043d\u043e\u0440\u043c\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043b\u0427\u0442\u043e \u044d\u0442\u043e \u0434\u0430\u0451\u0442\u041a\u0440\u043e\u0441\u0441\u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435\u043d\u043d\u043e\u0441\u0442\u044c \u043d\u0435 \u043f\u043e\u0442\u043e\u043c, \u0430 \u043f\u043e \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0435.\u042f \u043d\u0435 \u043f\u0438\u0448\u0443\u00a0#ifdef _WIN32\u00a0\u0432 VCL-\u0441\u043b\u043e\u0435. \u0421\u043e\u0432\u0441\u0435\u043c. \u041f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e VCL-\u0441\u043b\u043e\u0439 \u043d\u0435 \u0437\u043d\u0430\u0435\u0442, \u0447\u0442\u043e \u0442\u0430\u043a\u043e\u0435 Windows. \u0415\u0441\u043b\u0438 \u0437\u0430\u0432\u0442\u0440\u0430 \u044f \u043d\u0430\u043f\u0438\u0448\u0443 TGTKDriver, VCL-\u0441\u043b\u043e\u0439 \u043d\u0435 \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u0441\u044f \u043d\u0438 \u043d\u0430 \u0441\u0442\u0440\u043e\u043a\u0443. \u0414\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c IOSDriver \u0434\u043b\u044f GTK4.Win32 \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u044c, \u043d\u0435 \u0442\u0440\u043e\u0433\u0430\u044f VCL.\u0415\u0441\u043b\u0438 \u0437\u0430\u0432\u0442\u0440\u0430 Microsoft \u043f\u043e\u043c\u0435\u043d\u044f\u0435\u0442 Win32 \u043d\u0430 \u0447\u0442\u043e-\u0442\u043e \u0434\u0440\u0443\u0433\u043e\u0435 (\u0448\u0443\u0442\u043a\u0430, \u043d\u043e \u0432\u0441\u0451 \u0436\u0435), \u044f \u043f\u0435\u0440\u0435\u043f\u0438\u0448\u0443 TWindowsDriver, \u0430 VCL \u043e\u0441\u0442\u0430\u043d\u0435\u0442\u0441\u044f. \u0415\u0441\u043b\u0438 \u044f \u0437\u0430\u0445\u043e\u0447\u0443 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c WinRT \u0438\u043b\u0438 UWP, \u043f\u0435\u0440\u0435\u043f\u0438\u0448\u0443 \u0434\u0440\u0430\u0439\u0432\u0435\u0440.\u041e\u0442\u043b\u0430\u0434\u043a\u0430 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u043f\u0440\u043e\u0449\u0435.\u041a\u043e\u0433\u0434\u0430 \u0447\u0442\u043e-\u0442\u043e \u043d\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442, \u044f \u0442\u043e\u0447\u043d\u043e \u0437\u043d\u0430\u044e, \u0433\u0434\u0435 \u0438\u0441\u043a\u0430\u0442\u044c. \u041f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0441 \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u043e\u0439? \u041b\u0438\u0431\u043e TCanvas \u0432 VCL, \u043b\u0438\u0431\u043e TWindowsCanvas \u0432 \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0435. \u041f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0441 \u0441\u043e\u0431\u044b\u0442\u0438\u0435\u043c? \u041b\u0438\u0431\u043e TControl::OnOSEvent \u0432 VCL, \u043b\u0438\u0431\u043e Emit \u0432 \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0435. \u0413\u0440\u0430\u043d\u0438\u0446\u0430 \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u0442 \u043f\u043e OSEvent, \u0438 \u044d\u0442\u043e \u0442\u043e\u0447\u043a\u0430 \u0440\u0430\u0437\u0440\u0435\u0437\u0430.\u041c\u043e\u0436\u043d\u043e \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c VCL \u0431\u0435\u0437 \u041e\u0421.\u0412 \u0442\u0435\u043e\u0440\u0438\u0438 \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c\u00a0TNullDriver, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0441\u043e\u0437\u0434\u0430\u0451\u0442, \u043d\u043e \u043b\u043e\u0433\u0438\u0440\u0443\u0435\u0442 \u0432\u044b\u0437\u043e\u0432\u044b. \u0418 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043b\u043e\u0433\u0438\u043a\u0443 VCL \u0431\u0435\u0437 \u0435\u0434\u0438\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430. \u042f \u044d\u0442\u043e\u0433\u043e \u043f\u043e\u043a\u0430 \u043d\u0435 \u0441\u0434\u0435\u043b\u0430\u043b, \u043d\u043e \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 \u044d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442. \u042d\u0442\u043e \u043f\u0440\u044f\u043c\u043e\u0435 \u0441\u043b\u0435\u0434\u0441\u0442\u0432\u0438\u0435 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e VCL \u043d\u0435 \u0437\u043d\u0430\u0435\u0442 \u043f\u0440\u043e Win32.\u041a\u0430\u043a \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0417\u0434\u0435\u0441\u044c \u0432\u0435\u0441\u044c Win32\u0412\u043e\u0442 \u043a\u043e\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u00a0ControlDesc\u00a0\u0432 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e Win32. \u042d\u0442\u043e \u0441\u0435\u0440\u0434\u0446\u0435\u00a0TWindowsDriver  std::unique_ptr&lt;IOSHandle&gt; CreateControl(const ControlDesc&amp; d) override {    HWND parent = d.parent ? static_cast&lt;Win*&gt;(d.parent)-&gt;hwnd.get() : nullptr;    DWORD style = 0, exStyle = 0;    const wchar_t* cls = nullptr;    switch (d.kind) {    case ControlKind::Form:        cls = L&#187;VCLFormClass&#187;;        style = WS_OVERLAPPEDWINDOW;        EnsureClass(cls);        break;    case ControlKind::Panel:        cls = L&#187;VCLPanelClass&#187;;        style = WS_CHILD | WS_VISIBLE | WS_CLIPCHILDREN | WS_CLIPSIBLINGS;        EnsureClass(cls);        break;    case ControlKind::Label:        cls = L&#187;STATIC&#187;;        style = WS_CHILD | WS_VISIBLE | SS_LEFT;        break;    case ControlKind::Button:        cls = L&#187;BUTTON&#187;;        style = WS_CHILD | WS_VISIBLE | WS_TABSTOP | BS_PUSHBUTTON;        break;    case ControlKind::CheckBox:        cls = L&#187;BUTTON&#187;;        style = WS_CHILD | WS_VISIBLE | WS_TABSTOP | BS_AUTOCHECKBOX;        break;    case ControlKind::Edit:        cls = L&#187;EDIT&#187;;        style = WS_CHILD | WS_VISIBLE | WS_TABSTOP | ES_LEFT | ES_AUTOHSCROLL;        exStyle = WS_EX_CLIENTEDGE;        break;    case ControlKind::ComboBox:        cls = L&#187;COMBOBOX&#187;;        style = WS_CHILD | WS_VISIBLE | WS_TABSTOP | CBS_DROPDOWNLIST | WS_VSCROLL;        break;    case ControlKind::ListBox:        cls = L&#187;LISTBOX&#187;;        style = WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_VSCROLL | LBS_NOTIFY;        exStyle = WS_EX_CLIENTEDGE;        break;    }    if (!d.visible)&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-497447","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/497447","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=497447"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/497447\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=497447"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=497447"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=497447"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}