Блог Александра Божко
Архивы
Рубрики

FireMonkey

Я уже неоднократно писал о SphereLive. В контексте данного блога  этот проект прежде всего интересен тем, что реализован на FireMonkey и является потрясающей демонстрацией возможностей данной платформы. И вот, буквально на прошлой неделе, была выпущена публичная бета продукта. Таким образом, читатели блога могут сами “пощупать” действительно сложное FireMonkey приложение.

sphere00

Пару слов о программе. В первую очередь нужно отметить то, что нынешняя версия Sphere позиционируется немного по-другому. Да, иногда так бывает…

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

На данном этапе цены на использования продукта вполне демократичны. При условии ограниченного количества слушателей и небольшом объеме ресурсов, продукт можно использовать бесплатно.

Естественно, что Сфера использует главное преимущество FireMonkey – кроссплатформенность. Сейчас приложение доступно в Windows и MacOS редакциях. Android версия ожидается со дня на день.

Тем не менее, для меня, SphereLive интересна, прежде всего, как инновационный продукт с целым набором оригинальных решений. Иногда просто на уровне “… ух ты, как ты это сделал?” Кстати, один из разработчиков Сферы активно участвует в обсуждениях на форуме, посвящённом FireMonkey. Само по себе это может послужить поводом скачать приложение и обсудить технические вопросы непосредственно с автором. Поверьте, есть на что посмотреть, есть чему поучится.

 

TListView является одним из ключевых компонентов для построения интерфейса мобильного приложения в FireMonkey. Компонент этот не самый простой в использовании, зачастую предполагает значительный объем кода, зато предоставляет разработчику значительную свободу действий. Конечно, в приложениях можно использовать и TListBox, где все намного проще. Но TListBox, возможно, хорош для отображения фиксированного количества записей,  для вывода данных из источников данных, однозначно нужно использовать  TListView.

Цитирую Ярослава Бровина:

Главные отличия TListView от TListBox в:

  1. TListBoxItem - контрол, TListViewItem - нет
  2. В TListBoxItem можно добавлять любые контролы, используя Parent. В TListVIewItem - нет.
  3. TListVIewItem хранит только данные для отображения
  4. TListVIewItem сам выполняет отрисовку хранимых данных через метод Render
  5. За счет собственно ручной отрисовки в TListVIewItem достигается прирост скорости и малое потребление памяти (хранение только актуальных данных)
  6. Чтобы создать свой вариант TListViewItem, нужно создать свой класс итема, в нем реализовать требуемые данные (например время) и создать in-place редактор для редактирования времени, зарегистрировать его и т. д.

 

Сам по себе факт повышения производительности и уменьшения потребления памяти – веский аргумент в пользу использования TListView. Но есть и еще кое что.

Во многих Android приложениях мне приходилось наблюдать следующую реализацию списков. При нажатии на элемент списка (Item, если придерживаться выбранной терминологии), производится определенное действие. Обычно вызывается новая форма для редактирования данных. Но при нажатии с удерживанием (Long Tap) производится совершенно другое действие. И эти события не пересекаются. Иными словами Android приложения умеют четко различать “длинное нажатие” от “обычного”. Более того, ни одно из этих событий не срабатывает при скроллинге списка. Наглядный пример – список писем в Яндекс Почта.

При попытке реализовать подобный функционал с помощью TListBox, я получил чехарду из накладывающихся друг на друга событий. Главной проблемой оказалось отделение скроллинга от обычного нажатия. В TListView, как оказалось, с этим проблем нет. Но правильно определить события – тоже задача довольно интересная. Дабы сэкономить время своим читателям, я поделюсь здесь результатами своих экспериментов. Читать далее

Прежде всего хочу поздравить всех читателей блога с прошедшими праздниками и пожелать всего наилучшего в наступившем году.

В силу понятных обстоятельств я не стал делать традиционный новогодний отчет, как и строить какие-либо планы на год. Тем не менее, жизнь не стоит на месте, работа работается, и определенные события в мире Delphi происходят. Подборку пропущенных “новостей из мира Delphi” за время рождественских каникул обязуюсь опубликовать в ближайшее время. А пока расскажу о новом аппарате, который я приобрел.

Sony Xperia™ M2

С характеристиками вы можете ознакомиться на официальном сайте. А субъективное впечатление весьма приятное. Обращает на себя внимание тот факт, что аппарат буквально напичкан фирменным софтом от производителя. Да и от продавцов достался в подарок внушительный комплект софта. В работе смартфон достаточно шустр и вполне оправдывает свою стоимость (примерно $200). К слову, свой предыдущий телефон GSmart 1362 я покупал примерно за те же деньги 2 года назад. Но, как вы, наверняка, догадались, основной интерес для меня заключался в том, как будут работать FireMonkey приложения.

