Что же такое FireMonkey? FireMonkey. Начало

Вышедшая в сентябре прошлого Delphi XE2 содержит рекордное количество нововведений.
Краткие обзоры возможностей Delphi XE2 уже публиковались на Хабре. Но, очевидно, самым ярким новшеством стала платформа FireMonkey, и здесь я хотел бы уделить немного внимания именно ей.
Я сделал небольшую подборку ссылок на материалы, которые, как я надеюсь, помогут вам составить более-менее адекватное представление об этой платформе. Но прежде, для тех, кто не в курсе, я вкратце расскажу, что же такое FireMonkey.
Embarcadero Technologies позиционирует FireMonkey как платформу для создания полнофункциональных бизнес-приложений для Windows, Mac и iOS. При этом данная платформа является нативной для каждой из ОС, т.е. при работе приложения, созданного с помощью FireMonkey, не используется ни каких дополнительных надстроек.
FireMonkey привязывается непосредственно к нативной (с точки зрения ОС) графической библиотеке, такой как OpenGL или DirectX. Таким образом, предлагается наилучшее решение с точки зрения GPU.
Ядро FireMonkey архитектуры представляет собой мощную библиотеку классов (в том числе визуальных компонентов).
Целевая платформа выбирается в процессе компиляции.
Первая версия FireMonkey поддерживает только Win32, Win64, MacOSX и iOS, в будущем Embarcadero планирует портировать её на несколько других платформ.

Что стоит учитывать?

Несмотря на то, что платформа FireMonkey предоставляет обширный инструментарий для разработки 3D приложений, ее нельзя рассматривать как игровой движок. FireMonkey позиционируется именно как платформа для разработки бизнес-приложений.
Сейчас продукт находится в начальной стадии своей эволюции. И многие функциональные возможности FireMonkey претерпевают изменения, как качественные, так и количественные.

Я надеюсь, что ссылки, приведенные ниже, помогут разобраться с основными возможностями новой платформы.
Официальная страница продукта на сайте Embarcadero (рус.)

Среди англоязычного материала хотелось бы выделить серию (англ.)

Что посмотреть?

Что касается последней версии Delphi, то видеоматериала, посвященного возможностям продукта и приемам работы с ним, как никогда много. Как официального, от Embarcadero, так и от независимых разработчиков. На YouTube очень много видео о FireMonkey, вы просто можете воспользоваться поиском. Среди этого обилия материала выделю серию из трех роликов от Марко Канту - RAD in Action landing page ., таким образом, придав своим изысканиям вектор полезности.

FireMonkey — это центральная технология «нового Delphi». Расскажите, пожалуйста, о целях, возможностях и технических аспектах устройства этой принципиально новой библиотеки. По истечении времени, оглядываясь назад, насколько тяжелым и оправданным оказался ваш отказ от дальнейшего развития сверхпопулярной VCL?

Была выбрана в качестве магистрального направления развития технологии Delphi для достижения конкретной цели — мульти-платформенной разработки из одной среды, на основе единой базы исходных кодов, причем без необходимости в кардинальной переподготовки разработчиков. В рамках ставшей классической и сверхпопулярной VCL это было невозможно, её связь с WinAPI была слишком тесной, можно сказать, «на генетическом уровне».

Компоненты VCL не имели «абстрактной» прослойки между функциональным уровнем с точки зрения интерфейса и механизмами их отображения. Функциональный уровень — то, как вёдет себя как элемент управления, на какие события реагирует, какое взаимодействие с пользователем обеспечивает. Отображение — вызов платформенно-ориентированных методов визуализации как некого изображения, сформированного растровыми объектами и векторными примитивами. FireMonkey изначально реализовывала принцип строгого разделения элемента управления на две составляющие: «поведенческую» и «визуальную».


Всеволод Леонов, Embarcadero Technologies

Первая в целом повторят даже не основы VCL, а суть объектно-ориентированного программирования. Компонент есть класс, классы компонентов образуют иерархию, где можно выделить семейства и модули. Класс компонента слабо связан с тем, как он изображается.

