уважаемые посетители блога, если Вам понравилась, то, пожалуйста, помогите автору с лечением. Подробности тут.

Сегодня пятница, как говорится, «укради, но выпей», но т.к. я человек не склонный к распитию горячительных напитков, решил сегодняшний пост про FireMonkey посвятить некоторым своим впечатлениям относительно использования этой самой платформы и, тем самым, немного отвлечься. Тем более, что поводов для такого поста несколько. Во-первых, за последнюю неделю-полторы уже не раз задавался в разных вариациях вопрос, который можно в нескольких словах сформулировать так: «Влад, ты работал с FireMonkey и как оно? Круто или полный отстой?«. Во-вторых, скоро выход Delphi XE3 о которой уже во всю идут разговоры и хотелось бы обобщить имеющийся небольшой опыт использования FireMonkey.

Вообще, если посмотреть на всё то же голосование в сайдбаре блога, то видно, что хоть большинство разработчиков и не планируют использовать FireMonkey, но тем не менее, к выходу XE3 ситуация для новой платформы медленно выравнивается в лучшую сторону. Что касается моих впечатлений от FireMonkey, то читаем далее :)

Итак, впервые с FireMonkey я познакомился 22 сентября 2011 года, когда написал пост «Delphi XE2. Знакомство с FireMonkey». До этого, конечно, знал, что есть такая штука как FMX, что она кроссплатформенная, красивая и всё такое, но плотно в хитросплетения FMX не лез. Первое впечатление оказалось для меня очень смешанным: с одной стороны, поработав с FMX, подумал «Да, крутая штука! Сколько всякого красивого добра можно написать с FMX!» можно и в 2D рисовать и, если уж сильно хочется, то и проект дома Ксения в 3D забабахать, а с другой — когда не можешь с первого клика выделить компонент и не потому, что ты косой, а потому что реально глюк в дизайнере, то как-то невольно приходит мысль о том, что «Продукт сырой…очень» Ну не может же быть таких мелких, но неприятных багов в релизе продукта. И это только на первый взгляд, не залезая в исходный код — просто по первому взгляду.

После того, как я познакомился с FireMonkey и даже начал писать серию постов про эту платформу, Embarcadero выпустила четыре апдейта, хотфикс и целых (если не ошибаюсь) шесть апдейтов для справочной системы. И в каждом из этих обновлений обязательно задевалась платформа FireMonkey. Можно даже сказать, что в основном-то только её и фиксили как могли. И к чему мы пришли в итоге всех этих правок?

Начнем с самого простого и элементарного — с форм. Создаем два проекта Delphi: FireMonkey HD Application и VCL Application. В каждом приложении будет по две формы и по 1 кнопке на главных формах. Суть этого мини-теста: посмотреть как позиционируются дочерние формы. В обоих приложениях делаем один и тот же обработчик OnClick кнопки:

procedure TMainForm.Button1Click(Sender: TObject);
begin
 OtherForm.ShowModal
end;

Соответственно у OtherForm свойство Position будет равно poMainFormCenter. Запускаем VCL-приложение, смотрим результат — все замечательно:

Запускаем FMX-проект:

Как, блин, так? Это мелочь, пустяк, но он напрягает на протяжении года :) При этом ведь и справка есть по части свойства Position где даже рассказывается про особенности некоторых значений под Mac OS X. Когда разрабатывал «Я математик» пришлось использовать костыль …млин, даже наверно не костыль, а цельный протез в виде хэлпера, который подсмотрел тут:

type
  TFormHelper = class helper for TForm
    procedure UpdateFormPosition;
  end;
 
procedure TFormHelper.UpdateFormPosition;
var
  RefForm: TCommonCustomForm;
begin
  RefForm := nil;
 
  case Position of
    TFormPosition.poOwnerFormCenter:
      if Assigned(Owner) and (Owner is TCommonCustomForm) then
        RefForm := Owner as TCommonCustomForm;
    TFormPosition.poMainFormCenter:
      RefForm := Application.MainForm;
  end;
 
  if Assigned(RefForm) then
  begin
    SetBounds(
      System.Round((RefForm.Width - Width) / 2) + RefForm.Left,
      System.Round((RefForm.Height - Height) / 2) + RefForm.Top,
      Width, Height);
  end;
end;

Ради интереса уже глянул как реализуется ShowModal и просто Show в FireMonkey:

function TCommonCustomForm.ShowModal: TModalResult;
begin
  FFormState := FFormState + [TFmxFormState.fsModal];
  Result := Platform.ShowWindowModal(Self);
  FFormState := FFormState - [TFmxFormState.fsModal];
  if not (csDestroying in ComponentState) then
    Recreate;
