Отправил свою программу на конкурс. Саму программу показывать пока не хочу. А хочу поделиться своими впечатлениями от использования Delphi XE5 и Firemonkey.
Сразу оговорюсь
- Это мой первый проект на Firemonkey и первый опыт разработки для Android.
- Я использовал Delphi XE5 + Update 1 + все хотфиксы для Update 1.
- Тестировал только на телефоне GSmart Aku A1 (480 x 854 pixels, 4.5 inches (~218 ppi). Эмуляторы не использовал.
- Часто компилировал и запускал на Win32 в режиме Mobile Preview (об этом ниже).
- В этом проекте решил опробовать подход "как-мне-кажется-это-делают-в-java", когда и для каждого класса создавал отдельный .pas файл. В результате получилась куча юнитов и чтобы в них не запутаться пришлось раскидать их по папкам и пространствам имён. Получилось в принципе удобно. Хотя есть у меня подозрение, что сборка проекта под Android из-за этого работал медленнее, чем в случае, если бы весь код был запихан в один .pas файл.
Грабли
Deployment manager и папки
Deployment manager и папки. С этим тоже пришлось повозиться прежде чем удалось понять какие надо указывать пути в Deployment manager и как потом найти эти файлы в программе. Пришлось провести небольшое исследование. О нём напишу позже, в отдельном посте. Вот только так и не понял, как же из приложения определить путь до корня SdCard. Также не понравился UI в Deployment manager-e. Редактирование пары десятков файлов сделано не очень удобно, хотя к слову сказать просто добавить пачку файлов довольно легко.
Сразу уточню, что я хотел недокументированного. Искал легкий способ добавления/редактирования файлов в Deployment manager из консоли. Не получилось, так файлы добавленные через Deployment manager поначалу сохраняются в .dproj файле, хотя в папке проекта и присутствует отдельный файл .deployproj. И я так и не понял в какой момент файлы переносятся из .dproj в .deployproj файл. Вот кстати наткнулся на пост о похожем исследовании от Павла Алхимова “DeployFolder - Развёртывание мобильного подкаталога”.
TLang
Я писал все тексты на английском, решив позднее воспользоваться TLang для перевода на русский.
Ох уж этот TLang. Поначалу он находил только ресурсы с главной формы. Позже согласился собрать ресурсы из всех открытых в IDE форм. При этом упорно игнорировал ресурсы указанные в ListBoxItem.ItemData.Detail. Потом выяснилось что редактор переводов TLang умеет и любит перемешивать переводы некоторых слов. Особенно, если дело касается слов для которых перевод не указан. Я так и отправил на конкурс работу в которой слово Home было переведено как Сова (не уследил). Еще добавление TLang в проект, вызывало стабильные загадочные AV в программе запущенной под Win32 при открытии формы с TabControl (лечится выключением у таб-ов свойства Autotrnslate) – но это кажется было исправлено в Update 2.
Запись звука
По умолчанию (при использовании TAudioCaptureDevice) на Android платформе Delphi записывает звук в качестве ARM 8kbps (и судя по упоминаниям в интернете это кстати единственный работающий кодек для записи звука в эмуляторе).
И при использовании TAudioCaptureDevice нет никакого способа указать другой кодек или битрейт. К счастью, в исходниках присутствует класс JMediaRecorder который это умеет. Тут правда, тоже пришлось немного повозиться прежде чем удалось подобрать работающие (на моём устройстве) значения дающие звук хорошего качества. Об этом позже расскажу отдельно.
Мультитач
Пичалька. Его нет. Точнее, я его не нашёл. Удалось найти только в виде ограниченного числа жестов. Впрочем, судя по исходникам реализации интерактивных жестов (FMX.Android.*), основа для мультитача реализована, и вероятно его как-то можно вытащить наружу.
Жесты
Насколько я понял, обработчик событий для жестов срабатывает только по окончании жеста. Включить свою анимацию в момент выполнения жеста Swipe Left/Right у меня не получилось. Но пока не теряю надежды.
IDE
Очень не хватало в дизайнере поддержки горячих клавиш Ctrl/Shift+стрелки. В Update 2 эта недоработка исправлена.
Редакторы свойств по сравнению с VCL мне показались неудобными. Хотя, возможно я слишком привык пользоваться расширенными редакторами которые устанавливаются вместе с CnWizards.
Жаль что линковка и deploy не умеют работать в фоне. Точнее я не нашёл как это сделать.
19" монитора становится маловато для удобной работы.
CnWizards
Из-за CnWizards, F2 не работает в Project Manager.
Автодополнение текста в Code Input Helper некорректно обрабатывает модули содержащие в названии точку (т.е. все в моём проекте).
Фреймы, формы и стили
Вдохновившись работой Николая Зверева решил заюзать в проекте фреймы. И тут же напоролся на то, что список стилей (свойство StyleLookup) для контролов на фреймах и на FMX mobile формах отличается. Зарегистрировал баг в QC.
А вот использование форм не понравилось, ибо я так и не нашёл способа при открытии сделать анимированный слайд при открытии другой формы.
Работа со стилями
Я постоянно запускал FMX Mobile проект на Win32 и меня ужасно раздражал тот факт, что встроенные иконки для SpeedButton-ов игнорируются при запуске на win32, хотя и видны в дизайнере и при запуске на устройстве. В конце концов я полностью переключился на свои иконки.
Но честно говоря я поленился разбираться о том как правильно работать со стилями. Возможно есть более правильный способ.
Отладка и занятый порт
Поначалу, при отладке на телефоне немало нервов попортила ошибка "Unable to start gdbserver on port '64311'. Port is already in use". Это известная в интернете проблема у меня проявлялась после сброса (Ctrl+F2) отлаживаемого проекта. Лечится либо перезагрузкой телефона и IDE, либо установкой другого порта:
IDE -> Run –> Parameters –> -debugport=54321
С другой стороны, благодаря этой проблеме получилось сделать шаг вперёд и чаще думать, вместо привычного подхода debugger driven developement. Кстати отладчик для Android работает непривычно по-другому (Ctrl+F7 например).
Punto Switcher и Delphi XE5
Punto Switcher и Delphi XE5 отказались дружить на моём компьютере. Когда запущен Punto, то при закрытии моей программы, Delphi всегда вываливался в отладчик с exception-ом. Судя по стеку вызовов, какой-то конфликт с хуками Punto.
Вторая беда с Punto - при закрытии проектов в IDE (Close all) и повторном открытии IDE полностью закрывалась. Даже несмотря на добавление Delphi в список исключений Punto и включенную галочку "Не взаимодействовать с программами исключениями". Но стоило полностью выгрузить Punto из памяти - как эти проблемы пропадали. Грешу на некорректную реализацию хуков в Punto Switcher (64-bit).
Понравилось
Подход Firemonkey - любой контрол является контейнером. Можно комбинировать контролы, класть один в другой, а их вместе класть в какой-нибудь элемент списка, использовать отрицательные смещения для получения нестандартного поведения.
Record helper-ы для простых типов очень радуют.
Delphi наконец перестал удалять IFDEF-ы из .dpr файла при добавлении нового модуля.
Демки и примеры (snippets) очень хорошо показывают как сделать что-то одно. Очень помогли.
Анимации и методы типа FloatAnimation очень-очень-очень упрощают жизнь.
Action-ы + существенно упрощают жизнь, особенно при работе с жестами.
Понравилась работа с камерой. Я опасался, что придётся повозиться с настройками. Совершенно напрасно. Программировать вообще не пришлось. Получить снимок с камеры или из галереи проще простого - для этого есть готовые action-ы.
А есть еще Live Bindings, которые я полностью проигнорировал, потому как толком не понимаю как их использовать.
Резюмируя
Общие впечатления очень приятные. Делать программу – очень просто. Даже не верится.
Firemonkey выглядит более чем работоспособным. Какие-то шероховатости еще есть, но их существенно меньше чем в предыдущих версиях (впрочем, я конечно не копал глубоко). Мне даже захотелось себе Mac и устройство на iOs, чтобы попробовать себя в разработке для совершенно новой платформы. Хотя, цены на яблочную продукцию поумерили мой пыл.
Отличная статейка, будем ждать следующих публикаций.
ОтветитьУдалитьЯ сейчас тоже думаю как сделать свайп влево/вправо. Думаю стоит привлечь событияOnMouseDown, OnMouseMove и OnMouseUp, что бы можно было двигать элементы управления. если найдете решение-напишите статейку в блоге, думаю не только мне будет интересно
ОтветитьУдалитьEmbarcadero для свайпа страниц предлагает использовать TabControl с добавленными Action-ами. См. стандартную демку (не помню название =)).
УдалитьВообще поддержка свайпа уже реализована на уровне жестов. Поэтому свайп легко сделать на уровне обработчика событий, который правда выстреливает уже после того как жест завершился.
А если делать свайп вручную, то можно использовать готовую анимацию (slide кажется).
Обнаружил страшную "особенность" http://qc.embarcadero.com/wc/qcmain.aspx?d=121702,
ОтветитьУдалитьделающую ,бессмысленной всю дальнейшую работу на Delphi XE5 (update 2) по направлению Android.
Повторяемость "особенности" -100%, в том числе на разных устройствах.
Вы не встречались с этим ? Если нет - попробуйте. Проявляется в любой программе,
написанной на Delphi XE5, в том числе и на демонстрационных примерах.
К сожалению всё более чем серьезно, поскольку "простые" (небольшие по размеру,
напрмер, без SQLite+FireDAC) только "мигают". Противно, но не страшно.
А что-то более серьезное с SQLite... просто тупо виснет. И я не могу объяснить
пользователям, что это не моё, что это особенность, что если перед запуском
"очистить память", то запустится точно. Таким образом в настоящий момент Delphi XE5
не позволяет разрабатывать приложения, которые можно распространять. Тесты
писать можно, поиграться можно, но что-либо серьезное делать нельзя. По крайней мере пока.
Там в комсентах к отчёту на QC Ярослав Бровин сообщил что сумел воспроизвести баг. Так, что есть вероятность что баг будет исправлен - лучше конечно спросить самого Ярослава.
УдалитьМне на моём телефоне такого воспроизвести не удалось.
А какой телефон у вас ? Мы воспроизводили на SGS2 c 2.3 и 4.1, HTC One S 4.1. Интересно, что так же ведут себя и совсем "легкие" приложения, которые без Forms, типа http://cc.embarcadero.com/Item/29682
УдалитьУ меня GSmart Aku A1. Версия Android 4.2.1. Наверно поэтому и не удалось.
УдалитьИ еще, у меня под рукой нет отладочного билда. И я пытался воспроизвести на Release версии. И вам кстати тоже посоветовал бы, проверить повторяемость бага при установки release сбокри (без gdbserver), а то мало ли.
SGS4, release сборка - не воспроизводится.
Удалить