Разработку я веду в XE7 на HP Envy 23 d254er с предустановленной Windows 8.1. Последнее обстоятельство, конечно же создает проблемы при установке драйвера. В очередной раз выручил пост и видеоролик Jim’а McKeeth.

Читать далее

lost_timerПрежде чем продолжить рассказ о таймере – две новости.

Во-первых, вышел первый апдейт XE7. По традиции он доступен зарегистрированным пользователям. Список исправленных багов вы можете найти здесь. Мне хотелось посмотреть как поведет себя приложение в обновленной среде. Собственно, никаких исправлений вносить не пришлось, хотя поле для экспериментов осталось.

Вторая новость. Действие специальных предложений Embarcadero продлено до конца года:

  • возможен апгрейд с любой старой версии на новую версию XE7: Delphi, C++ Builder и RAD Studio.
  • покупатели редакций Enterprise, Ultimate и Architect получают бесплатную лицензию Rapid SQL XE6.

Ну, а теперь непосредственно к теме поста. В принципе, все, что нам осталось – попытаться запустить уже созданное приложение под Android. Для это используем то, о чем я писал в предыдущих постах. А именно новый FireUI. Я отлаживал данное приложение на Nexus 7, соответственно добавил представление Android 7″ Tablet. Дизайн пришлось “подрихтовать” лишь самую малость.

Читать далее

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

Разрабатывать мы будем именно таймер, в англоязычном понимании этого термина. Т. е. на экране будет отображаться циферблат и четыре кнопки – “Пуск”, “Пауза”, “Стоп” и “Отмена”. Отсчет будет производиться в прямом направлении (т. е. время будет увеличиваться). Вариант, при котором задается время и идет обратный отсчет в англоязычной терминологии называется Stop Watch, возможно я попробую реализовать его позже.  То, приложение, которым займемся мы, по функциональности ближе к секундомеру.

Delphi XE7, позволяет значительно упростить процесс разработки, за счет того, что теперь мы можем создать и отладить реальное приложение для Win32, а затем просто добавить представления форм для необходимых мобильных устройств и, немного подкорректировав их, получить рабочее мобильное приложение. Звучит слишком красиво, что бы быть правдой? Возможно. Но проверить данное утверждение я и хочу, реализовав поставленную задачу. Читать далее

The more frequently I’m asked my colleagues in private conversations  if it’s possible to develop mobile applications in FireMonkey or is it a prototype rather than a production solution?

I think, now I can ensure even the out-and-out sceptics.

My bosom friend and colleague Tagir Yumaguzin told me about the project he took part a long time ago.  Now, when this project is in pre-release state, we decided that this description will be interesting for the Delphi community. In the essence, this is a really large project implemented in FM. We are talking about Sphere Live project.  A little article devoted to that project was recently published in Habrahabr.ru  Alexey Glyzin, chief of ‘Sphere Systems, LLC‘ development department agreed to tell more about the project taking into consideration the audience of my blog.

Desktop_Chat_Translator

A.B. – Alexey, in general, what your project is?

A.G.: – The idea has not appeared at once and instantly. Before the ‘Sphere’ project our team had been working on the project where stream audio/video technologies were implemented. Later we created our own software that was able to deliver multimedia streams to an unlimited amount of users including the feedback.  But we needed to have a billing feature included.
The application had to comply the several requirements. First, the maximally simplified organization of conferences or transmission to the participants which amount we cannot predict. Second, the most important, is to give to our clients an opportunity to earn with our application and to reduce the complexity of the system, amount of instruments needed to use to reach the goal. The ease of organization of courses, webinar or just a consultation. Читать далее

Небольшая зарубка на память, касающаяся FireDAC в актуальной версии Delphi XE6. Но прежде, пару слов о том, где искать ответы на вопросы, касающиеся FireMonkey. Русскоязычные пользователи здесь оказались в привилегированном положении.

Fire-monkey.ru – русскоязычный форум, посвященный FireMonkey, администрируемый и модерируемый Ярославом Бровиным. Так что здесь вы сможете получить ответы, что называется, “из первых рук”. Еще один ресурс давно и хорошо известен – форум SQL.RU и тема, посвященная FireDAC. Здесь вы сможете получить ответы от Дмитрия Арефьева, автора данной библиотеки. И еще хочу порекомендовать блог Андрея Ефимова, в котором собраны ответы на наиболее популярные вопросы, касающиеся FireMonkey.

Собственно, теперь сама заметка.