end;
 
procedure TCommonCustomForm.Show;
begin
  if not (csDesigning in ComponentState) then
  begin
    case FPosition of
      TFormPosition.poScreenCenter:
        begin
          with Platform.GetScreenSize do
            SetBounds(System.Round((X - Width) / 2), System.Round((Y - Height) / 2), Width, Height);
        end;
    end;
  end;
  Platform.ShowWindow(Self);
  FVisible := True;
end;

….В общем с позиционирование форм в FMX пока беда. Двигаемся далее. И пока не ушли от форм, ещё один момент, который по началу немного смущал — события форм. Думаю, что многие, кто впервые создавал приложение в FMX были удивлены отсутствием в инспекторе целого ряда событий для формы. На рисунке показаны Инспектор для VCL и FMX-формы:

Различия внушительные, не так ли? Однако, потом как-то более-менее привык к таким «странностям» в FireMonkey. Кто ещё не в курсе как необходимо поступать, если нам вдруг потребуется какое-нибудь отсутствующее в инспекторе событие — читаем пост в блоге Delphi2010.ru.

А вот что напрягает — это с ситуация, когда события есть, но чтобы их обрабатывать надо что-то включать. Например, возьмем такой компонент как TLabel — проще некуда. Бросаем на форму,  смотрим события — да, есть OnClick. Отлично, пишем обработчик:

procedure TForm12.Label1Click(Sender: TObject);
begin
  ShowMessage('Click');
end;

Запускаем программку, кликаем по Label’у…Где мое сообщение? Нету сообщения. А почему? А потому, что свойство HitTest у компонента в False стоит, а надо выставить в True. Устанавливаем в Инспекторе HitTest=True и OnClick начинает нормально обрабатываться. Зачем надо было, спрашивается, усложнять? Ну сделали бы по-дефолту True и не было бы ни вопросов, ни баг-репортов в QC по этому поводу. А так натыкаешься на что-нибудь подобное и сидишь 5 минут тупишь, справку листаешь и думаешь фича это такая или баг :)

Что касается вообще возможностей Firemonkey, то с одной стороны, их не просто много — их валом: хочешь простенькое приложение пиши, хочешь наворачивай в приложения кучу эффектов, 3D-моделей, красивых переходов, переделывай компоненты как душе угодно — добавляй новые элементы, переопределяй старые и т.д. и т.п. А с другой стороны всё опять же упирается в отсуствие чего-то, чего ну никак не хватает для комфотрта. Чего?  Да хотя бы тех же ActionList, ActionManager и т.д. Понятно что это компоненты, которые ну «сквозь виндузовские» и под Mac их «перетянуть» — это надо пуд соли съесть вперемешку с дёгтем, но без них бывает подчас очень тоскливо. Или, например, больная тема — гриды в FireMonkey. Тяжко с ними работать, очень тяжко. По идее, в FireMonkey можно переопределить класс столбца и запихать в ячейки что угодно — картинки, прогрессбары и т.д., но когда дело доходит до работы с БД, то тут начинается какой-то АДЪ. А учитывая, мягко говоря, не совсем прозрачную работу с LiveBindings, ад этот усиливается многократно. В итоге, чтобы не тратить время на долгие и мучительные поиски решений все сводится к возврату на VCL.

Полагаю, что если Вы дочитали пост до этого места, то у Вас могло сложится впечатление типа «Ппц, никогда в жизни не полезу в FireMonkey». Хотя я рассказал только самые мелочи, о которых вспомнил. Отчасти такое отношение к новой платформе может быть оправдано, НО только малой отчасти.

Хоть я сейчас немного и покритиковал новую платформу (да и не только я), но тем не менее, на данный момент я отдаю себе отчет в том, что FireMonkey в Delphi XE2это новое направление. Можно говорить о том, что Embarcadero поторопились с выпуском (иначе откуда столько апдейтов), но никак не могу сказать, что они (Embarcadero) облажались.  Скорее наоборот. Сейчас нам показали совершенно новый продукт, хоть немного, но продемонстрировали его возможности, собрали более менее нормальную документацию. За год работы с FireMonkey разработчики всех уровней и мастей накидали тысячи (надеюсь, что тысячи) отзывов, предложений и замечаний, провели массу тестов, попробовали, в конце концов, этот продукт.  Кто-то остался доволен, кто-то нет. И это нормально! Осталось дождаться второй версии. Если вторая версия платформы унаследует ошибки и откровенные ляпсусы своей предшественницы, то что тут сказать…будет обидно. Однако, т.к. я стараюсь быть оптимистом, надеюсь, что вторая версия, что называется «выстрелит» — появятся новые компоненты, улучшатся старые, LiveBinding станет прозрачным на столько, что с ним разберется пятилетний ребенок :). Никто ведь (кроме ярых холиварщиков, конечно) не будет спорить с тем, что тот же .Net Framework в своей первой версии был далеко не самым идеальным продуктом? А вот уже вторая и последующие версии были одна лучше другой (да простят меня за сие богохульство те, кто ненавидит кровно .Net). Так и с FireMonkey — первая версия комом, остальные должны стать намного лучше и стабильнее.