Визуальная «картинка» формируется динамически, она не прописана жёстко в классе компонента. Изображение или «стиль» в FireMonkey загружается в компонент при запуске приложения. Мы имеем некий функциональный каркас для компонента, а «обшивка» или «облицовка» может быть изменена, но зачем? Именно затем, чтобы приложения FireMonkey смотрелись аутентично на любой платформе — Windows 7, Windows 8, Mac OS, iOS и, в ближайшем будущем, в Android. Этого традиционная монолитная классовая структура VCL обеспечить не могла.

Здесь особую роль играет технологичность подхода. Принципиально можно взять библиотеку VCL и «нафаршировать» WinAPI и всеми другими возможными платформенными вызовами. На очень ограниченном подмножестве компонентов это ещё можно сделать, но VCL содержит несколько сотен компонентов, поэтому такой подход мог бы просто «убить» VCL. Было принято решение «не трогать» VCL, а новые возможности развивать на новой платформе — FireMonkey. Данная технология даже обладает определённым техническим изяществом — в момент сборки проекта под конкретную платформу среда Delphi IDE подключает нужный компилятор, а компоненты интерфейса получают платформенный стиль.

Для пользователя это — один щелчок мыши и то же исходный код, для Delphi, — многолетний упорный труд разработчиков по созданию подобной мульти-платформенной библиотеки.

Когда стало ясно, что FireMonkey будет введена отдельной новой платформой, нужно было выбрать правильную стратегию сосуществования: Embarcadero не хотела никоим образом оказать негативное влияние на пользователей VCL. Поэтому мы выбрали следующий план: VCL остаётся идеологически и архитектурно стабильной для обеспечения максимально возможной совместимости, облегчая миграцию проектов на современные версии. Развитие FireMonkey будет идти естественным и параллельным путём, без «оглядки» на VCL.

Слабым местом такого решения является достаточно проблематичная миграция с VCL на FireMonkey в рамках одного проекта. Но зато для нового проекта разработчик может выбрать FireMonkey для обеспечения мульти-платформенности своего результирующего приложения. После релиза XE4 с поддержкой iOS мы уже можем говорить о ярких конкурентоспособных преимуществах Delphi для начала мобильной разработки в корпоративной среде, которые буду увеличены после реализации планируемой поддержки Android.

Поэтому как такового явного «отказа» от развития VCL нет. В новых версиях VCL-часть Delphi также развивается. Это и поддержка 64-bit, и введение стилизации для визуальных компонентов, и реализация механизма гибких динамических связей или «байндинга», и включение библиотеки FireDAC для работы с базами данных в VCL-проектах. Просто на фоне гигантского качественного скачка за счёт FireMonkey прогресс в VCL выглядит несколько непроявленным. Но, как бы то ни было, VCL — неотъемлемая часть Delphi и останется таковой ещё на долгие годы. Хотя эволюция платформ и современное положение дел в области ОС для настольных систем и мобильных устройств таковы, что будущее однозначно за FireMonkey.

В интервью мы уже обсудили поддержку iOS, давайте расскажем нашим читателям о поддержке других новейших технологий со стороны последней RAD Studio XE4, например, таких как Windows 8 и WinRT, 64-битных систем, MacOS и так далее. Можно перечислить, что вы ещё можете предложить современному избалованному новшествами программисту?

Скорее всего, современный программист не «избалован» новшествами. Для крупных проектов любое «новшество» зачастую оборачивается гигантским объемом работ.

Например, все долго ждали , многие тут же бросились переводить свои коды на новую платформу. Но выясняется, что даже весьма профессиональные команды к этому не готовы. Компилируемый 64-битный код не означает работоспособный. Стали всплывать «грехи молодости», например, использование инструкций в предположении о 4-байтном размере адреса. Отсутствие культуры проведения тестов, вкупе с технологической неготовностью в сжатые сроки внедрить данный процесс.

И тут — чем больше проект, измеряемый, допустим, количеством строк исходного кода, тем аккуратней и взвешенней относятся программисты к различного рода нововведениям в диапазоне от внешнего вида «кнопки» в интерфейсе до «синтаксического сахара» в компиляторе.

Одним из таких «проблематичных» достижений явился выход Windows 8. Лично у меня, как пользователя ПК, и просто современного IT-специалиста — Windows 8 вызывает восторг. Но для разработчиков, которым прислали партию компьютеров под Windows 8 с ТЗ на разработку под новую ОС в нагрузку, это означает определенные сложности.

