{"id":281978,"date":"2016-12-05T09:55:04","date_gmt":"2016-12-05T06:55:04","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=281978"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=281978","title":{"rendered":"\u041c\u0421\u0423\u0418\u0418 AmigaVirtual \u2014 \u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0430\u043b\u044c\u043d\u044b\u0439 \u0418\u0418 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e"},"content":{"rendered":"<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/6b8\/18f\/335\/6b818f335ba64ae49c378b707b118cbe.png\" alt=\"\u041b\u043e\u0433\u043e\u0442\u0438\u043f\" align=\"left\" width=\"300\"\/> \u041f\u0440\u0438\u0432\u0435\u0442 \u0432\u0441\u0435\u043c \u043b\u044e\u0431\u0438\u0442\u0435\u043b\u044f\u043c \u0438 \u0438\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044f\u043c \u0438\u0441\u043a\u0443\u0441\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u0438\u043d\u0442\u0435\u043b\u043b\u0435\u043a\u0442\u0430! \u0412 \u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u0445\u043e\u0442\u0435\u043b \u0431\u044b \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c \u043e\u0431 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0435: \u043c\u043e\u0434\u0443\u043b\u044c\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 \u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0438\u0441\u043a\u0443\u0441\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u0438\u043d\u0442\u0435\u043b\u043b\u0435\u043a\u0442\u0430 (\u041c\u0421\u0423\u0418\u0418) \u00abAmiga Virtual\u00bb (AV, \u00ab\u0412\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u0430\u044f \u041f\u043e\u0434\u0440\u0443\u0436\u043a\u0430\u00bb). \u042f \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443 \u043e\u0431 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0445 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0430\u0445 \u0435\u0451 \u0440\u0430\u0431\u043e\u0442\u044b \u0438 \u043e\u043f\u0438\u0448\u0443 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0434\u0435\u0442\u0430\u043b\u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438, \u0430 \u0441\u0430\u043c\u044b\u0435 \u043b\u044e\u0431\u043e\u043f\u044b\u0442\u043d\u044b\u0435 \u0441\u043c\u043e\u0433\u0443\u0442 \u0438\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u044c \u0432\u0441\u0435 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0435 \u043a\u043e\u0434\u044b. \u0420\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0432\u0435\u0434\u0451\u0442\u0441\u044f \u043d\u0430 Delphi, \u043d\u043e \u043c\u043e\u0434\u0443\u043b\u0438 \u0442\u0435\u043e\u0440\u0435\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u044b \u043d\u0430 \u043b\u044e\u0431\u043e\u043c \u042f\u041f. \u0414\u0430\u043d\u043d\u0430\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u0431\u0443\u0434\u0435\u0442 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u0430 \u043a\u0430\u043a \u043a\u043e\u043d\u0435\u0447\u043d\u044b\u043c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\u043c \u0447\u0430\u0442-\u0431\u043e\u0442\u043e\u0432 \u0438 \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0445 \u0441 \u043d\u0438\u043c\u0438 \u0441\u0438\u0441\u0442\u0435\u043c, \u0442\u0430\u043a \u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430\u043c \u0418\u0418 \u2014 \u0432\u0435\u0434\u044c \u043d\u0430 \u0435\u0451 \u043e\u0441\u043d\u043e\u0432\u0435 \u043c\u043e\u0436\u043d\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043b\u044e\u0431\u043e\u0439 \u0442\u0438\u043f \u0418\u0418.<br \/>  <a name=\"habracut\"><\/a><br \/>  \u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0438\u0441\u0442\u043e\u0440\u0438\u0438. \u041f\u0440\u043e\u0435\u043a\u0442 \u0431\u044b\u043b \u043d\u0430\u0447\u0430\u0442 \u0432 2012-\u043c \u0433\u043e\u0434\u0443, \u043a\u043e\u0433\u0434\u0430 \u044f \u0440\u0435\u0448\u0438\u043b \u0437\u0430\u043d\u044f\u0442\u044c\u0441\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u043e\u0439 \u0447\u0430\u0442-\u0431\u043e\u0442\u0430. \u0410 \u0440\u0435\u0448\u0438\u043b \u044f \u0442\u0430\u043a \u043f\u043e\u0441\u043b\u0435 \u0437\u043d\u0430\u043a\u043e\u043c\u0441\u0442\u0432\u0430 \u0441 \u00abSayme 2\u00bb \u2014 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0444\u043b\u0435\u0448-\u0438\u0433\u0440\u043e\u0439 \u043f\u0440\u043e \u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0441 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0439 \u0434\u0435\u0432\u0443\u0448\u043a\u043e\u0439 (\u043a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, \u0430\u043c\u0431\u0438\u0446\u0438\u043e\u0437\u043d\u043e\u0435 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0435\u043d\u0438\u0435 \u044d\u0442\u043e\u0439 \u0438\u0433\u0440\u044b \u2014 3-\u044f \u0432\u0435\u0440\u0441\u0438\u044f \u2014 \u043f\u043e \u0432\u0441\u0435\u0439 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u0443\u043c\u0435\u0440\u043b\u043e \u0432 \u0437\u0430\u0440\u043e\u0434\u044b\u0448\u0435. R.I.P., \u00abSayme 3\u00bb). \u0422\u043e\u0433\u0434\u0430 AV \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u043b\u0430 \u0441\u043e\u0431\u043e\u0439 \u043c\u043e\u043d\u043e\u043b\u0438\u0442, \u0441 \u0432\u044b\u043d\u0435\u0441\u0435\u043d\u043d\u044b\u043c\u0438 \u0432 \u043e\u0434\u043d\u0443 DLL \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0430\u043c\u0438 \u0441 \u0447\u0430\u0441\u0442\u044f\u043c\u0438 \u0430\u0432\u0430\u0442\u0430\u0440\u0430 \u2014 \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u043a\u0430\u0447\u0430\u0442\u044c \u043b\u0438\u0448\u043d\u0438\u0435 \u043c\u0435\u0433\u0430\u0431\u0430\u0439\u0442\u044b, \u0435\u0441\u043b\u0438 \u0430\u0432\u0430\u0442\u0430\u0440 \u043d\u0435 \u043d\u0443\u0436\u0435\u043d.<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/37c\/0c3\/de0\/37c0c3de049d49bcb5556fe077da5fb8.png\" alt=\"\u0441\u043a\u0440\u0438\u043d\u0448\u043e\u0442 1\" \/><\/div>\n<p>  <\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/42b\/f70\/47d\/42bf7047da014b699b76c70729d30fe8.png\" alt=\"\u0441\u043a\u0440\u0438\u043d\u0448\u043e\u0442 2\" \/><\/div>\n<p>  <i>\u0422\u0430\u043a \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u043b\u0430 \u043f\u0435\u0440\u0432\u0430\u044f \u0432\u0435\u0440\u0441\u0438\u044f Amiga Virtual.<\/i><\/p>\n<p>  \u0421 \u0442\u0435\u0445 \u043f\u043e\u0440 \u043a\u043e\u043d\u0446\u0435\u043f\u0446\u0438\u044f \u0438\u0437\u043c\u0435\u043d\u0438\u043b\u0430\u0441\u044c \u2014 \u0442\u0435\u043f\u0435\u0440\u044c \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e AV \u2014 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0430 \u0434\u043b\u044f \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u0440\u0430\u0431\u043e\u0442\u044b \u043c\u043e\u0434\u0443\u043b\u0435\u0439. \u0412\u0441\u0435 \u00ab\u043e\u0440\u0433\u0430\u043d\u044b\u00bb \u0418\u0418 \u0432\u044b\u043d\u0435\u0441\u0435\u043d\u044b \u0432 \u043c\u043e\u0434\u0443\u043b\u0438.<\/p>\n<p>  \u041d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u043b\u043e\u0432 \u043e \u044f\u0437\u044b\u043a\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f. \u0412 2012 \u044f \u0432\u044b\u0431\u0440\u0430\u043b Delphi, \u0442\u0430\u043a \u043a\u0430\u043a \u043d\u0435 \u0437\u043d\u0430\u043b \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043d\u0438\u0447\u0435\u0433\u043e, \u043a\u0440\u043e\u043c\u0435 \u043d\u0435\u0433\u043e (\u043d\u0435 \u0441\u0447\u0438\u0442\u0430\u044f Turbo Pascal). \u041f\u043e\u0437\u0436\u0435 \u044f \u043f\u0435\u0440\u0435\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u043b \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u044f\u0437\u044b\u043a\u043e\u0432\u2026 \u0411\u043e\u043b\u044c\u0448\u0435 \u0432\u0441\u0435\u0433\u043e \u043c\u043d\u0435 \u043f\u043e\u043d\u0440\u0430\u0432\u0438\u043b\u0430\u0441\u044c Ada, \u043d\u043e \u043e\u0431\u0443\u0447\u0430\u044e\u0449\u0438\u0445 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u043e\u0432 \u043f\u043e \u043d\u0435\u0439 \u043c\u0430\u043b\u043e, \u0434\u0430 \u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u044e\u0442\u0441\u044f \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u044b\u043c\u0438. \u0415\u0449\u0451 \u044f \u043f\u0440\u043e\u0431\u043e\u0432\u0430\u043b Oxygen (Delphi Prism), \u043d\u043e \u043f\u043e \u043d\u0435\u043c\u0443 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u043e\u0432 \u0435\u0449\u0451 \u043c\u0435\u043d\u044c\u0448\u0435. C++ \u0438 \u0434\u0440\u0443\u0433\u0438\u0435 \u0441\u0438-\u043f\u043e\u0434\u043e\u0431\u043d\u044b\u0435 \u044f\u0437\u044b\u043a\u0438 \u043c\u043d\u0435 \u043d\u0435 \u043d\u0440\u0430\u0432\u044f\u0442\u0441\u044f \u0432\u043e\u043e\u0431\u0449\u0435. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432 \u0438\u0442\u043e\u0433\u0435 \u044f \u0432\u0435\u0440\u043d\u0443\u043b\u0441\u044f \u043a Delphi, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u044f \u0445\u043e\u0440\u043e\u0448\u043e \u0437\u043d\u0430\u044e \u0438 \u043f\u043e \u043a\u043e\u0442\u043e\u0440\u043e\u043c\u0443 \u043f\u0440\u043e\u0441\u0442\u043e \u043c\u043e\u0440\u0435 \u043e\u0431\u0443\u0447\u0430\u044e\u0449\u0435\u0433\u043e \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0430 \u0432 \u0418\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0435, \u0434\u0430 \u0438 \u0433\u043e\u0442\u043e\u0432\u044b\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439 \u0442\u043e\u0436\u0435 \u043c\u043d\u043e\u0433\u043e.<\/p>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0435. Amiga Virtual \u2014 \u044d\u0442\u043e \u043c\u043d\u043e\u0433\u043e\u0446\u0435\u043b\u0435\u0432\u0430\u044f \u043c\u043d\u043e\u0433\u043e\u0430\u0433\u0435\u043d\u0442\u043d\u0430\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u0430. \u0412 \u043e\u0431\u0449\u0438\u0445 \u0447\u0435\u0440\u0442\u0430\u0445 \u043e\u043d\u0430 \u0443\u0441\u0442\u0440\u043e\u0435\u043d\u0430 \u0442\u0430\u043a: \u0435\u0441\u0442\u044c \u043e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 (\u041e\u041f) \u0438 \u043d\u0430\u0431\u043e\u0440 \u043c\u043e\u0434\u0443\u043b\u0435\u0439 (\u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u044b \u0432 \u0432\u0438\u0434\u0435 DLL \u0438 \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u044b\u043c\u0438 \u0430\u0433\u0435\u043d\u0442\u0430\u043c\u0438), \u0443 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u044b \u0442\u0435 \u0438\u043b\u0438 \u0438\u043d\u044b\u0435 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u044b \u0438\u0437 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430; \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0441\u0442\u0430\u0440\u0442\u0430 \u041e\u041f \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u0442 \u0438 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u0446\u0438\u0440\u0443\u0435\u0442 (\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442, \u0447\u0442\u043e \u043c\u043e\u0434\u0443\u043b\u044c \u043c\u043e\u0436\u0435\u0442 \u0434\u0435\u043b\u0430\u0442\u044c; \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043c\u043e\u0434\u0443\u043b\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0435 \u043d\u0435 \u0441\u043e\u043e\u0431\u0449\u0430\u0435\u0442\u0441\u044f \u2014 \u044d\u0442\u043e \u043d\u0435 \u0438\u043c\u0435\u0435\u0442 \u0441\u043c\u044b\u0441\u043b\u0430) \u0432\u0441\u0435 \u043c\u043e\u0434\u0443\u043b\u0438, \u0437\u0430\u0442\u0435\u043c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u0442 \u043c\u043e\u0434\u0443\u043b\u0438, \u0441 \u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u043e\u043d \u0445\u043e\u0447\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c, \u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u043c\u043d\u043e\u0433\u043e\u043f\u043e\u0442\u043e\u0447\u043d\u0443\u044e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u0432 \u0432\u0432\u043e\u0434\u0430-\u0432\u044b\u0432\u043e\u0434\u0430 \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u044b\u0445 \u043c\u043e\u0434\u0443\u043b\u0435\u0439. \u0412\u043e\u0442 \u0442\u0430\u043a \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0438 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043c\u043e\u0434\u0443\u043b\u0435\u0439:<\/p>\n<pre><code class=\"delphi\">procedure LoadModules; var   i: Integer; begin   for i := 0 to Length(Module) - 1 do   begin     if Module[i].Handle &gt; 0 then       FreeModule(Module[i]);     if LoadModule(Module[i]) then       DetermineModuleType(Module[i]);   end; end;  function LoadModule(var M: TModule): boolean; var   B: String;   C: Integer; begin   with M do   begin     Handle := LoadLibrary(PWideChar(FileName));     if Handle &gt; 0 then     begin       @SetLanguage := GetProcAddress(Handle, 'SetLanguage');       IncAndUpdateProgress; \/\/ \u0414\u043b\u044f \u043f\u0440\u043e\u0433\u0440\u0435\u0441\u0441-\u0431\u0430\u0440\u0430       @SendLanguageData := GetProcAddress(Handle, 'SendLanguageData');       IncAndUpdateProgress;       @GetName := GetProcAddress(Handle, 'GetName');       IncAndUpdateProgress;        \/\/ \u0422\u0443\u0442 \u043c\u043d\u043e\u0433\u043e \u0441\u0442\u0440\u043e\u043a, \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u044e\u0449\u0438\u0445 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u044b        \/\/ \u0412\u044b\u043d\u0438\u043c\u0430\u0435\u043c \u0438\u0437 \u043c\u043e\u0434\u0443\u043b\u044f \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438       if @GetName &lt;&gt; nil then       begin         B := GetName;         C := Pos(ControlCodeMarker, B);         if C &gt; 0 then         begin           Name := Copy(B, C + 1, Length(B));           ControlCode := Copy(B, 1, C - 1);           ControlCodeFormated := FormatControlCode(ControlCode);         end         else         begin           Name := B;           ControlCode := MainForm.LanguageData[133];         end;       end       else       begin         Name := MainForm.LanguageData[114];         ControlCode := MainForm.LanguageData[133];       end;        if (@OpenWindow &lt;&gt; nil) and (@CloseWindow &lt;&gt; nil) then         WindowState := closed       else         WindowState := window_does_not_exist;        if (@Sleep &lt;&gt; nil) and (@WakeUp &lt;&gt; nil) then         ModuleState := working       else         ModuleState := module_cant_sleep;        LoadStatistics; \/\/ \u042d\u0442\u043e \u043f\u043e\u043a\u0430 \u043d\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043e       Result := true;     end     else       Result := false;   end; end;  function DetermineModuleType(var M: TModule): TModuleType; begin   with M do   begin     MType := undetermined;      if (@SetLanguage = nil) and ... (* \u043c\u043d\u043e\u0433\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u0432 \u0441 nil *) then       MType := erroneous_or_empty     else     begin       if (@SetSource &lt;&gt; nil) or (@NextData &lt;&gt; nil) or (@Progress &lt;&gt; nil) or         (@RestartParsing &lt;&gt; nil) then         MType := parser       else       begin         if (@GetData &lt;&gt; nil) and (@SendData &lt;&gt; nil) then           MType := input_and_output         else if (@GetData &lt;&gt; nil) and (@SendData = nil) then           MType := only_input         else if (@GetData = nil) and (@SendData &lt;&gt; nil) then           MType := only_output         else if (@GetData = nil) and (@SendData = nil) then           MType := no_input_and_no_output;       end;     end;      Result := MType;   end; end;<\/code><\/pre>\n<p>  \u041e\u041f \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0441 \u043c\u043e\u0434\u0443\u043b\u044f\u043c\u0438, \u0438\u043b\u0438, \u043f\u0440\u043e\u0449\u0435 \u0433\u043e\u0432\u043e\u0440\u044f, \u043e\u043a\u043d\u043e \u0447\u0430\u0442\u0430. \u0412\u0441\u0435 \u043c\u043e\u0434\u0443\u043b\u0438 \u043e\u0431\u0449\u0430\u044e\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 \u044d\u0442\u043e\u0442 \u0447\u0430\u0442, \u043d\u043e \u043e\u0431\u044b\u0447\u043d\u043e \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u043c\u043e\u0434\u0443\u043b\u0435\u0439 \u043d\u0435 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044e, \u0442.\u043a. \u043d\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442 \u0434\u043b\u044f \u043d\u0435\u0433\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0430 (\u0432 \u0446\u0435\u043b\u044f\u0445 \u043e\u0442\u043b\u0430\u0434\u043a\u0438 \u044d\u0442\u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u043c\u043e\u0436\u043d\u043e \u043e\u0442\u043e\u0431\u0440\u0430\u0437\u0438\u0442\u044c). \u0422\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u043f\u043e\u043c\u0435\u0447\u0430\u044e\u0442\u0441\u044f \u043a\u0430\u043a \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043d\u0435\u043f\u0435\u0447\u0430\u0442\u043d\u044b\u0445 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 \u0432 \u043d\u0430\u0447\u0430\u043b\u0435 \u0441\u0442\u0440\u043e\u043a\u0438. \u042d\u0442\u043e\u0442 \u043a\u043e\u0434 (\u00ab\u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c-\u043a\u043e\u0434\u00bb) \u0437\u0430\u0434\u0430\u0451\u0442\u0441\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u043c \u043c\u043e\u0434\u0443\u043b\u044f. \u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0434\u0432\u0443\u0445 \u043c\u043e\u0434\u0443\u043b\u0435\u0439 \u0441 \u043e\u0434\u043d\u0438\u043c \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c-\u043a\u043e\u0434\u043e\u043c \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u0438\u0432\u0435\u0441\u0442\u0438 \u043a \u0437\u0430\u0446\u0438\u043a\u043b\u0438\u0432\u0430\u043d\u0438\u044e \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u2014 \u044d\u0442\u0438 \u0434\u0432\u0430 \u043c\u043e\u0434\u0443\u043b\u044f \u0431\u0443\u0434\u0443\u0442 \u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u043e \u043e\u0431\u043c\u0435\u043d\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f\u043c\u0438, \u043a\u0430\u043a \u0434\u0432\u0430 \u043f\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u0445 \u0434\u0440\u0443\u0433 \u043f\u0440\u043e\u0442\u0438\u0432 \u0434\u0440\u0443\u0433\u0430 \u0437\u0435\u0440\u043a\u0430\u043b\u0430. \u041a\u043e\u0440\u043e\u0447\u0435, \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c-\u043a\u043e\u0434 \u043d\u0443\u0436\u0435\u043d \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u043c\u043e\u0434\u0443\u043b\u0438 \u0438\u0433\u043d\u043e\u0440\u0438\u0440\u043e\u0432\u0430\u043b\u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0430\u0434\u0440\u0435\u0441\u043e\u0432\u0430\u043d\u044b \u043d\u0435 \u0438\u043c. \u041e\u0434\u043d\u0430\u043a\u043e \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0434\u0443\u043b\u0438 \u043c\u043e\u0433\u0443\u0442 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u0432\u0441\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u2014 \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043c\u043e\u0434\u0443\u043b\u0438 \u0442\u0438\u043f\u0430 \u00ab\u0438\u043d\u0442\u0435\u043b\u043b\u0435\u043a\u0442-\u044f\u0434\u0440\u043e\u00bb.<\/p>\n<p>  \u041a\u0430\u0436\u0434\u044b\u0439 \u043c\u043e\u0434\u0443\u043b\u044c, \u0438\u043c\u0435\u044e\u0449\u0438\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u044b \u0432\u0432\u043e\u0434\u0430, \u0432\u044b\u0432\u043e\u0434\u0430 \u0438\u043b\u0438 \u0432\u0432\u043e\u0434\u0430-\u0432\u044b\u0432\u043e\u0434\u0430 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u043c \u043f\u043e\u0442\u043e\u043a\u0435 \u041e\u041f. \u042d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u043e\u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u044c \u041e\u041f, \u0435\u0441\u043b\u0438 \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u043c\u043e\u0434\u0443\u043b\u044c \u0437\u0430\u0432\u0438\u0441\u043d\u0435\u0442 \u0438\u043b\u0438 \u043f\u0440\u043e\u0441\u0442\u043e \u00ab\u0437\u0430\u0434\u0443\u043c\u0430\u0435\u0442\u0441\u044f\u00bb. \u041e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u043c\u043e\u0434\u0443\u043b\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u043c \u0432 \u0440\u0443\u0447\u043d\u043e\u043c \u0440\u0435\u0436\u0438\u043c\u0435 \u0447\u0435\u0440\u0435\u0437 \u0438\u0445 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0435 \u043e\u043a\u043d\u0430. \u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u043a\u043b\u0430\u0441\u0441 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442 \u043f\u043e\u0442\u043e\u043a \u0432\u0432\u043e\u0434\u0430-\u0432\u044b\u0432\u043e\u0434\u0430:<\/p>\n<pre><code class=\"delphi\">  TIOThread = class(TThread)   public   const     SleepTime = 1000;   var     Module: TModule;     SelfID: Integer;     constructor Create(M: TModule; ID: Integer);   protected     procedure Execute; override;   end;<\/code><\/pre>\n<p>  \u0410 \u0432\u043e\u0442 \u043a\u0430\u043a \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0432\u0432\u043e\u0434\u0430-\u0432\u044b\u0432\u043e\u0434\u0430:<\/p>\n<pre><code class=\"delphi\">procedure TIOThread.Execute;   procedure GetData;   var     M: String;   begin     M := String(Module.GetData);     if M &lt;&gt; SCM_No_Message then       Synchronize(         procedure         begin           Pool.AddRecord(M, SelfID);         end);   end;    procedure SendData;   var     i: Integer;   begin     with Pool do       if not Empty then       begin         for i := 0 to Length(Records) - 1 do           with Records[i] do             if not ModuleGot[SelfID] and (AuthorID &lt;&gt; SelfID) then             begin               Module.SendData(PChar(Text));               ModuleGot[SelfID] := true;             end;         Synchronize(           procedure           begin             CheckAndDeleteOddRecords;           end);       end;   end;  begin   inherited;   while not Terminated do   begin     case Module.MType of       only_input:         GetData;       only_output:         SendData;       input_and_output:         begin           SendData;           GetData;         end;     end;     Sleep(SleepTime);   end; end;<\/code><\/pre>\n<p>  \u0414\u043b\u044f \u043e\u0431\u043c\u0435\u043d\u0430 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f\u043c\u0438 \u041e\u041f \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442 \u043f\u0443\u043b \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439. \u0412 \u043d\u0435\u0433\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u044e\u0442\u0441\u044f \u0432\u0441\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f, \u043f\u0440\u0438\u0448\u0435\u0434\u0448\u0438\u0435 \u0438\u0437 \u043e\u043a\u043d\u0430 \u0447\u0430\u0442\u0430 \u0438 \u0438\u0437 \u043c\u043e\u0434\u0443\u043b\u0435\u0439, \u0438 \u0445\u0440\u0430\u043d\u044f\u0442\u0441\u044f \u0434\u043e \u0442\u0435\u0445 \u043f\u043e\u0440, \u043f\u043e\u043a\u0430 \u0432\u0441\u0435 \u043c\u043e\u0434\u0443\u043b\u0438 \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u0442 \u044d\u0442\u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f, \u0437\u0430\u0442\u0435\u043c \u043e\u043d\u0438 \u0443\u0434\u0430\u043b\u044f\u044e\u0442\u0441\u044f. \u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u043a\u043b\u0430\u0441\u0441 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442 \u043f\u0443\u043b \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439:<\/p>\n<pre><code class=\"delphi\">  TPoolRecord = record     Text: String;     AuthorID: Integer;     ModuleGot: array of Boolean;   end;    TPool = class     Records: array of TPoolRecord;     Empty: Boolean;     procedure AddRecord(RecordText: String; RecordAuthor: Integer);     procedure CheckAndDeleteOddRecords;     constructor Create;     procedure Show;   end;  procedure TPool.AddRecord(RecordText: String; RecordAuthor: Integer); var   i, RL: Integer; begin   RL := Length(Records);   SetLength(Records, RL + 1);   with Records[RL] do   begin     Text := RecordText;     AuthorID := RecordAuthor;     SetLength(ModuleGot, OutputModulesCount);     for i := 0 to OutputModulesCount - 1 do       if i = AuthorID then         ModuleGot[i] := true       else         ModuleGot[i] := false;   end;   with MainForm, MainForm.ChatBox.Lines do     case RecordAuthor of       - 1:         Add(User.Name + ': ' + RecordText);     else       if RecordText = SCM_Dont_Know_Answer then       begin         if DontKnowCheckBtn.Checked then           Add(LanguageData[156]);       end       else         Add(AVirtual.Name + ': ' + RecordText);     end;   Empty := false; end;  procedure TPool.CheckAndDeleteOddRecords;   function ItsOdd(ID: Integer): Boolean;   var     i: Integer;   begin     ItsOdd := true;     with Records[ID] do       for i := 0 to Length(ModuleGot) - 1 do         if not ModuleGot[i] then         begin           ItsOdd := false;           exit;         end;   end;    procedure DeleteRecord(ID: Integer);   var     i: Integer;   begin     for i := ID to Length(Records) - 2 do       Records[i] := Records[i + 1];     SetLength(Records, Length(Records) - 1);   end;  var   i: Integer; begin   if not Empty then   begin     for i := Length(Records) - 1 downto 0 do       if ItsOdd(i) then         DeleteRecord(i);     if Length(Records) = 0 then       Empty := true;   end;   if MainForm.PoolShowBtn.Checked then     Show; end;<\/code><\/pre>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u043f\u043e\u0433\u043e\u0432\u043e\u0440\u0438\u043c \u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0445 \u043a\u043b\u0430\u0441\u0441\u0430\u0445 \u043c\u043e\u0434\u0443\u043b\u0435\u0439 \u0438 \u0438\u0445 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044f\u0445.<\/p>\n<p>  \u0421\u0430\u043c\u044b\u0439 \u0432\u0430\u0436\u043d\u044b\u0439, \u043a\u043b\u044e\u0447\u0435\u0432\u043e\u0439 \u043a\u043b\u0430\u0441\u0441 \u043c\u043e\u0434\u0443\u043b\u0435\u0439, \u0440\u0430\u0434\u0438 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0431\u044b\u043b\u0430 \u0437\u0430\u0434\u0443\u043c\u0430\u043d\u0430 \u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u0430 \u041f\u043e\u0434\u0440\u0443\u0436\u043a\u0430 \u2014 \u044d\u0442\u043e \u00ab\u0438\u043d\u0442\u0435\u043b\u043b\u0435\u043a\u0442-\u044f\u0434\u0440\u0430\u00bb (\u0418\u042f, \u0438\u043b\u0438 \u043f\u0440\u043e\u0441\u0442\u043e \u044f\u0434\u0440\u0430). \u042f\u0434\u0440\u043e \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u0432\u0441\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f, \u043f\u043e\u0441\u0442\u0443\u043f\u0430\u044e\u0449\u0438\u0435 \u0432 \u0447\u0430\u0442, \u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0438 \u0441 \u0437\u0430\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u043c \u0432 \u043d\u0435\u0433\u043e \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u043c. \u0422\u043e \u0435\u0441\u0442\u044c \u043e\u043d \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043e\u0441\u043d\u043e\u0432\u043d\u0443\u044e \u0438\u043d\u0442\u0435\u043b\u043b\u0435\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u0443\u044e \u0440\u0430\u0431\u043e\u0442\u0443. \u041a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0438 \u0435\u0433\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430 \u044f\u0434\u0440\u0430. \u041a\u0430\u043a \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0445\u043e\u0440\u043e\u0448\u0435\u0435 \u044f\u0434\u0440\u043e \u2014 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0439 \u0432\u043e\u043f\u0440\u043e\u0441, \u0438 \u044f \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u044e \u0435\u0433\u043e \u0432 \u0434\u0440\u0443\u0433\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u043c\u043e\u0435\u0439 \u0441\u0435\u0440\u0438\u0438 \u044f\u0434\u0435\u0440. \u0414\u0440\u0443\u0433\u043e\u0439 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0439 \u0432\u043e\u043f\u0440\u043e\u0441 \u2014 \u043a\u0430\u043a \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u044c \u044f\u0434\u0440\u043e \u043d\u0430 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0435 \u043c\u043e\u0434\u0443\u043b\u0438. \u0423 \u043c\u0435\u043d\u044f \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u043f\u043e\u0434\u0440\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u044c \u044f\u0434\u0440\u0430, \u043d\u0430\u0434 \u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u044f \u0441\u0435\u0439\u0447\u0430\u0441 \u0440\u0430\u0431\u043e\u0442\u0430\u044e. \u041d\u043e, \u0432 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0435, \u043d\u0438\u0447\u0442\u043e \u043d\u0435 \u043c\u0435\u0448\u0430\u0435\u0442 \u0432\u0430\u043c \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0441\u043e\u0441\u0442\u0430\u0432\u043d\u043e\u0435 \u044f\u0434\u0440\u043e.<\/p>\n<p>  \u0412\u0441\u0435 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u043c\u043e\u0434\u0443\u043b\u0438 \u0440\u0430\u0437\u0434\u0435\u043b\u044f\u044e\u0442\u0441\u044f \u043d\u0430 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0439: \u0440\u0435\u0446\u0435\u043f\u0442\u043e\u0440\u044b (\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u044e\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0432 \u0447\u0430\u0442 \u2014 \u043c\u043e\u0434\u0443\u043b\u044c \u0437\u0440\u0435\u043d\u0438\u044f, \u043c\u043e\u0434\u0443\u043b\u044c \u0441\u043b\u0443\u0445\u0430 \u0438 \u0442.\u043f.), \u044d\u0444\u0444\u0435\u043a\u0442\u043e\u0440\u044b (\u0441\u043e\u0432\u0435\u0440\u0448\u0430\u044e\u0442 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0432 \u043e\u0442\u0432\u0435\u0442 \u043d\u0430 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0438\u0437 \u0447\u0430\u0442\u0430), \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b (\u043d\u0435 \u043e\u0442\u043d\u043e\u0441\u044f\u0442\u0441\u044f \u043a \u0418\u0418 \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u043c \u0432\u0440\u0443\u0447\u043d\u0443\u044e), \u043f\u0430\u0440\u0441\u0435\u0440\u044b (\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u043e\u0431\u0443\u0447\u0430\u044e\u0449\u0438\u043c \u043c\u043e\u0434\u0443\u043b\u0435\u043c \u00abDream Fusion\u00bb) \u0438 \u0434\u0440\u0443\u0433\u0438\u0435 \u043c\u043e\u0434\u0443\u043b\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0433\u0443\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043a\u0430\u043a\u0438\u043c\u0438-\u0442\u043e \u043e\u0441\u043e\u0431\u044b\u043c\u0438 \u043c\u043e\u0434\u0443\u043b\u044f\u043c\u0438.<\/p>\n<p>  \u041d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0440\u0435\u0446\u0435\u043f\u0442\u043e\u0440\u044b \u0438 \u044d\u0444\u0444\u0435\u043a\u0442\u043e\u0440\u044b \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043a\u043e\u0434\u0438\u0440\u0443\u044e\u0442 \u0438 \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u0443\u044e\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f, \u0437\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0435 \u0432 \u0441\u0442\u0438\u043b\u0435 \u00ab\u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c-\u043a\u043e\u0434 + \u043a\u043e\u043c\u0430\u043d\u0434\u0430\u00bb. \u0422\u0430\u043a\u0438\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u043e\u0431\u044b\u0447\u043d\u043e \u043d\u0435 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044e. \u0421\u0443\u0442\u044c \u044d\u0442\u0438\u0445 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c: \u0440\u0435\u0446\u0435\u043f\u0442\u043e\u0440 \u0440\u0430\u0441\u043f\u043e\u0437\u043d\u0430\u0451\u0442 \u043d\u0435\u043a\u043e\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435, \u0441\u043e\u0432\u0435\u0440\u0448\u0451\u043d\u043d\u043e\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u043c, \u043a\u043e\u0434\u0438\u0440\u0443\u0435\u0442 \u0432 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u0435\u0433\u043e \u044f\u0434\u0440\u0443 \u043d\u0430 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435. \u041a\u043e\u0433\u0434\u0430 \u044f\u0434\u0440\u043e \u0432\u044b\u0434\u0430\u0441\u0442 \u044d\u0442\u043e \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u044d\u0444\u0444\u0435\u043a\u0442\u043e\u0440 \u0440\u0430\u0441\u043a\u043e\u0434\u0438\u0440\u0443\u0435\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435, \u043f\u043e\u043b\u0443\u0447\u0438\u0432 \u043a\u043e\u043c\u0430\u043d\u0434\u0443, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0443\u044e \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f, \u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442 \u044d\u0442\u043e \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435. \u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u044f\u0434\u0440\u0443 \u043d\u0435\u0442 \u0440\u0430\u0437\u043d\u0438\u0446\u044b, \u043a\u0430\u043a\u0438\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0437\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u0442\u044c \u0438 \u0432\u044b\u0434\u0430\u0432\u0430\u0442\u044c, \u0430 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u043a \u0441\u0438\u0441\u0442\u0435\u043c\u0435 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043b\u044e\u0431\u044b\u0435 \u0440\u0435\u0446\u0435\u043f\u0442\u043e\u0440\u044b \u0438 \u044d\u0444\u0444\u0435\u043a\u0442\u043e\u0440\u044b \u2014 \u0438\u043d\u0442\u0435\u043b\u043b\u0435\u043a\u0442 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0430\u043b\u044c\u043d\u044b\u043c, \u0442\u043e \u0435\u0441\u0442\u044c \u0435\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0443\u0447\u0438\u0442\u044c \u0447\u0435\u043c\u0443 \u0443\u0433\u043e\u0434\u043d\u043e. \u0417\u0434\u043e\u0440\u043e\u0432\u043e, \u043f\u0440\u0430\u0432\u0434\u0430?<\/p>\n<p>  \u0421\u043b\u0435\u0434\u0443\u0435\u0442 \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u044c, \u0447\u0442\u043e \u0434\u043b\u044f \u0443\u0434\u043e\u0431\u0441\u0442\u0432\u0430 \u0440\u043e\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0435 \u0440\u0435\u0446\u0435\u043f\u0442\u043e\u0440\u044b \u0438 \u044d\u0444\u0444\u0435\u043a\u0442\u043e\u0440\u044b \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u044b \u0432 \u043e\u0434\u043d\u043e\u043c \u043c\u043e\u0434\u0443\u043b\u0435. \u041f\u0440\u0438\u043c\u0435\u0440 \u2014 \u043a\u043b\u0430\u0441\u0441 \u043c\u043e\u0434\u0443\u043b\u0435\u0439 \u043f\u043e\u0434 \u043e\u0431\u0449\u0438\u043c \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435\u043c \u00ab\u044d\u043c\u043e\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u0430\u0432\u0430\u0442\u0430\u0440\u00bb (\u044f \u043d\u0430\u0437\u044b\u0432\u0430\u044e \u044d\u0442\u043e \u00ab\u044d\u043c\u043e\u0442\u0430\u0440\u00bb): \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442 \u0438\u0437 \u0447\u0430\u0441\u0442\u0435\u0439 \u043b\u0438\u0446\u043e, \u0432\u044b\u0440\u0430\u0436\u0430\u044e\u0449\u0435\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u0443\u044e \u044d\u043c\u043e\u0446\u0438\u044e, \u0438 \u043c\u043e\u0434\u0443\u043b\u044c \u0441\u043e\u0437\u0434\u0430\u0451\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435, \u043a\u043e\u0434\u0438\u0440\u0443\u044e\u0449\u0435\u0435 \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u0443\u044e \u044d\u043c\u043e\u0446\u0438\u044e, \u0442.\u0435. \u0434\u0435\u0439\u0441\u0442\u0432\u0443\u0435\u0442 \u043a\u0430\u043a \u0440\u0435\u0446\u0435\u043f\u0442\u043e\u0440; \u043a\u043e\u0433\u0434\u0430 \u044f\u0434\u0440\u043e \u0432\u044b\u0434\u0430\u0435\u0442 \u044d\u0442\u043e \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0432 \u0447\u0430\u0442, \u044d\u043c\u043e\u0442\u0430\u0440 \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u0443\u0435\u0442 \u0435\u0433\u043e \u0438 \u0432\u044b\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u0442 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u043b\u0438\u0446\u0430 \u0441 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0439 \u044d\u043c\u043e\u0446\u0438\u0435\u0439, \u0442.\u0435. \u0434\u0435\u0439\u0441\u0442\u0432\u0443\u0435\u0442 \u043a\u0430\u043a \u044d\u0444\u0444\u0435\u043a\u0442\u043e\u0440. \u0420\u0430\u0437\u0434\u0435\u043b\u044f\u0442\u044c \u044d\u043c\u043e\u0442\u0430\u0440 \u043d\u0430 \u0434\u0432\u0430 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0445 \u043c\u043e\u0434\u0443\u043b\u044f \u044f \u043d\u0435 \u0432\u0438\u0436\u0443 \u0441\u043c\u044b\u0441\u043b\u0430.<\/p>\n<p>  \u0412\u043e\u0442 \u043f\u0440\u0438\u043c\u0435\u0440 \u0448\u0430\u0431\u043b\u043e\u043d\u0430 \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043c\u043e\u0434\u0443\u043b\u044f \u043d\u0430 Delphi:<\/p>\n<pre><code class=\"delphi\">library \u0418\u043c\u044f\u041c\u043e\u0434\u0443\u043b\u044f;  uses   System.SysUtils,   System.Classes,   SystemControlMessagesUnit     in '..\\..\\AmigaVirtual\\SystemControlMessagesUnit.pas',   MainFormUnit in 'MainFormUnit.pas',  const   ControlCode = \u0442\u0440\u0438+\u043d\u0435\u043f\u0435\u0447\u0430\u0442\u043d\u044b\u0445+\u0441\u0438\u043c\u0432\u043e\u043b\u0430;   Name = ControlCode + '&gt;\u0418\u043c\u044f \u041c\u043e\u0434\u0443\u043b\u044f';   Help = '\u041c\u043d\u043e\u0433\u043e\u0441\u0442\u0440\u043e\u0447\u043d\u0430\u044f' + #13 + '\u0441\u043f\u0440\u0430\u0432\u043a\u0430';  var   FormState: (closed, opened);   Buffer, VirtualName: String;   NewMessageGot: Boolean;  function GetName: PChar; stdcall; begin   Result := PChar(Name); end;  function GetHelp: PChar; stdcall; begin   Result := PChar(Help); end;  procedure OpenWindow; stdcall; begin   if MainForm = nil then     MainForm := TMainForm.Create(nil);   MainForm.Show;   FormState := opened; end;  procedure CloseWindow; stdcall; begin   if FormState = opened then   begin     MainForm.Close;     FormState := closed;     MainForm.Release;     MainForm := nil;   end; end;  procedure SendData(Data: PChar); stdcall; begin   Buffer := Data; end;  function GetData: PChar; stdcall; begin   if NewMessageGot then   begin     Result := PChar(Buffer);     NewMessageGot := false;   end   else     Result := PChar(SCM_No_Message); end;  procedure Start; stdcall; begin   NewMessageGot := false;   if MainForm = nil then     MainForm := TMainForm.Create(nil); end;  procedure SetVirtual(Name: PChar); stdcall; begin   VirtualName := Name; end;  procedure LoadData; stdcall; begin   \/\/ \u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445 end;  procedure SaveData; stdcall; begin   \/\/ \u0421\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445 end;  exports GetName, GetHelp, OpenWindow, CloseWindow, SendData, GetData, Start,   SetVirtual, LoadData, SaveData;  begin end.<\/code><\/pre>\n<p>  \u041d\u0430 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u0435\u0441\u0442\u044c 21 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441:<\/p>\n<pre><code class=\"delphi\">    SetLanguage: function(Language: PChar): boolean; stdcall;     SendLanguageData: function(Data: array of PChar): boolean; stdcall;     GetName: function: PChar; stdcall;     GetHelp: function: PChar; stdcall;     Start: procedure; stdcall;     Sleep: function: boolean; stdcall;     WakeUp: procedure; stdcall;     OpenWindow: procedure; stdcall;     CloseWindow: procedure; stdcall;     SetVirtual: procedure(Name: PChar); stdcall;     SaveData: procedure; stdcall;     LoadData: procedure; stdcall;     Reset: procedure; stdcall;     SetNewMainWindow: procedure(Position, Size: TPoint); stdcall;     GetTimerInterval: function: Integer; stdcall;     SendData: procedure(Data: PChar); stdcall;     GetData: function: PChar; stdcall;     SetSource: procedure(SourcePath: PChar); stdcall;     NextData: function: PChar; stdcall;     Progress: function: Real; stdcall;     RestartParsing: procedure; stdcall;<\/code><\/pre>\n<p>  \u041c\u043e\u0434\u0443\u043b\u044c \u043c\u043e\u0436\u0435\u0442 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u044b\u0432\u0430\u0442\u044c \u043b\u044e\u0431\u043e\u0439 \u043d\u0430\u0431\u043e\u0440 \u0438\u0437 \u0432\u044b\u0448\u0435\u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u044b\u0445 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u0432.<\/p>\n<p>  \u042f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043b\u0438 \u0442\u0438\u043f\u0438\u0447\u043d\u044b\u0439 \u043c\u043e\u0434\u0443\u043b\u044c \u0438\u043d\u0442\u0435\u043b\u043b\u0435\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u043c \u0430\u0433\u0435\u043d\u0442\u043e\u043c? \u0417\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438. \u042f \u0432\u0438\u0436\u0443 \u0434\u0432\u0430 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0430 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438. \u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0438\u0445 \u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u043c\u043e\u0434\u0443\u043b\u044f \u0437\u0440\u0435\u043d\u0438\u044f. \u041f\u0435\u0440\u0432\u044b\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u2014 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u044b\u0439 \u0430\u0433\u0435\u043d\u0442: \u043e\u043d \u043a\u043e\u0434\u0438\u0440\u0443\u0435\u0442 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0438 \u043a\u0430\u043a \u0435\u0441\u0442\u044c, \u0442\u043e \u0435\u0441\u0442\u044c \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0438\u0440\u0443\u0435\u0442 \u0431\u0438\u0442\u043c\u0430\u043f\u044b \u0432 \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u0443\u044e \u0441\u0442\u0440\u043e\u043a\u0443. \u0412\u0442\u043e\u0440\u043e\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u2014 \u0441\u043b\u043e\u0436\u043d\u044b\u0439 \u0438\u043d\u0442\u0435\u043b\u043b\u0435\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0439 \u0430\u0433\u0435\u043d\u0442: \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0438\u0441\u043a\u0443\u0441\u0441\u0442\u0432\u0435\u043d\u043d\u0430\u044f \u043d\u0435\u0439\u0440\u043e\u043d\u043d\u0430\u044f \u0441\u0435\u0442\u044c, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0440\u0430\u0441\u043f\u043e\u0437\u043d\u0430\u0451\u0442 \u043d\u0430 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0430\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u0438 \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u0438\u0445 \u0441\u043b\u043e\u0432\u0430\u043c\u0438 \u0432 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0438. \u0415\u0441\u043b\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043c\u043e\u0434\u0443\u043b\u0435\u0439 \u0432\u0442\u043e\u0440\u043e\u0433\u043e \u0442\u0438\u043f\u0430, \u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0441\u043a\u0430\u0437\u0430\u0442\u044c, \u0447\u0442\u043e \u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0430\u043b\u044c\u043d\u044b\u0439 \u0418\u0418 \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d \u0438\u0437 \u043d\u0430\u0431\u043e\u0440\u0430 \u0441\u043b\u0430\u0431\u044b\u0445 \u0418\u0418. \u0421\u0438\u043b\u044c\u043d\u044b\u0439 \u044d\u0442\u043e \u0438\u043d\u0442\u0435\u043b\u043b\u0435\u043a\u0442 \u0438\u043b\u0438 \u043d\u0435\u0442 \u2014 \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u044f\u0434\u0440\u0430.<\/p>\n<p>  \u0410 \u0442\u0435\u043f\u0435\u0440\u044c \u043e \u0434\u0435\u0442\u0430\u043b\u044f\u0445 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b. \u0418\u0445 \u0442\u0440\u0438: \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u044f \u0431\u0430\u0437 \u0434\u0430\u043d\u043d\u044b\u0445 \u0418\u0418 \u043f\u043e \u0438\u043c\u0435\u043d\u0430\u043c, \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u0441\u043e \u0441\u0431\u043e\u0440\u043e\u043c \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0438 \u0438 \u00ab\u0426\u0435\u043d\u0442\u0440 \u041e\u0431\u043c\u0435\u043d\u0430\u00bb \u0434\u043b\u044f \u043e\u0431\u043c\u0435\u043d\u0430 \u043a\u043e\u043d\u0442\u0435\u043d\u0442\u043e\u043c.<\/p>\n<p>  \u0417\u043d\u0430\u0435\u0442\u0435 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0443 \u0447\u0430\u0442-\u0431\u043e\u0442\u043e\u0432 iii? \u041f\u043e \u0441\u0443\u0442\u0438, Amiga Virtual \u2014 \u044d\u0442\u043e \u0432\u043e \u043c\u043d\u043e\u0433\u043e \u0440\u0430\u0437 \u0431\u043e\u043b\u0435\u0435 \u043f\u0440\u043e\u0434\u0432\u0438\u043d\u0443\u0442\u0430\u044f \u0432\u0435\u0440\u0441\u0438\u044f iii. \u0422\u043e\u043b\u044c\u043a\u043e \u044f \u043d\u0430\u0437\u044b\u0432\u0430\u044e \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u044b \u0418\u0418 (\u043f\u043e\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445) \u043d\u0435 \u00ab\u0418\u043d\u0444\u0430\u043c\u0438\u00bb, \u0430 \u00ab\u0412\u0438\u0440\u0442\u0443\u0430\u043b\u0430\u043c\u0438\u00bb. \u041a\u0430\u0436\u0434\u044b\u0439 \u0412\u0438\u0440\u0442\u0443\u0430\u043b \u043e\u0431\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u043c \u0441 \u043d\u0443\u043b\u044f \u0438 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043b\u0435\u0433\u043a\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u043d \u043d\u0430 \u0434\u0440\u0443\u0433\u043e\u0439 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440. \u0410 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043c\u043e\u0434\u0443\u043b\u0435\u0439-\u0430\u0432\u0430\u0442\u0430\u0440\u043e\u0432 (\u0438\u043b\u0438 \u044d\u043c\u043e\u0442\u0430\u0440\u043e\u0432) \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0441\u043e\u0437\u0434\u0430\u043d \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u0432\u0438\u0437\u0443\u0430\u043b\u044c\u043d\u044b\u0439 \u043e\u0431\u0440\u0430\u0437 \u0412\u0438\u0440\u0442\u0443\u0430\u043b\u0430. \u0412\u043a\u043b\u0430\u0434\u043a\u0430 \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440\u0430 \u0412\u0438\u0440\u0442\u0443\u0430\u043b\u043e\u0432 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a:<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/586\/f3b\/40b\/586f3b40b02841d58f37fb0845289154.png\" alt=\"\u0441\u043a\u0440\u0438\u043d\u0448\u043e\u0442\" \/><\/div>\n<p>  \u0412\u044b\u0431\u043e\u0440 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0445 \u043c\u043e\u0434\u0443\u043b\u0435\u0439 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u0441 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u043e\u0439 \u043d\u0430 \u043a\u043e\u043b\u043b\u0438\u0437\u0438\u0438 \u043f\u043e \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c-\u043a\u043e\u0434\u0443:<\/p>\n<pre><code class=\"delphi\">type   CResult = (no_collision, collision);    function CheckModulesCollision: CResult;   var     i, j: Integer;     CC: String;   begin     Result := no_collision;     with ModulesList do       for i := 0 to Items.Count - 1 do         if Checked[i] then         begin           CC := FindModuleByFileName(ExtractDLLName(Items[i])).ControlCode;           for j := 0 to Items.Count - 1 do             if Checked[j] and (i &lt;&gt; j) and               (CC = FindModuleByFileName(ExtractDLLName(Items[j])).ControlCode)             then               Result := collision;         end;   end;<\/code><\/pre>\n<p>  <s>\u0414\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0437\u043d\u0430\u0442\u044c, \u043a\u0430\u043a \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f AV \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u043e\u043c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u0438 \u0432 \u043a\u0430\u043a\u043e\u043c \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0438 \u0440\u0430\u0437\u0432\u0438\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0435\u043a\u0442, \u044f \u0441\u043e\u0431\u0438\u0440\u0430\u044e \u0430\u043d\u043e\u043d\u0438\u043c\u043d\u0443\u044e \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0443.<\/s><br \/>  <i>\u041f\u043e\u043a\u0430 \u0441\u0431\u043e\u0440 \u0441\u0442\u0430\u0441\u0442\u0438\u0441\u0442\u0438\u043a\u0438 \u043d\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d.<\/i><\/p>\n<p>  \u0426\u0435\u043d\u0442\u0440 \u041e\u0431\u043c\u0435\u043d\u0430 (\u0426\u041e) \u2014 \u044d\u0442\u043e \u0441\u0435\u0440\u0432\u0438\u0441, \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0439 \u0438\u0437 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b, \u043f\u0440\u0435\u0434\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u043d\u044b\u0439 \u0434\u043b\u044f \u043e\u0431\u043c\u0435\u043d\u0430 \u043c\u043e\u0434\u0443\u043b\u044f\u043c\u0438, \u0412\u0438\u0440\u0442\u0443\u0430\u043b\u0430\u043c\u0438 \u0438 \u043f\u0440\u043e\u0447\u0438\u043c \u043a\u043e\u043d\u0442\u0435\u043d\u0442\u043e\u043c \u043c\u0435\u0436\u0434\u0443 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\u043c\u0438:<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/b3e\/c90\/e42\/b3ec90e42df34a7cb027c5a260b8663e.png\" alt=\"\u0441\u043a\u0440\u0438\u043d\u0448\u043e\u0442\" \/><\/div>\n<p>  \u0412\u043e\u0442 \u0442\u0430\u043a \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043e \u0441\u043a\u0430\u0447\u0438\u0432\u0430\u043d\u0438\u0435 \u043a\u043e\u043d\u0442\u0435\u043d\u0442\u0430:<\/p>\n<pre><code class=\"delphi\">procedure TMainForm.DownloadFilesButtonClick(Sender: TObject); var   Dir, FileName: String; begin   SetCurrentDir(ProgramPath);   Dir := Category[ContentCategoryBox.ItemIndex];   Dir := UpCase(Dir[1]) + Copy(Dir, 2, Length(Dir));   if not DirectoryExists(Dir) then     CreateDir(Dir);   SetCurrentDir(Dir);   FileName := ContentList.Items[ContentList.ItemIndex];   if FileExists(FileName) then     MessageDlg(LanguageData[172], mtInformation, [mbOk], 0)   else   begin     DownloadFile(SiteProtocol + OfficialWebsite + ExchangeCenterPage + '?c=' +       Category[ContentCategoryBox.ItemIndex] + '&f=' + FileName + '&l=' +       LanguageData[0], FileName);     \/\/ \u0412 LanguageData[0] \u0445\u0440\u0430\u043d\u0438\u0442\u0441\u044f \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u044f\u0437\u044b\u043a\u0430 \u0441\u0438\u0441\u0442\u0435\u043c\u044b     if Copy(FileName, Length(FileName) - 2, 3) = 'zip' then       UnzipFiles(FileName, GetCurrentDir);     case ContentCategoryBox.ItemIndex of       0:         UpdateModulesList;       1:         UpdateVirtualsList;     end;     SetStatusMessage(LanguageData[173] + ' ' + ProgramPath + Dir + '\\');   end; end;  procedure TMainForm.DownloadFile(From, SaveTo: String); var   LoadStream: TMemoryStream; begin   Downloading := true;   LoadStream := TMemoryStream.Create;   IdHTTP.Get(TIdURI.URLEncode(From), LoadStream);   LoadStream.SaveToFile(SaveTo);   LoadStream.Free;   Downloading := false;   SplashScreen.Close; end;<\/code><\/pre>\n<p>  \u0414\u043b\u044f \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u043a\u043e\u043d\u0442\u0435\u043d\u0442\u0430 \u0432 \u0426\u041e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u0430 \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u0430\u043a\u043a\u0430\u0443\u043d\u0442\u043e\u0432 (\u043f\u043e\u043a\u0430 \u043d\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442):<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/0a3\/bc5\/084\/0a3bc508443d46e7a7a052a57c5c17af.png\" alt=\"\u0441\u043a\u0440\u0438\u043d\u0448\u043e\u0442\" \/><\/div>\n<p>  \u041f\u043b\u0430\u043d\u0438\u0440\u0443\u044e \u0441\u043e\u0435\u0434\u0438\u043d\u0438\u0442\u044c \u0435\u0451 \u0441 \u0441\u0438\u0441\u0442\u0435\u043c\u043e\u0439 \u0430\u043a\u043a\u0430\u0443\u043d\u0442\u043e\u0432 \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0444\u043e\u0440\u0443\u043c\u0430, \u043d\u043e \u043f\u043e\u043a\u0430 \u043d\u0435 \u0437\u043d\u0430\u044e, \u043a\u0430\u043a.<\/p>\n<p>  \u0411\u0430\u0437\u043e\u0432\u044b\u0439 \u0434\u043e\u0441\u0442\u0443\u043f (\u0442\u043e\u043b\u044c\u043a\u043e \u0441\u043a\u0430\u0447\u0438\u0432\u0430\u043d\u0438\u0435) \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0432 \u0433\u043e\u0441\u0442\u0435\u0432\u043e\u043c \u0430\u043a\u043a\u0430\u0443\u043d\u0442\u0435, \u0430 \u0434\u043b\u044f \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0441\u0432\u043e\u0435\u0433\u043e \u043a\u043e\u043d\u0442\u0435\u043d\u0442\u0430 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f (\u043f\u043e\u043a\u0430 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u043a\u043e\u043d\u0442\u0435\u043d\u0442\u0430 \u043d\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d, \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u044e \u0432\u0440\u0443\u0447\u043d\u0443\u044e \u043f\u043e FTP).<\/p>\n<p>  \u041a\u0440\u043e\u043c\u0435 \u0426\u041e \u0442\u0430\u043a\u0436\u0435 \u0435\u0441\u0442\u044c \u0444\u043e\u0440\u0443\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u0435\u0442 \u0442\u0435\u0445\u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0443 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u2014 \u043e\u043d \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0432\u043e \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u043e\u043c \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0435 (\u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 \u0434\u043b\u044f Delphi \u2014 \u0432\u0440\u043e\u0434\u0435 \u0431\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u044f\u0434\u0440\u043e Trident, \u043d\u043e \u043c\u043d\u0435 \u043c\u043d\u043e\u0433\u043e\u0433\u043e \u0438 \u043d\u0435 \u043d\u0443\u0436\u043d\u043e, \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u0443\u044e \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443; \u0441\u0430\u043c \u0444\u043e\u0440\u0443\u043c \u043d\u0430 phpBB):<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/ab2\/148\/f55\/ab2148f551824fcc9fec88c813fd509e.png\" alt=\"\u0441\u043a\u0440\u0438\u043d\u0448\u043e\u0442\" \/><\/div>\n<p>  \u041a\u0430\u043a \u0432\u0438\u0434\u043d\u043e \u0438\u0437 \u0441\u043a\u0440\u0438\u043d\u0448\u043e\u0442\u0430, \u043c\u043e\u0436\u043d\u043e \u0432\u0432\u0435\u0441\u0442\u0438 \u0441\u0432\u043e\u0439 \u0430\u0434\u0440\u0435\u0441 \u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443 \u0432 \u0437\u0430\u043a\u043b\u0430\u0434\u043a\u0438 (\u0437\u0430\u043a\u043b\u0430\u0434\u043a\u0438 \u043f\u043e\u043a\u0430 \u043d\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u044b) \u2014 \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u043f\u043e\u0442\u0435\u0440\u044f\u0442\u044c \u043e\u0431\u0441\u0443\u0436\u0434\u0435\u043d\u0438\u0435 \u043d\u0430 \u0444\u043e\u0440\u0443\u043c\u0435.<\/p>\n<p>  \u0415\u0449\u0451 \u043e\u0434\u0438\u043d \u043c\u043e\u043c\u0435\u043d\u0442. \u0417\u0430\u043c\u0435\u0442\u0438\u043b\u0438 \u0432 \u043a\u043e\u0434\u0435 \u0432\u044b\u0448\u0435 LanguageData? \u042d\u0442\u043e \u043c\u0430\u0441\u0441\u0438\u0432, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0445\u0440\u0430\u043d\u044f\u0442\u0441\u044f \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u0435 \u0441\u0442\u0440\u043e\u043a\u0438 \u0434\u043b\u044f \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432 GUI, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u043e\u043c\u0443 \u044f\u0437\u044b\u043a\u0443. \u0420\u0443\u0441\u0441\u043a\u0438\u0439 \u0438 \u0430\u043d\u0433\u043b\u0438\u0439\u0441\u043a\u0438\u0439 \u0443\u043f\u0430\u043a\u043e\u0432\u0430\u043d\u044b \u0432 .exe \u043a\u0430\u043a \u0440\u0435\u0441\u0443\u0440\u0441\u044b, \u0438 \u043f\u0440\u0438 \u0441\u0442\u0430\u0440\u0442\u0435 \u0440\u0430\u0441\u043f\u0430\u043a\u043e\u0432\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u0432 \u043f\u0430\u043f\u043a\u0443 Languages. \u0424\u0430\u0439\u043b\u044b \u0441 \u0434\u0440\u0443\u0433\u0438\u043c\u0438 \u044f\u0437\u044b\u043a\u0430\u043c\u0438 \u043c\u043e\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u0441\u043a\u0430\u0447\u0430\u0442\u044c \u0447\u0435\u0440\u0435\u0437 \u0426\u0435\u043d\u0442\u0440 \u041e\u0431\u043c\u0435\u043d\u0430. \u0422.\u043a. Delphi \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u042e\u043d\u0438\u043a\u043e\u0434, \u044f\u0437\u044b\u043a \u043c\u043e\u0436\u043d\u043e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043a\u0430\u043a\u043e\u0439 \u0443\u0433\u043e\u0434\u043d\u043e \u2014 \u044f\u043f\u043e\u043d\u0441\u043a\u0438\u0439 \u0438\u043b\u0438 \u0430\u0440\u0430\u0431\u0441\u043a\u0438\u0439, \u043a \u043f\u0440\u0438\u043c\u0435\u0440\u0443.<\/p>\n<p>  \u0412\u043e\u0442 \u0442\u0430\u043a \u044f\u0437\u044b\u043a\u043e\u0432\u044b\u0435 \u0444\u0430\u0439\u043b\u044b \u0432\u044b\u0433\u0440\u0443\u0436\u0430\u044e\u0442\u0441\u044f \u0438\u0437 .exe:<\/p>\n<pre><code class=\"delphi\">procedure TMainForm.DeployDefaultLanguages;   procedure DeployLanguage(LanguageName: String);   var     ResHandle, MemHandle: THandle;     MemStream: TMemoryStream;     ResPtr: PByte;     ResSize: Longint;     ResName: String;     i: Integer;   begin     ResName := '';     for i := 1 to Length(LanguageName) do       ResName := ResName + UpCase(LanguageName[i]);     ResName := ResName + '_LP';     ResHandle := FindResource(HInstance, PWideChar(ResName), RT_RCDATA);     if ResHandle = 0 then     begin       ShowMessage('Default language &quot;' + LanguageName + '&quot; not found. (' +         ResName + ')');       exit;     end;     MemHandle := LoadResource(HInstance, ResHandle);     ResPtr := LockResource(MemHandle);     MemStream := TMemoryStream.Create;     ResSize := SizeOfResource(HInstance, ResHandle);     MemStream.SetSize(ResSize);     MemStream.Write(ResPtr^, ResSize);     MemStream.Seek(0, 0);     MemStream.SaveToFile(LangFilesDir + '\/' + LanguageName +       LanguageFileExtension);     FreeResource(MemHandle);     MemStream.Destroy;   end;  begin   if not DirectoryExists(LangFilesDir) then     CreateDir(LangFilesDir);   DeployLanguage('Russian');   DeployLanguage('English'); end;<\/code><\/pre>\n<p>  \u041a\u0430\u043a \u0432\u0438\u0434\u043d\u043e, \u0447\u0442\u043e\u0431\u044b \u0432\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u043d\u043e\u0432\u044b\u0439 \u043f\u0440\u0435\u0434\u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u044b\u0439 \u044f\u0437\u044b\u043a, \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0432\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0444\u0430\u0439\u043b \u044f\u0437\u044b\u043a\u0430 \u0432 \u0444\u0430\u0439\u043b \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432, \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0441\u0442\u0440\u043e\u0447\u043a\u0443 \u0432\u0438\u0434\u0430 DeployLanguage(&#8216;\u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435\u042f\u0437\u044b\u043a\u0430&#8217;) \u0438 \u043f\u0435\u0440\u0435\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0435\u043a\u0442 \u2014 \u0443\u0434\u043e\u0431\u043d\u043e.<\/p>\n<p>  \u0412\u043e\u0442 \u0442\u0430\u043a \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u0442\u0441\u044f \u044f\u0437\u044b\u043a:<\/p>\n<pre><code class=\"delphi\">procedure TMainForm.ChangeLanguageTo;   function LanguageDataLoaded: Boolean;   var     T: TextFile;     B: RawByteString;   begin     SetCurrentDir(ProgramPath + LangFilesDir);     if FileExists(Language + LanguageFileExtension) then     begin       AssignFile(T, Language + LanguageFileExtension);       Reset(T);       SetLength(LanguageData, 1);       LanguageData[0] := Language;       while not eof(T) do       begin         SetLength(LanguageData, Length(LanguageData) + 1);         ReadLn(T, B);         LanguageData[Length(LanguageData) - 1] := UTF8ToWideString(B);       end;       CloseFile(T);       if Length(LanguageData) - 1 &gt;= LangFileMinSize then         Result := true       else         Result := false;     end     else       Result := false;   end;    procedure SetCaptions;   begin     with HelpForm do     begin       LoadHelpTexts;       if CurrentTopic &lt; HelpLast then         OpenTopic(CurrentTopic)       else         OpenTopic(0);     end;     AddModulesHelpToMainProgramHelp;     ChangeModulesLanguageToProgramLanguage;      AuthorizationTab.Caption := LanguageData[18];     \/\/ \u043c\u043d\u043e\u0433\u043e-\u043c\u043d\u043e\u0433\u043e \u0441\u0442\u0440\u043e\u043a...     CloudSaveNow.Caption := LanguageData[181];     CloudLoadNow.Caption := LanguageData[182];   end;    procedure CheckMenuItem;   var     Item: TMenuItem;   begin     for Item in LanguageMenu.Items do       if Item.Name = LanguageData[0] + 'Lang' then         Item.Checked := true;   end;  begin   if LanguageDataLoaded then   begin     if not Silent then       SetStatusMessage(LanguageData[2] + ' ' + LanguageData[0])     else       FormCaption.Caption := LanguageData[1];     SetCaptions;   end   else   begin     if Language &lt;&gt; SavedLanguage then       ChangeLanguageTo(SavedLanguage)     else       ChangeLanguageTo(DefaultLanguage);     MessageDlg(LanguageData[3] + #13 + LanguageData[2] + ' ' + LanguageData[0] +       '.', mtError, [mbOk], 0);   end;   CheckMenuItem; end;<\/code><\/pre>\n<p>  \u0410 \u0435\u0449\u0451 \u0435\u0441\u0442\u044c \u043e\u043a\u043d\u043e \u0441\u043e \u0441\u043f\u0440\u0430\u0432\u043a\u043e\u0439:<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/4ce\/16c\/ff4\/4ce16cff44b7422e8a115193eeee9899.png\" alt=\"\u0441\u043a\u0440\u0438\u043d\u0448\u043e\u0442\" \/><\/div>\n<p>  \u0412 \u043d\u0435\u0433\u043e \u0436\u0435 \u0447\u0435\u0440\u0435\u0437 \u0433\u043b\u0430\u0432\u043d\u043e\u0435 \u043c\u0435\u043d\u044e \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u0432\u0435\u0441\u0442\u0438 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u043c\u043e\u0434\u0443\u043b\u0435:<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/9f8\/1d7\/5ad\/9f81d75ad8c148d6981f315b542c8f54.png\" alt=\"\u0441\u043a\u0440\u0438\u043d\u0448\u043e\u0442\" \/><\/div>\n<p>  \u0415\u0449\u0451 \u043e\u0434\u0438\u043d \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0439 \u0442\u0440\u044e\u043a \u2014 \u0441\u0430\u043c\u043e\u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b, \u0441\u0434\u0435\u043b\u0430\u043d\u043e \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e .bat-\u0441\u043a\u0440\u0438\u043f\u0442\u0430:<\/p>\n<pre><code class=\"delphi\">procedure TMainForm.UpdateProgram;   procedure DeployBAT;   var     bat: TextFile;   begin     if not FileExists(ProgramPath + 'update.bat') then     begin       AssignFile(bat, ProgramPath + 'update.bat');       Rewrite(bat);       WriteLn(bat, 'taskkill \/im av.exe');       WriteLn(bat, 'sleep 1'); \/\/ Windows XP       WriteLn(bat, 'timeout \/t 1 \/nobreak'); \/\/ Windows 7+       WriteLn(bat, 'del av.exe');       WriteLn(bat, 'move ' + ZipsDir + '\\av.exe %1');       WriteLn(bat, 'del \/S \/Q ' + ZipsDir);       WriteLn(bat, 'start av.exe');       \/\/ WriteLn(bat, 'pause');       CloseFile(bat);     end;   end;  begin   DownloadFile(SiteProtocol + OfficialWebsite + '\/av.zip',     ProgramPath + 'av.zip');   UnzipFiles(ProgramPath + 'av.zip', ProgramPath + ZipsDir);   DeployBAT;   SetCurrentDir(ProgramPath);   ShellExecute(Handle, nil, 'update.bat', PChar(ProgramPath), nil, SW_SHOW); end;<\/code><\/pre>\n<p>  \u041d\u0430\u043f\u043e\u0441\u043b\u0435\u0434\u043e\u043a \u0445\u043e\u0447\u0443 \u0437\u0430\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u043f\u0440\u043e\u0435\u043a\u0442 Amiga Virtual \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0432 \u0441\u0435\u0431\u044f \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e Windows-\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443. \u041a\u0440\u043e\u043c\u0435 \u043d\u0435\u0451 \u043f\u043b\u0430\u043d\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0434\u043b\u044f Android (AV Mobile), \u0440\u043e\u0431\u043e\u0442\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c (AV OS) \u0438 \u0441\u0443\u043f\u0435\u0440\u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u043e\u0432 (AV Super). \u0410 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b \u0438\u043d\u0442\u0435\u043b\u043b\u0435\u043a\u0442-\u044f\u0434\u0435\u0440 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u044b \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0438\u043d\u0442\u0435\u043b\u043b\u0435\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u043e\u0438\u0441\u043a\u043e\u0432\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b (\u0440\u0435\u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0443\u044e\u0449\u0435\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u043f\u043e\u0438\u0441\u043a\u0430 \u042f\u043d\u0434\u0435\u043a\u0441\u0430 \u0438 Google). \u041a\u043e\u0433\u0434\u0430 \u0431\u0443\u0434\u0435\u0442 \u0433\u043e\u0442\u043e\u0432\u0430 \u0430\u043b\u044c\u0444\u0430 \u0432\u0435\u0440\u0441\u0438\u044f \u043f\u043e \u043a\u0430\u043a\u043e\u043c\u0443-\u0442\u043e \u0438\u0437 \u044d\u0442\u0438\u0445 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0439, \u044f \u043d\u0430\u043f\u0438\u0448\u0443 \u0441\u0442\u0430\u0442\u044c\u044e \u0441 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435\u043c \u0435\u0451 \u0440\u0430\u0431\u043e\u0442\u044b.<\/p>\n<p>  \u0418\u0441\u0445\u043e\u0434\u043d\u044b\u0435 \u043a\u043e\u0434\u044b \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0438 \u0434\u0438\u0437\u0430\u0439\u043d-\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442 \u043c\u043e\u0436\u043d\u043e \u0441\u043a\u0430\u0447\u0430\u0442\u044c \u0437\u0434\u0435\u0441\u044c: <a href=\"https:\/\/github.com\/TimKruz\/AV\">github.com\/TimKruz\/AV<\/a><\/p>\n<p>  \u0421\u043f\u0430\u0441\u0438\u0431\u043e \u0437\u0430 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435.<br \/> \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:\/\/habrahabr.ru\/post\/316830\/\"> https:\/\/habrahabr.ru\/post\/316830\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/6b8\/18f\/335\/6b818f335ba64ae49c378b707b118cbe.png\" alt=\"\u041b\u043e\u0433\u043e\u0442\u0438\u043f\" align=\"left\" width=\"300\"\/> \u041f\u0440\u0438\u0432\u0435\u0442 \u0432\u0441\u0435\u043c \u043b\u044e\u0431\u0438\u0442\u0435\u043b\u044f\u043c \u0438 \u0438\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044f\u043c \u0438\u0441\u043a\u0443\u0441\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u0438\u043d\u0442\u0435\u043b\u043b\u0435\u043a\u0442\u0430! \u0412 \u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u0445\u043e\u0442\u0435\u043b \u0431\u044b \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c \u043e\u0431 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0435: \u043c\u043e\u0434\u0443\u043b\u044c\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 \u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0438\u0441\u043a\u0443\u0441\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u0438\u043d\u0442\u0435\u043b\u043b\u0435\u043a\u0442\u0430 (\u041c\u0421\u0423\u0418\u0418) \u00abAmiga Virtual\u00bb (AV, \u00ab\u0412\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u0430\u044f \u041f\u043e\u0434\u0440\u0443\u0436\u043a\u0430\u00bb). \u042f \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443 \u043e\u0431 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0445 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0430\u0445 \u0435\u0451 \u0440\u0430\u0431\u043e\u0442\u044b \u0438 \u043e\u043f\u0438\u0448\u0443 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0434\u0435\u0442\u0430\u043b\u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438, \u0430 \u0441\u0430\u043c\u044b\u0435 \u043b\u044e\u0431\u043e\u043f\u044b\u0442\u043d\u044b\u0435 \u0441\u043c\u043e\u0433\u0443\u0442 \u0438\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u044c \u0432\u0441\u0435 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0435 \u043a\u043e\u0434\u044b. \u0420\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0432\u0435\u0434\u0451\u0442\u0441\u044f \u043d\u0430 Delphi, \u043d\u043e \u043c\u043e\u0434\u0443\u043b\u0438 \u0442\u0435\u043e\u0440\u0435\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u044b \u043d\u0430 \u043b\u044e\u0431\u043e\u043c \u042f\u041f. \u0414\u0430\u043d\u043d\u0430\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u0431\u0443\u0434\u0435\u0442 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u0430 \u043a\u0430\u043a \u043a\u043e\u043d\u0435\u0447\u043d\u044b\u043c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\u043c \u0447\u0430\u0442-\u0431\u043e\u0442\u043e\u0432 \u0438 \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0445 \u0441 \u043d\u0438\u043c\u0438 \u0441\u0438\u0441\u0442\u0435\u043c, \u0442\u0430\u043a \u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430\u043c \u0418\u0418 \u2014 \u0432\u0435\u0434\u044c \u043d\u0430 \u0435\u0451 \u043e\u0441\u043d\u043e\u0432\u0435 \u043c\u043e\u0436\u043d\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043b\u044e\u0431\u043e\u0439 \u0442\u0438\u043f \u0418\u0418.  <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-281978","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/281978","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=281978"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/281978\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=281978"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=281978"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=281978"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}