Что же касается моего мнения о том, стоит или нет использовать FireMonkey, то здесь могу сказать так: на данный момент я бы взялся за разработку небольшого по размерам проекта, используя FireMonkey, но рисковать и переносить что-либо существующее с VCL на FMX — нет. Почему я сейчас не против того, чтобы запускать что-нибудь более менее крупное в работу на Firemonkey? Здесь можно выделить две составляющие проблемы:

  1. Неопределенность. Непонятно пока, что станет с FireMonkey в XE3. Скажу откровенно — Mac OS X мне пока до лампочки, как и iOS и Android. Не в кроссплатформе дело, а именно в удобстве и качестве платформы. Будет все кул — кроссплатформенность потребуется, нет — смысл ломать копья об то, что не работает как надо?
  2. Документация. Для старта работы с FireMonkey документации валом — официальная вики, записи вебинаров, блоги. Но пока ещё очень не много народу полезли вглубь платформы и показали что-либо мощное, созданное на FireMonkey. Я не жду с моря погоды и по мере возможностей и сил читаю, смотрю, слушаю, пробую собрать что-то свое, но этого мало для того, чтобы писать что-нибудь серьезное.
Вот собственно и все, что касается моих впечатлений от FireMonkey. Ещё раз повторюсь для тех кто прочитал только начало и пропустил середину — я за то, чтобы использовать FireMonkey и всяческое развитие и продвижение этой новой платформы. Я продолжу серию постов про FireMonkey, несмотря на то, что пока платформа не в полной мере отвечает моим потребностям. Первым делом, что я сделаю после того как скачаю XE3 — будет проверка возможностей FireMonkey и LiveBindings. И я очень надеюсь на то, что с выходом RAD Studio XE3 платформа FireMonkey станет на порядок лучше своей предшественницы из XE2.

А каковы ваши впечатления от использования FireMonkey? Что вам в ней понравилось или наоборот — раздражает?

5 1 голос
Рейтинг статьи
уважаемые посетители блога, если Вам понравилась, то, пожалуйста, помогите автору с лечением. Подробности тут.
Подписаться
Уведомить о
23 Комментарий
Межтекстовые Отзывы
Посмотреть все комментарии
Deksden
11/08/2012 01:40

А у меня от кросс платформы смешанные впечатления! Без нативных контролов и взаимодействия с ObjectiveC на iOS вообще грустно.. На OSx еще куда ни шло, но тоже грустно! Впечатление, что софт в песочницу посадили на новых платформах, и она — детская! Почти ничего сделать нельзя((

teran
11/08/2012 04:05

у меня дак счас застой некоторый в Fmx. Одним из первых и последних проектов был клиент для Myshows.ru. и вот до 2го апдейта включительно он компилировался и работал весьма шустро. а вот 3й и 4й апдейт проект тупит. Анимация подтормаживает. Код не менялся, только пересобирал, а тупит. Из за таких косяков не очень хочется в нем дальше разбираться. А то ставишь эффект анимации. А оно 2 фрейма тебе рисует рывками и все. хз в чем причина, даже дрова обновлял для видяхи. не помогло.

Keeper
11/08/2012 05:44

Про свой печальный опыт я уже кратко писал в прошлом посте, расписывать сильно некогда, ибо написал бы у себя в блоге отдельно. Была простенькая ИС (на Delphi 2010), заточенная под Windows: Actions, Messages, ADO и т.п., которую понадобилось переписать под новые нужды. Понятно, что разработка кроссплатформенных приложений требует определенного подхода (в частности, не использовать OS-specific), и в процессе переработки на FireMonkey я пытался то одно заменить, то другое забыть, но в конце концов пришлось менять столько, что я плюнул и сделал все на VCL намного быстрее. И это все с учетом того, что использовались только стандартные компоненты. Что касается разработки… Подробнее »

Keyoff
Keyoff
11/08/2012 13:51

все можно и под иОС писать

и костылить потихоньку :) вот к примеру скрины приложения под iPAD — построитель форм по XML, SQLite, клиент трехзвенки :)