Мы постарались максимально комфортно и безболезненно обеспечить поддержку разработки под новый интерфейс этой ОС. Поэтому и для VCL, и для FireMonkey введены специальные стили, а программист может либо перестроить интерфейс приложения, либо создать заново приложение, которое будет неотличимо от «родного» для Windows 8 по внешнему виду. Конечно, есть потребность в «нативной» поддержке Windows 8 за счёт WinRT. Но здесь сказывается приоретизация целей в современных условиях. Mac OS, iOS, Android в ближайших планах не дают пока возможности говорить о полноценной поддержке WinRT в ближайшем будущем.

Стратегической целью Embarcadero, конечно, является мульти-платформенность. Релиз RAD Studio XE4 явился ключевым, прежде всего из-за поддержки iOS. Действующий программист, использующий VCL, может в считанные часы начать разработку под iOS. Даже простое мобильное приложение может быть мгновенно преобразовано в мощный проект, работающий в рамках сложившейся инфраструктуры. Не надо думать, что это просто новый компилятор к FireMonkey и новый стиль для обеспечения соответствия интерфейсу iOS.

Это и новый визуальный дизайнер, и встроенная поддержка различных форм-факторов, и библиотеки доступа к данным, включая новую FireDAC, и технология LiveBindings для гибкого и динамического связывания с корпоративными данными. Все эти нововведения поступают синхронно — и для Windows, и для Mac OS, и для iOS. Операционная система Mac OS развивается не так стремительно, поэтому таких проблем, как переход Windows 7 — Windows 8 там нет. Но появились дисплеи Retina, и это потребовало отдельного внимания. Сейчас любое MacOS-приложение, созданное в Delphi XE4, автоматически включает в себя два стиля — «обычный» и «высокочёткий».

Т.о. одно и то же приложение может иметь одинаково качественный «нативный» интерфейс на любом настольном компьютере от Apple.

Компания Embarcadero своими новыми инновационными релизами не хочет «удивить», «поразить» или даже «развлечь» разработчиков. Скорее, наоборот, IT-сфера и так уже полна различных сюрпризов: новые устройства, новые платформы, новые пользователи, новые их потребности, новые сценарии взаимодействия. Добавьте сюда ещё и новые технологии разработки ПО, и программистам просто не останется времени на создание новых систем и на существующих — они будут только и делать, что проводить миграцию из одной среды в другую, со старой библиотеки на новую, с одного языка на другой.

Но мы и не исповедуем отказ от всего нового. Мы лишь хотим обеспечить преемственность всего — кода, интерфейса, проекта, даже профессиональных навыков при появлении новых платформ и устройств. Можно сказать, что мы боремся с нездоровым консерватизмом в отношении новых платформ за счёт здорового консерватизма в средствах разработки. Не ждите от Embarcadero экзотических продуктов, нестандартных языков программирования и диковинных средств разработки.

У нас вы всегда найдёте — визуальную разработку, классические языки, «нативный» код, и пусть новыми будут целевые платформы для ваших приложений, созданных всё тем же проверенным классическим способом.

Что же такое FireMonkey?


FireMonkey (FMX) — фреймворк для кроссплатформенной разработки как для настольных систем (Windows, Mac OS + в ближайшем будущем планируется поддержка серверной части на Linux), так и мобильных (iOS и Android) с использованием языка Delphi/C++.

Особенности:

  • единая кодовая база для всех платформ;

  • любой контролл (визуальный компонент) может быть контейнером (родителем) для других компонентов;

  • наличие очень продвинутого относительного расположения (20 типов) компонентов на форме;

  • LiveBinding позволяет подключать любые типы данных или информации к любому пользовательскому интерфейсу или графическим объектам;

  • наличие стилей формы/компонентов;

  • Multi-Device Preview позволяет настроить визуальное представление для каждой из платформ;

  • FireUI Live Preview -— отображение вида приложения на реальных устройствах в режиме реального времени.