Для соединения с БД используем FireDAC. База, похоже, значения не имеет. Тестировал на MSAccess и на SQLite. С помощью LiveBinding в XE6 подключаем ListBox. При перемещении по списку перемещение по DataSet’у не происходит. В XE5, однако, все работает нормально. Подключение с помощью dbGo, тоже работает.

Для разрешения данной проблемы следует установить значение FetchOptions.LiveWindowParanoic в True.

Узнать больше:

Читать далее

Как и предполагалось, последние пару недель я плотно занимался разработкой мобильного приложения под Android. И, думаю, это хороший повод продолжить начатый обзор беглым рассказом об изменениях в FireMonkey.

Обнаружение неподдерживаемых устройств

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

  • ARMv6
  • Intel x86
  • MIPS

Естественно, мой шеф является счастливым обладателем одного из подобных аппаратов. После запуска приложения, собранного в XE5 на Motorola Atrix mb860 попросту появляется черный экран, без всяких дополнительных оповещений. В XE6 появились три небольших библиотеки, которые по умолчанию добавляются в проект. Благодаря им теперь, при попытке запустить приложение на неподдерживаемом устройстве теперь выводится сообщение

Application not supported by this device

Если нет необходимости использовать эти библиотеки (например, когда приложения будет запускаться на каком-то конкретном устройстве) их можно отключить в Deployment manager‘е.

delpoyment_manager

Однако, в том случае, если приложение будет распространяться в GooglePlay, эти библиотеки точно следует отключить, поскольку данный сервис сам определяет совместимость приложения с устройствами.

Компоненты для продажи цифрового контента и показа рекламы

В отличии от iOS приложений, монетизация Android приложений не всегда возможна путем продажи непосредственно приложения. Здесь и сами приложения дешевле и конкуренция выше. Поэтому для Android приложений часто используют схемы продажи цифрового контента или рекламы в приложениях.

В XE6 теперь появились компоненты TBannerAdd и TInAppPurchase, предназначенные для показа рекламы и продажи цифрового контента, соответственно. Компоненты можно использовать как в Android (для работы с GooglePlay и AdMob), так и в iOS приложениях (для работы с iTunes и iAd).

Новый FireMonkey стиль для Google Glass

Собственно, для того, что бы о чем-то здесь говорить нужно как минимум иметь очки Google. Тем не менее, понятно, что данное устройство поддерживается, а следовательно принцип “в ногу со временем” воплощается жизнь.

FMX.Grid

Изменения произошли в гриде. Вопрос этот довольно актуальный. Все-таки велико искушение перенести идеологию VCL приложений в FireMonkey. И если для мобильных приложений от использования грида  лучше отказаться, то для десктопных приложений он просто необходим. Качественных сторонних решений уровня гридов от DevExpress нет. А для серьезных приложений, работающих с данными нужна сетка отображения данных с серьезным функционалом.

В XE6 был расширен базовый класс TCustomGrid. В нем появились события OnDrawColumnCell и OnDrawColumnHeader и несколько новых свойств TCustomGrid.Options.

В новой версии TGrid появились обновленные редакторы для столбцов типа TTimeColumn и TDateColumn. А также были добавлены четыре новых события OnHeaderClick, OnSelectCell, OnColumnMoved и OnCreateCustomEditor.

Кроме того, был произведен рефакторинг, улучшена производительность, в частности изменен механизм прокрутки.

Конечно, это в определенной мере расширяет функциональные возможности грида. Но если вас интересует мое субъективное мнение, то грид, это лишь часть вопроса. Кроме него узким местом в разработке приложений для работы с данными является и механизм Live Bindings.

 Новые контролы для отображения даты и времени

Вместо TCalendarEdit в XE6 появились TDateEdit и TTimeEdit. Сразу же “прикрутил” их в свое приложение. Реализация понравилась. Реагируют на разрешение устройства и в зависимости от него показывают календарь в развернутом либо урезанном виде.

FireMonkey DateEdit

FireMonkey DateEdit

Прочее

На самом деле небольших изменений в FireMonkey было сделано достаточно много. В основном они связаны с модификацией типов данных и добавлением новых методов и событий в некоторые классы (в частности обновился TWebBrowser).

Между тем, при переходе с XE5 особых проблем с совместимостью у меня не возникло. Я не буду здесь перечислять все изменения, они детально описаны в справке в разделе What’s New in Delphi and C++Builder XE6.

Отдельная тема, на мой взгляд, достойная обсуждения – FireDAC. Но об обновлениях в этой библиотеке доступа к данным мы поговорим не сегодня.

Субъективные впечатления

Безусловно сама среда при разработке мобильных приложений стала работать стабильнее. За пару недель плотной работы практически не было “вылетов” и “критических сбоев” в работе IDE. Дизайнер формы наконец-то стал работать с буфером обмена.