http://goo.gl/gnzXh

Keyoff
Keyoff
11/08/2012 13:56

правда единственное что мне не удалось побороть — скорость отклика интерфейса. тут все очень печально :( не знаю с чем это связано или с кодом оработки эффектов или спецификой выделения/отбора памяти под иОС тем не менее желания писать под иОС на ХЕ2+ у меня пропадает с каждым днем… потихоньку перебираюсь на мармеладку ;-)

balmo
balmo
11/08/2012 19:09

Господа, давайте не забывать, что фреймворк новый) Понятно, что ни один серьезный разработчик не будет начинать крупный проект на совершенно новом, только что вышедшем фреймворке. И причин тому — множество: нестабильность, глючность, необходимость костылей, скудная документация и т.п. К тому же непонятно, будет ли эта это фреймфорк в дальнейшем развиваться или так и останется только лишь попыткой сделать что-то новое и хорошее (кто помнит про Kilyx?). Собственно, понятно что та версия обезьянки что входит в состав XE2 — это, в лучшем случае, бета. И конечно, не совсем красиво со стороны Embarcadero использовать в качестве бета-тестеров своих же пользователей, которые ещё… Подробнее »

Senpai
Senpai
13/08/2012 12:17

>> переделывай компоненты как душе угодно
Не совсем, в VCL по умолчанию для формы ставлю размер шрифта в 10, все дочерние при этом наследуют размер шрифта. В FMX такого нет. Попробовал обойти, создавал default стили для компонент, увеличивая размер шрифта до 13 — реакции ноль.

Senpai
Senpai
13/08/2012 12:24

Аналогично с цветом шрифта для стилей по умолчанию. Без стилей, напрямую все корректно изменяется.

Senpai
Senpai
13/08/2012 12:30

Некоторые БАГИ:
_ttp://blog.analogmachine.org/2011/09/02/bugs-and-issues-in-delphi-xe2-firemonkey/

Дима
Дима
13/08/2012 16:45

Работа с БД исключительно для мазохистов (IMHO). На этом мое знакомство с FM закончилось.

Дима
Дима
13/08/2012 16:49

а когда XE3 выходит? Что-то не так уж много инфы, что там будет вообще в ней нового и интересного.

Senpai
Senpai
13/08/2012 19:40

А по мне так LiveBindings уже очень даже ничего! SOAP+шина+XML+коллекции = LiveBindings + никаких ограничений в построении интерфейса. Работает!
п.с. FMX в сторонке.

zdm
zdm
13/08/2012 22:22

Спасибо за ответ Влад, будем надеяться..Хотя не только связь меня напрягла, тот-же TDbGrid без лишних танцев с бубном работает(т.е. еще и все компоненты отображения), я уже не говорю про DevExpress или EhLib… А вот подскажите еще, только у меня такое или…. создаю File-New-FireMonkey HD Application. Передо мной форма, кликаю дважды по ней, теоретически должно создаться событие OnCreate и даже больше, я вижу что среда пытается создать это событие но выдает -Cannot find implementation of metod FormCreate.. посмотрев на события не обнаружил onShow (ну это так.. в нагрузку.. ну хоть с криейтом разобраться) Видя созданый метод, все равно не взирая на… Подробнее »

zdm
zdm
13/08/2012 22:32

стесняюсь спросить, а PageControl где? ууууууууууууууу … вот решил только все-таки уделить время и только косяк на косяке вижу…. Ну не буду забегать вперед, Вы побольше изучили, может хитрость какая….

zdm
zdm
14/08/2012 12:18

То-же Update4, кривая что-ли попалась.. Ну ладно, с PageControl то-же понятно. А вот еще скажите (уже теперь реальные сомнения в своем дистрибутиве) Кидаю компонент, например Label, жму на ней Ctrl-X и получаю в ответ Access Violation …in module ‘coreide160.bpl’ /// Это в FM, при работе с VCL все ок…

zdm
zdm
14/08/2012 12:28

При чем это на двух разных машинах, но с одного дистрибутива… Правда еще куча чего прилеплено и доп. компоненты… Надо попробовать в чистом варианте, только среда и всё. Ладненько, спасибо.

keyoff
14/08/2012 17:14

2zdm:
проверь в .dproj значение параметра FrameworkType он должен выглядеть так:
FMX

keyoff
14/08/2012 17:16

балин разметка слетела :(
[code]
FMI
[/code]