Возможности:

  • использование нативного API каждой из платформ, также возможность вызов сторонних родных библиотек;

  • взаимодействие со всеми датчиками (GPS, Accelerometer, Compass, Bluetooth (включая LE) и другие);

  • поддержка push уведомлений, IoT;

  • поддержка асинхронных HTTP запросов;

  • поддержка большинства баз данных (MsSQL, MySql, Oracle, PostgreSQL, MongoDB и др.);

  • работа с Cloud Service (Amazon, Azure);

  • поддержка Android Service.

Минусы (на текущий момент):

  • отсутствие поддержки кастомизации нативных классов;

  • реализация специфических вещей либо невозможна (виджеты, расширения (iOS) и др) либо необходима пляска с бубном (background service, broadcast message и др);

  • кастомизация Splash screen (начальный экран) мягко говоря никакая;

  • FMX контролы используют собственный рендеринг (визуализация, отрисовка), который чисто визуально похож на нативный;

  • использование нативных контроллов связано с большими телодвижениями;

  • при большой вложенности компонентов происходят невероятные вещи: приложение крашится в самых различных местах, теряется фокус, зависает и др.;

  • информативность отладки приложения на мобильных платформах нулевая;

  • описание ошибок на мобильных платформах сводятся к бесполезным “Error 0х00000Х”;

  • время компиляции желает быть лучшим для средних и крупных проектов;

  • необходимость использование напильника для доведения до ума мобильных приложений для каждой платформы;

  • отсутствует поддержка Intel Atom архитектуры;

  • неадекватная цена по сравнению с конкурентами.

Плюсы:

  • очень активное развитие в последнее время как продукта, так и сообщества, поддержка все новых и новых технологий;

  • наличие громадного числа бесплатных и коммерческих компонентов;

  • скорость работы приложения очень близка к нативному;

  • очень продвинутый визуальный редактор и среда в целом, наличие стилей;

  • возможность тестировать приложение на Win, и лишь потом разворачивать на устройствах, что очень ускоряет разработку;

  • смена режима/платформы легким движением руки;

  • PAServer обеспечивает легкое взаимодействие с MacOs при разработке для ОС Apple;

  • поддержка 3D графики из коробки.

В заключение хочу сказать, что FireMonkey за последние пару лет вырос в профессиональный инструмент кроссплатформенной разработки бизнес приложений и не только. Многие недостатки постепенно решаются и с каждым релизом продукт становиться все более современным и самодостаточным, также исчезает существующий скептизм к самому языку Delphi, связанный с многолетним застоем. Написание новых проектов на FireMonkey является “безопасным” и перспективным.

Вы, наверное, в курсе, что Embarcadero активно продвигает свое новое видение создания кроссплатформенного гуя – FireMonkey (они это называют фреймвоком, но для её нынешнего состояния это слишком круто звучит ). В рунете анонсируется один конкурс за другим, проводятся вебинары, и пусть качество последних оставляет желать лучшего, но активность радует. Теперь, собственно, к теме. В рамках последнего конкурса было предложено разработать какое-нибудь приложение для обучения. И вот вчера появилась очередная работа за авторством Евгения Чмеля (не знаю, склоняется эта фамилия или нет ). В отличии от виденных ранее, простеньких “одноформочек”, тут была сделана попытка подергать обезьяну за все конечности: стилизация, 3D, шейдерные эффекты (о GPU accelerated graphics очень любят говорить евангелисты Embarcadero:)) ). Давайте посмотрим, что из этого вышло. Для тех, кто не смотрел вебинары сделаю маленькое отступление. На одном из вебинаров, евангелист Embarcadero, Всеволод Леонов рассказал душещипательную историю о том, как ему пришлось “компьютер перегрузить, конкретно, жестко” (это цитата ), из-за того, что Silverlight SDK и эмулятор Windows Phone 7 “не cработали” (это цитата ) на его компьютере т.к. им не понравился видеоадаптер или настройки графического процессора. А вот приложения разработанные с использованием FireMokey, продолжает Всеволод, совершенно не требовательны к аппаратному обеспечению. Давайте посмотрим, как он нам врал. Беспристрастным свидетелем нам будет Process Explorer v15.05 от Марка Русиновича. Итак, качаем приложение Евгения и запускаем (скриншотов приложения Евгения не привожу, они есть по ссылке на его работу. Обратите внимание на размытость шрифтов ).