К сожалению, редактор Visual Binding при большом количестве объектов на форме по-прежнему притормаживает, поэтому “лишние” (не используемые) объекты лучше сразу делать невидимыми.

Но, повторюсь, что в целом, впечатление весьма благоприятное.

Не пропустите:

 

Еще при подготовке к харьковскому мероприятию в рамках Мирового тура RAD Studio XE5 я столкнулся с небольшой проблемой в работе с SQLite с помощью FireDAC. Если заполненную в Windows приложении базу перенести вместе с приложением на Android, кириллические строки в базе перестают читаться (вместо букв отображаются знаки вопроса). Однако, если заполнять базу непосредственно на мобильном устройстве, русские символы считываются вполне корректно. Данные из базы заполненной в стороннем приложении, или в Delphi приложении, использующем другие компоненты доступа к данным, так же отображались нормально. Слету найти решения не удалось, и мне пришлось процитировать известного украинского футбольного специалиста: “Будем разбираться!”

В отличие от последнего, разобраться с описанной проблемой мне удалось. По умолчанию при подключении к SQLite в FireDAC используется формат строк ANSI.

Если принудительно установить Unicode, то все будет работать как надо. Но есть и неприятный момент. Изменив формат строк придется во всех наборах данных пересоздать список полей, а так же заново подключить компоненты, отвечающие за отображение и ввод данных. Поэтому лучше позаботиться о кодировке сразу.

 

Создание FireMonkey приложения с использованием FireDAC. #0

Создание FireMonkey приложения с использованием FireDAC. #0.5

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

Простой редактор данных в таблице, обычно является частью комплексного приложения. Для редактирования таблиц я обычно использую отдельную форму. Начнем со списка продуктов.  Прежде всего, нам необходимо создать DataSet для доступа к данным таблицы. В нашем случае вполне можно воспользоваться компонентом TADTable. Поместим его в DataModule и укажем значение свойства Connection. В редакторе свойства TableName появится список таблиц, из которого выбираем таблицу Products. Если вы все сделали правильно, то сможете присвоить свойству Active значение True. Компонент лучше сразу переименовать (например, ADTProduct). После этого я, обычно, создаю для DataSet’а набор полей. Вызываем редактор полей (двойное нажатие мыши на компоненте) и в контекстном меню выбираем пункт Add All Fields.

(в настоящее время ссылка не доступна)

Для тех, кто не в курсе поясню суть данной операции. Здесь мы создаем предустановленный набор полей DataSet’a. Если мы этого не сделаем вручную в режиме проектирования, то, в принципе, ничего страшного не произойдет. В RunTime этот набор будет создан автоматически. Но я, все же, предпочитаю создавать его вручную. Причин тому несколько. Во-первых, так удобнее управлять набором полей, ведь мы можем создавать дополнительные (вычисляемые или lookUp) поля самостоятельно в режиме проектирования. Можем так же менять свойства самих полей. А кроме того, мы получаем возможность обращаться в коде к полям по имени компонента TField, что, на мой взгляд, существенно упрощает написание кода.

Как и в случае с VCL приложением, подключим к набору данных компонент TDataSource. Этот компонент обеспечит связь между набором данных и визуальными элементами управления. Свойство DataSet компонента должно ссылаться на наш набор данных (ADTProduct). Ниже я привожу фрагмент DFM файла

 

  object ADTProduct: TADTable
    IndexFieldNames = 'ID'
    Connection = ADConnection
    UpdateOptions.UpdateTableName = 'Product'
    TableName = 'Product'
    Left = 64
    Top = 192
    object ADTProductID: TADAutoIncField
      FieldName = 'ID'
      Origin = 'ID'
      ProviderFlags = [pfInWhere, pfInKey]
      ReadOnly = True
    end
    object ADTProductTitle: TStringField
      FieldName = 'Title'
      Origin = 'Title'
      Size = 50
    end

  object dsProduct: TDataSource
    DataSet = ADTProduct
    Left = 120
    Top = 192
  end

Обратите внимание на одну любопытную особенность, файл формы DataModule сохраняется не в формате FMX, как обычная FireMonkey форма, а в формате DFM, как и в VCL.

Следующим шагом будет создание процедуры открытия набора данных, которую мы должны будем вызывать в RunTime при запуске программы. Создадим ее в том же DataModul’е. Код процедуры предельно прост:

procedure TDM.ConnectToDB;
begin
  ADConnection.Open();
  ADTProduct.Open();
end;

Вызов процедуры разместим в обработчике события OnCreate для DataModule. Читать далее

Продукты DevArt
Купить онлайн:



Читай русскоязычные Delphi блоги
Каталог блогов Blogdir.ru
Яндекс.Метрика