Запустили приложение. Смотрим на потребление:

Нескромно, но можно простить “передовой технологии”. Переходим к разделу “Уроки” и выбираем “Урок 5”. Начинается подготовка сцены. Процесс этот длительный (у меня заняло чуть больше минуты, на четырехядерном Phenom II с частотой 3.3GHz ), запаситесь терпением. Сцена построена. Смотрим на потребление:

Обезьяна хорошо подкрепилась. Даже очень хорошо. Теперь попробуйте подвигать мышку над кнопками вариантов ответов. Ощущение, что GUI реагирует ну о-о-очень вяло, не так-ли? Смотрите на график использования CPU (я имею ввиду, что вы должны сами это попробовать, на своем компьютере ) – в эти моменты его загрузка приближается к 100% (у меня было ~21.5% для четырехядерного процессора, что эквивалетно 86% для одноядерного ). А ведь нам кто-то рассказывал про GPU accelerated graphics. Ладно, идем дальше. Отвечаем на все вопросы урока. Смотрим потребление:

Глаза не округлились? Теперь посмотрите, для сравнения, сколько потребляет 3D-стрелялка FarCry с активным игровым процессом (уровень называется Фабрика, если кому, вдруг, интересно ) запущенная в полноэкранном режиме 1440x900:

Выводы делайте сами.

TRippleEffect класс для создания эффекта, который накладывает рябь волн на текстуру визуальных объектов.

Центр ряби указывается в свойстве Center . Другие аспекты ряби можно настроить при помощи свойств Amplitude (Амплитуда), AspectRatio , и Phase (Фаза). Количество волн ряби определяется свойством Frequency (Частота).

В следующей таблице показаны результаты влияния TRippleEffect на PNG фотографию, размещенную на форме (с помощью объекта ). Центр ряби находится в середине изображения. Остальные свойства TRippleEffect используются с их значениями по умолчанию (Amplitude = 0,1, AspectRatio = 1,5, Frequancy = 70, Phase = 0).

В этом уроке вы будете использовать несколько базовых эффектов изображений в приложении FireMonkey.

Шаг 1: Применить эффект к изображению.

В FireMonkey, применение эффекта изображения к изображению является простым процессом. Просто создайте компонент, который может содержать изображение, а затем примените один из эффектов изображения.

    Создайте новое приложение FireMonkey (File> New> FireMonkey Desktop Application> HD FireMonkey Application ).

    Поместите компонент на форму.

Выделите компонент на панели инструментов.

Расположите TImage на форме в конструкторе.

    Вы можете видеть, что компонент не помещается в центр конструктора форм. Как показано на рисунке, необходимо, чтобы размер области изображения был как можно больше. Чтобы сделать это, выберите компонент на форме конструктора, а затем изменить свойства Align в alClient в Object Inspector, чтобы размер компонента стал таким же, как клиентский размер области формы.

    Выберите изображение, к которому вы хотите применить эффект. Компонент хранит картину в свйостве Bitmap . Выберите свойство Bitmap в объектном инспекторе, и используя Edit ... для выбора изображения.

  1. Теперь вы можете выбрать эффект для изображения. На палитре инструментов выберите TRippleEffect .

Теперь RippleEffect отображается в в окне Structure .

Чтобы применить эффект он должен быть определен как дочерний для другого компонента. В этом случае, RippleEffect1 должны быть определены в качестве дочернего Image1 . Чтобы это сделать, перетащите RippleEffect1 и поместите его на Image1 на панели структуры.

  1. Теперь вы можете видеть, что RippleEffect уже работает на Form Designer.

  1. Измените свойство Frequency на 20 .

Шаг 2: Применить эффект анимации к эффекту RippleEffect.

    Выделите RippleEffect на панели Structure .

    Выделите свойство Phase в Object Inspector и выполните команду Create New TFloatAnimation из выпадающего меню.

Убедитесь, что FloatAnimation1 определена как дочерний элемент RippleEffect1 .

    Измените свойства FloatAnimation1 как показано ниже:

Ну и напоследок добавим событийную процедуру OnMouseMove к .