Jump to content

Leaderboard

Popular Content

Showing content with the highest reputation since 09/26/20 in all areas

  1. Продолжаем серию статей, посвященных новинкам релиза FGX Native 1.11.0.0. И в этой статье поговорим о самой главной и ожидаемой новинке - поддержка полноценных анимаций 🔥🔥🔥. TfgAnimationManager - центр управления анимациями Главным центром управления анимации любого компонента является менеджер анимаций, доступ к которому можно получить через свойство TfgControl.AnimationManager. Именно он отвечает за создание, добавление и удаление аниматоров. Создание аниматора Чтобы создать нужный аниматор нужно воспользоваться одним из следующих методов TfgAnimationManager: function AddOpacityAnimation(const AStartOpacity, AFinishOpacity: Single; const ADuration: Integer = TfgAnimation.DurationPlatformValue): TfgAnimation; function AddBoundsAnimation(const AStartBounds, AFinishBounds: TRectF; const ADuration: Integer = TfgAnimation.DurationPlatformValue): TfgAnimation; function AddScaleAnimation(const AStartScaleX, AFinishScaleX, AStartScaleY, AFinishScaleY: Single; const ADuration: Integer = TfgAnimation.DurationPlatformValue): TfgAnimation; function AddRotationAnimation(const AStartAngle, ASweepAngle: Single; const ADuration: Integer = TfgAnimation.DurationPlatformValue): TfgAnimation; function AddTranslationAnimation(const AStartPoint, AFinishPoint: TPointF; const ADuration: Integer = TfgAnimation.DurationPlatformValue): TfgAnimation; function AddGroupAnimation: TfgAnimationGroup; Каждый метод создает соответствующий своему названию тип аниматора с указанными стартовыми и конечными значениями. Например, если вы хотите плавно показать кнопку в течении 1 секунды, достаточно выполнить следующий код. uses FGX.Animation; var Animation := Button.AnimationManager.AddOpacityAnimation(0 {start opacity}, 1 {finish opacity}, 1000 {msec}); Animation.Start; Обратите внимание, что в данном случае, созданный аниматор "Animation" останется у компонента и не будет удален, пока вы не сделаете это сами или компонент не будет уничтожен. Если вы планируете часто использовать один и тот же вид анимации на конкретном компоненте, то предпочтительным способом будет являться именование анимации. Например: uses FGX.Animaton.Helpers; // Создаем аниматор один раз Button.AnimationManager.AddOpacityAnimation(0 {start opacity}, 1 {finish opacity}, 1000 {msec}) .SetName('fade-in'); // Будущие запуски анимации Button.AnimationManager['fade-in'].Start; Если же вам достаточно выполнить анимацию всего лишь один раз, то имеет смысл пометить ее для автоматического удаления опцией TfgAnimationOption.ReleaseOnFinish: uses FGX.Animation.Types, FGX.Animation.Helpers; Button.AnimationManager.AddOpacityAnimation(0 {start opacity}, 1 {finish opacity}, 1000 {msec}) .AddOption(TfgAnimationOption.ReleaseAnimationOnFinish) .Start; Хелпер анимации Для удобного создания аниматоров мы предлагаем вам готовый хелпер FGX.Animation.Helpers, который позволяет использовать цепочку вызовов методов аниматора и облегчить визуальное восприятие готового кода. Без хелпера: uses FGX.Animation; var OpacityAnimation: TfgAnimation; OpacityAnimation := Button.AnimationManager.AddOpacityAnimation(0 {start opacity}, 1 {finish opacity}); OpacityAnimation.Duration := 1000 {msec}; OpacityAnimation.AutoReverse := True; OpacityAnimation.Delay := 500 {msec}; OpacityAnimation.Options := OpacityAnimation.Options + [TfgAnimationOption.ReleaseAnimationOnFinish]; OpacityAnimation.Start; С хелпером: uses FGX.Animation.Types, FGX.Animation.Helpers; Button.AnimationManager.AddOpacityAnimation(0 {start opacity}) .SetDuration(1000 {msec}) .SetDelay(500 {msec}) .SetAutoReverse .SetReleaseAnimationOnFinish .Start; Чтобы воспользоваться хелперами, необходимо подключить модуль FGX.Animation.Helpers. Обзор базовых аниматоров Поддерживается 5 базовых типов анимаций: Opacity. Изменение прозрачности (TfgControl.Opacity). Bounds. Изменение положения и размера (TfgControl.Position + TfgControl.Size). Scale. Изменение масштаба отображения компонента. Rotation. Изменение угла поворота компонента. Translate. Выполнение смещения компонента относительно его текущей позиции (TfgControl.Position). Анимация прозрачности (TfgAnimationManager.AddOpacityAnimation) Чтобы выполнить анимацию прозрачности нужно создать аниматор через метод TfgAnimationManager.AddOpacityAnimation и указать стартовое и конечное значение свойства TfgControl.Opacity. Image.AnimationManager.AddOpacityAnimation(0 {start opacity}, 1 {finish opacity}, 2000 {msec}) .Start; opacity.mp4 Анимация перемещения и изменения размера (TfgAnimationManager.AddBoundsAnimation) Чтобы выполнить анимацию изменения размера и позиции нужно создать аниматор через метод TfgAnimationManager.AddBoundsAnimation и указать стартовый и конечный прямоугольник. Пример ниже демонстрирует интересный прием акцентирования внимания на компоненте через визуальное расширение и сжатие компонента. var StartRect: TRectF; StopRect: TRectF; begin StopRect := imgPhoto.Bounds; StartRect := imgPhoto.Bounds; StartRect.Inflate(16, 16); Image.AnimationManager.AddBoundsAnimation(StartRect, StopRect) .Start; bounds.mp4 Анимация изменения масштаба (TfgAnimationManager.AddScaleAnimation) Чтобы выполнить анимацию изменения масштаба нужно создать аниматор через метод TfgAnimationManager.AddScaleAnimation и указать стартовые и конечные значения коэффициентов масштабирования по горизонтали и вертикали. Image.AnimationManager.AddScaleAnimation(0.5, 1, 0.5, 1, 1000) .Start; scale.mp4 Анимация поворота компонента (TfgAnimationManager.AddRotationAnimation) Чтобы выполнить анимацию поворота компонента нужно создать аниматор через метод TfgAnimationManager.AddRotationAnimation и указать стартовое значение угла и на сколько градусов нужно совершить поворот (в градусах). При этом, если угол поворота положительный, то поворот осуществляется по часовой стрелки, а если отрицательный, то против часовой стрелки. Image.AnimationManager.AddRotationAnimation(0 {start}, 360 {Sweep}, 1000) .Start; rotate.mp4 Анимация смещения (TfgAnimationManager.AddTranslationAnimation) Чтобы выполнить анимацию смещения компонента нужно создать аниматор через метод TfgAnimationManager.AddTranslationAnimation и указать стартовое и конечное смещения значения позиции компонента. Image.AnimationManager.AddTranslationAnimation(TPointF.Create(-16, 0), TPointF.Create(16, 0), 1000) .Start; translate.mp4 TfgAnimation - основа анимации После того, как мы посмотрели несколько примеров создания аниматоров вживую, пришло время рассмотреть их настройки детальнее. Длительность анимации (TfgAnimation.Duration) Общая длительность выполнения текущей анимации в миллисекундах в одну сторону (от стартового значения до конечного). Задержка перед запуском (TfgAnimation.Delay) Если вам необходимо выполнить анимацию с задержкой, то вы можете это сделать указав значение задержки в миллисекундах в свойстве TfgAnimation.Delay. Количество повторений (TfgAnimation.RepeatCount) Если вам необходимо повторить анимацию несколько раз или сделать ее бесконечной, то вы можете это сделать при помощи этого свойства, где RepeatCount = 0 - повторение анимации бесконечное число раз. RepeatCount > 0 - повторение анимации ровно "RepeatCount" раз. Например при помощи этого свойства легко сделать анимацию тряски: повторим 4 раза движение компонента по горизонтальной оси. shake+repeatCount.mp4 Интерполяция (TfgAnimation.CurveKind) Это свойство отвечает за формулу интерполяции значений анимируемых свойств. Пока поддерживается 4 самых распространенных типов интерполяции. TfgAnimationCurveKind = (Linear, EaseIn, EaseOut, EaseInOut); Краткое описание стратегии изменения анимируемого значения на протяжении всей длительности анимации в зависимости от типа интерполяции: Linear - равномерное изменение. Варианты типичного применения: короткие анимации, изменение цвета. EaseIn - медленное начало с постепенным нарастанием скорости к концу анимации. Варианты типичного применения: исчезновения объекта. EaseOut - быстрое начало с постепенным замедлением скорости к концу анимации. Варианты типичного применения: появления объекта. EaseInOut - медленное начало с нарастанием скорости посередине и постепенным замедлением скорости к концу анимации. Варианты типичного применения: перемещение объекта, изменение масштаба. Порядок запуска (TfgAnimation.RunOrder) Это свойство актуально только в контексте групповых аниматоров и позволяет указывать порядок запуска текущей анимации в группе. Подробнее это будет рассмотрено в разделе "Групповые анимации". TfgAnimationRunOrder.Immediately - запуск анимации в момент старта родительского группового аниматора, либо вместо с предыдущим одноуровневым аниматором. TfgAnimationRunOrder.AfterPrevious - запуск анимации после окончания предыдущей анимации в рамках группового аниматора. Дополнительные настройки (TfgAnimation.Options) TfgAnimationOption.StartFromCurrent - Начинать анимацию с текущего значения свойства компонента, а не указанного стартового значения. TfgAnimationOption.AlwaysSetFinalValue - При остановке анимации, эта опция позволяет указать сразу конечное значение свойства компоненту, иначе конечное значение останется таким, какое оно было на момент остановки. TfgAnimationOption.AutoReverse - Нужно ли автоматически выполнить анимацию в обратном порядке после окончания прямой анимации. Актуально для RepeatCount > 0. TfgAnimationOption.ReleaseControlOnFinish - позволяет автоматически удалить компонент по окончании анимации. TfgAnimationOption.ReleaseAnimationOnFinish - позволяет автоматически удалить аниматор по окончании анимации. Название (TfgAnimation.Name) Вы можете присвоить уникальное название аниматору, чтобы в последствии обращаться к нему напрямую по его имени. Например: var FadeAnimation: TfgAnimation; FadeInAnimation := Button.AnimationManager['fade-in']; Групповые анимации Для создания сложных анимаций мы предлагаем использовать групповые аниматоры, задача которых сгруппировать несколько анимаций и задать правила их запуска. По умолчанию групповой аниматор запускает все вложенные анимации одновременно. Например, такой аниматор ниже позволяет реализовать анимацию модального открытия формы на Android: var AnimationGroup: TfgAnimationGroup; AnimationGroup := LForm.AnimationManager.AddGroupAnimation .Add(LForm.AnimationManager.CreateScaleAnimation(1.125, 1, 1.125, 1)) .Add(LForm.AnimationManager.CreateOpacityAnimation(0, 1)); Мы создаем два аниматора, объединенные в группу, один из которых масштабирует форму, а второй меняет ее прозрачность. Групповой аниматор TfgAnimationGroup по сути так же является аниматором TfgAnimation. А это значит, что вы можете их вкладывать друг в друга добиваясь анимации любой сложности. Пример ниже показывает последовательно выполнение анимаций: вначале смещение компонента, а затем поворот: Image.AnimationManager.AddGroupAnimation .Add(Image.AnimationManager.AddTranslationAnimation(TPointF.Create(-16, 0), TPointF.Create(16, 0), 1000)) .Add(Image.AnimationManager.AddRotationAnimation(0, 360, 1000) .SetRunOrder(TfgAnimationRunOrder.AfterPrevious)) .Start; group-animation-1.mp4 Вы можете выделить создание подобной анимации в отдельный метод и затем применять к любому компоненту. Шаблоны анимаций Это приятный бонус для наших пользователей. Мы предлагаем базовый набор уже готовых анимаций, которые вы можете использовать в своих проектах всего лишь одной строчкой кода. Для того, чтобы воспользоваться шаблонами, нужно подключить модуль FGX.Animation.Templates. Чтобы просто потрясти компонент, достаточно просто написать: Image.Shake; А если требуется настроить параметры на свой вкус и цвет, можно воспользоваться перегруженной версией: Image.Shake(TfgShakeAnimationParams.Default .SetDuration(2000) .SetRepeatCount(10)); Видео ниже демонстрирует все текущие доступные для использования шаблоны: templates.mp4 Среди шаблонов так же доступны различные варианты появления и скрытия компонентов с переносами и без. Вы можете ознакомиться с текущим набором в демо проекте: "Анимация" -> "Шаблоны анимаций". Ограничения Несмотря на то, что анимации уже работают, у них есть ряд ограничений, часть из которых мы будем постепенно убирать в будущих версиях. Нельзя менять стартовые и конечные значения уже созданных анимаций. Это можно делать только путем удаление старого и создания нового аниматора. Изменение свойств анимации во время ее выполнения не приведет их к применению. Все свойства применяются в момент старта анимации. Изменение размера компонента-контейнера через анимацию не приводит к выравниванию дочерних компонентов. Если вам нужно выполнить выравнивание содержимого, то надо добавлять дополнительные аниматоры для перемещения и изменения размеров вложенных компонентов отдельно. Устаревшее API Из-за создания полноценной анимации и выделения старых хелперов анимации TfgAnimationHelper в шаблоны анимации FGX.Animation.Templates, мы помечаем существующие методы анимации FadeIn, FadeOut, как устаревшие. Через несколько релизов мы удалим эти методы из TfgAnimationHelper, чтобы вы пользовались более удобными средствами анимации. На текущий момент методы анимации формы остаются как есть. В ближайших релизах эту анимацию мы встроим прямо в TfgForm, в результате чего анимация открытия/закрытия форм будет осуществляться автоматически и не будет требовать от вас лишних строчек кода. Итог Мы продолжим развивать и совершенствовать реализацию анимаций. Поэтому нам очень важно получить от вам обратную связь о том, что удобно, что нет и чего не хватает. Эта информация поможет нам сделать анимацию лучше и удобнее для всех.
    20 points
  2. Название приложения: Tezeks экскурсии на русском языке Платформа: Android32, Android64, iOS64 (iPhone) Поддерживаемые версии ОС: Android 6.0 и новее; iOS 12 и новее Описание: Tezeks – это официальный сервис по бронированию групповых и индивидуальных экскурсий на русском языке от известного туристического бренда Tez Tour. Бронируйте экскурсии, входные билеты в музеи, аэропортовые трансферы и много другое в 40+ странах мира. Ссылки на приложения: Google Play и AppStore
    15 points
  3. В следующем релизе FGX Native 1.11.0.0 будет много новых интересных возможностей, которые безусловно найдут свое место в ваших приложениях. В этой статье поговорим о первой новинке: получение фотографии с камеры или из системной галереи изображений. До версии 1.11.0.0 получение фотографии с камеры, было не самой тривиальной задачей. Было два решения, которым обычно пользовались разработчики: Использование напрямую камеры и разработка своего решение на базе демонстрационного проекта "Компоненты" -> "TfgCamer" -> "Фотокамера". Несмотря на то, что этот способ рабочий и он дает возможности по кастомизации внешнего вида видеоискателя, зачастую требуется просто получить фотографию от пользователя. Использование нативного API каждой платформы для отправки запроса на получение фотографии системным приложениям. TfgPhotoPicker В этом релизе мы предлагаем кроссплатформенное решение в виде специального типа пикера, используемого для выбора фотографии из системной галереи изображений или снятия фотографии с системной камеры. video_2021-05-12_01-16-46.mp4 Чтобы отправить запрос на получение фотографии с камеры достаточно написать всего три строчки кода: uses FGX.Assets, FGX.Assets.Helpers, FGX.Pickers.Photo; procedure TFormMain.btnTakePhotoFromCameraTap(Sender: TObject); begin TfgPickerPhotoFactory.PickPhotoFromCamera(btnTakePhotoFromCamera, procedure(const AFileName: TFileName) begin TfgAssetsManager.Current.AddBitmapFromFile('Photo', AFileName, True); end); end; Для получения фотографии из галереи: procedure TFormMain.btnTakePhotoFromLibraryTap(Sender: TObject); begin TfgPickerPhotoFactory.PickPhotoFromLibrary(btnTakePhotoFromLibrary, procedure(const AFileName: TFileName) begin TfgAssetsManager.Current.AddBitmapFromFile('Photo', AFileName, True); end); end; Запрос отправляет через специальную фабрику FGX.Pickers.TfgPickerPhotoFactory, которая предлагает три метода: TfgPickerPhotoFactory = class public /// <summary>Создает и возвращает платформенный пикер получения фотографии для ручной работы.</summary> /// <remarks>Удаление пикера лежит на плечах вызываемого кода.</remarks> class function CreatePicker(const AOwner: TObject): TfgPickerPhoto; /// <summary> /// Иницирует получение фотографии с системного приложения камеры. Фотография возвращается в переданную /// анонимную процедуру <c>AOnDidFinishPickingCallback</c>. /// </summary> /// <remarks> /// Вам не требуется следить за временем жизни возвращаемого пикера. Пикер автоматически удалится после того, /// как он будет закрыт пользователем. /// </remarks> class function PickPhotoFromCamera(const AOwner: TObject; const AOnDidFinishPickingCallback: TfgDidFinishPickingCallback): TfgPickerPhoto; /// <summary> /// Иницирует получение фотографии с системного приложения галереи изображений. Фотография возвращается в /// переданную анонимную процедуру <c>AOnDidFinishPickingCallback</c>. /// </summary> /// <remarks> /// Вам не требуется следить за временем жизни возвращаемого пикера. Пикер автоматически удалится после того, /// как он будет закрыт пользователем. /// </remarks> class function PickPhotoFromLibrary(const AOwner: TObject; const AOnDidFinishPickingCallback: TfgDidFinishPickingCallback): TfgPickerPhoto; end; Второй и третий метод предназначены для быстрого получения фотографии с камеры или из галереи. Первый же метод предназначен для ручной настройки пикера и отлова всех событий (открытие, закрытие, отмена и тд.). Внимание! Для корректной работы пикера на платформе Android необходимо в настройках проекта включить опцию: Project -> Options... -> Application -> Entitlement List -> Security File Sharing = True. Также мы подготовили демонстрационный проект, который позволит вам попробовать эту возможность самостоятельно: "Компоненты" -> "Пикеры" -> "Получение фотографии". Всем хорошей рабочей недели. Следите за будущими анонсами FGX Native 1.11.0.0.
    14 points
  4. Нам очень приятно поделиться с вами этой новостью. Одно из приложений, написанных на FGX Native, победило в ежемесячном конкурсе Delphi приложений от Embarcadero. Это приложение - аудио-гид по достопримечательностям разных городов с поддержкой нескольких языков. Поздравляем Романа с успехом и желаем ему не останавливаться на достигнутом! Приложение в Play Market: https://play.google.com/store/apps/details?id=ru.wc2.welcome&hl=ru&gl=US Ссылка на конкурс Embarcadero: https://delphi.embarcadero.com/delphi26th-welcome-a-spectacular-mobile-app-for-travelers-made-in-delphi/ Автор: @Roman
    13 points
  5. Скоро выйдет релиз 1.9.4.0 с интересными и полезными нововведениями для наших пользователей. Обо все по порядку. Push-уведомления Если вы уже использовали push-уведомления в своих приложениях, то, возможно, вы обратили внимание, что архитектура сервисов push-уведомлений в RTL с одной стороны довольно гибкая, с другой стороны требует написание определенного количество лишнего кода, которого можно было бы избежать. По этой причине мы разработали новый компонент для работы с push-уведомлениями TfgPushNotificationService. Это высокоуровневая обертка на абстракциями push-сервисов в RTL, которая облегчает работу с уведомлениями в приложении FGX Native. Для того, чтобы начать принимать push-уведомления в вашем приложении достаточно: Выполнить первичную настройку сервисов (Firebase для Android или Apple Push Notification Service для iOS). Бросить компонент на форму и написать обработчик для события OnPushNotificationReceived, которое вызывается при приеме уведомления. Это минимальный набор шагов, который для этого требуется. Если вам необходимо добавить диагностическую информацию, получить токен устройства и тд, то вы можете воспользоваться остальными событиями этого компонента. ServiceName - это название сервиса push-уведомлений, которые реализован в библиотеке. "fcm" - сервис по приему уведомлений через Firebase (Android) "aps" - сервис по приему уведомлений через Apple Push Notification Service (iOS). "Default" - автоматический выбор сервиса в зависимости от текущей платформы. Для Android - "fcm", для iOS - "aps". Мы обновили демо проект по использованию push-уведомлений: "Push-уведомления" -> "Получение Push-уведомления". Помимо этого мы полностью отладили реализацию Push-уведомлений для iOS и теперь вы можете использовать ее в своих приложениях. TfgPageControl (важно!) В этом обновлении мы пересмотрели работу событий OnChanged и OnPageSelected. Теперь эти события вызываются только при смене вкладок пользователем интерактивным путем. События не срабатывают при любом программном изменении вкладок (добавление, удаление, очистка, переключение и тд). Поэтому, если у вас есть логика, которая основывается на постоянном вызове этих событий при любых изменения (интерактивных и программных), то во всех местах, где вы выполняете программное изменение вкладок, вам необходимо вызвать вручную новый метод TfgPageControl.Changed, это приведет к немедленному срабатыванию данных событий. В таком подходе есть много достоинств: Защита от рекурсивных вызовов. Если при переключении вкладок, вы выполняете добавление/удаление или изменение вкладок, то такие изменения могли приводить к рекурсивному срабатыванию этих событий, что в конечном итоге обычно решается введением дополнительного флаг на для отслеживания таких изменений. Сокращение числа вызовов этих событий на любые изменения вкладок. Раньше любое добавлении/удалении вкладки, могло приводить к срабатыванию этих событий, даже когда это реально не нужно. TfgCollectionView и TfgListMenu Очень часто вы задавали вопросы о том, как детальнее настроить работу компонента TfgListMenu. В релизе 1.9.0.0 мы добавили ряд настроек для управления цветовой схемой данного компонента. А для тех, кому и этого не хватает, мы специально мигрировать все шаблоны стилей пунктов меню из TfgListMenu в TfgCollectionView. Новые шаблоны доступны в контекстном меню компонента TfgCollectionView -> Add Style -> Menu. Все стили приведены на скриншоте ниже: TfgVideoControl В этом релизе мы добавили реализацию данного компонента для iOS и добавили возможность регулировать громкость видео через новое свойство TfgVideoControl.Volume. TfgPhoneDialer Мы так же реализовали TfgPhoneDialer для iOS. Всем спасибо за внимание и хороших выходных .
    13 points
  6. Всем привет! Пора бы и мне поделиться тем что собрали на FGX. Проект не финальный. Главной задачей было перетянуть его прежде всего на FGX , чтобы обкатать возможности библиотеки. Огромная благодарность ребятам, которые занимаются развитием сей либы! Без вас наши приложения были бы более скучными и менее производительными) Приложение по сути InHouse поэтому не могу пока выложить APK. Надеюсь скоро и это будет. По факту - пошумлю тут.
    13 points
  7. Название приложения: RZD GPS+ Платформа: Android32, Android64 Поддерживаемые версии ОС: Android 6.0 и новее Описание: RZD GPS+ – это приложение помощник для локомотивных бригад ДВЖД, осуществляет запись текущей поездки, оповещения ограничений скорости, таймера продувки, профиль участка пути (в разработке), расчет технической скорости и раздел полезной информации.
    12 points
  8. Здравствуйте. Еще одним нововведением в релизе 1.11.2.0, помимо TfgPopup, является работа с пикселями ("сырыми данными") TfgBitmap. Доступ к пикселям открывает практически неограниченные возможности для обработки и анализа изображений. Так же в новом релизе будет добавлена возможность поворота изображения. Воможность работы с пикселями TfgBitmap. Общие сведения. Обращение к сырым данным возможно только между парными вызовами TfgBitmap.MapData и TfgBitmap.UnmapData, которые могут быть знакомы пользователям FMX. Однако, важным отличием от FMX, является отсутствие уровня доступа (только чтение/только запись/чтение и запись). Это сделано с целью ускорения доступа, т. к. работа осуществляется непосредственно с данными нативного изображения без создания промежуточного буфера. В результате вызова TfgBitmap.MapData вы получаете интерфейс IFGXBitmapData (более подробно рассмотрен ниже), который предоставляет доступ к пикселям изображения. Важно! Актуальность объекта IFGXBitmapData гарантирована только между вызовами TfgBitmap.MapData и TfgBitmap.UnmapData, т.к. используется "натуральный" интерфейс без подсчета ссылок. Важно! Во время доступа к сырым данным операции по изменению TfgBitmap запрещены (например загрузка из различных источников, изменение размера, масштаба, поворота и тд). Типичный пример работы с сырыми данными изображения: var LBitmapData: IFGXBitmapData; begin if LBitmap.MapData(LBitmapData) then try // Работа с пикселями изображения. finally LBitmap.UnmapData; end; end; Важно! Всегда проверяйте результат выполнения TfgBitmap.MapData во избежание непредвиденных последствий. Повторный вызов TfgBitmap.MapData для уже спроецированных данных вернет ложь. Интерфейс IFGXBitmapData. Интерфейс IFGXBitmapData предоставляет информацию об изображении (Info, Width, Height), а так же позволяет манипулировать пикселями изображения (RawData, Scanlines, Pixels, Colors). Информация о битмапе TfgBitmapInfo: BitsPerPixel — количество бит на один пиксель изображения. К примеру, для одного из самых распространенных вариантов ARGB, этот параметр будет равен 32-ум битам. BytesPerRow — количество байт на одну строку изображения. Обычно это Width * BitsPerPixel, но, в случае применения выравнивания для ускорения доступа к данным, значение может быть иным. PixelFormat — формат пикселя изображения. В отличии от фиксированного формата ARGB присущего стандартному типу TAlphaColor, нативные изображения могут иметь различный состав и порядок следования цветовых компонентов. Возможные комбинации этих параметров отражает тип TfgBitmapPixelFormat. TfgBitmapPixelFormat = (Unknown, Alpha, Gray, ARGB, RGBA, RGB, RGB24); IsAlphaPremultiplied — флаг, показывающий являются ли компоненты пикселя предварительно помноженными на компоненту прозрачности. Интерфейс IFGXBitmapData содержит несколько вариантов доступа к самим данным, которые отличаются по степени абстракции: RawData — самый низкий уровень. Возвращает указатель на начало данных. Размер данных можно узнать из свойства RawDataSize. Scanlines — указатель на переданную в аргументе строку. Размер данных строки в байтах можно получить из Info.BytesPerRow, количество пикселей в строке — Width. Pixels — указатель на пиксель. В аргументах передаются координаты пикселя. Размер пикселя в битах можно получить из Info.BitsPerPixel. Colors — цвет пикселя в стандартном формате TAlphaColor. В аргументах передаются координаты пикселя. Как правило, для достижения максимальной скорости при последовательном сканировании пикселей изображения, вместо индексного доступа (Pixels, Colors) используют инкрементный перебор начиная с некой точки отсчёта (начало изображения RawData, начало определенной строки Scanlines[Y], определенный пиксель Pixelsх[X, Y]) . В этом случае вы получаете указатель, вместо привычного TAlphaColor. Для преобразования данных по указателю в тип TAlphaColor вам могут пригодиться готовые варианты для конвератции, которые находятся в хэлпере TAlphaColorHelper из модуля FGX.Types.Color. Для формирования TAlphaColor из сырых данных используйте перегруженный конструктор: constructor Create(const APixel: PByte; const APixelFormat: TfgBitmapPixelFormat; const AIsAlphaPremultiplied: Boolean); overload; Для обратной операции подойдет метод: /// <summary>Записывает текущий цвет по адресу <c>APixel</c> с учетом опций <c>APixelFormat</c> и <c>AIsAlphaPremultiplied</c>.</summary> procedure ToPixel(const APixel: PByte; const APixelFormat: TfgBitmapPixelFormat; const AIsAlphaPremultiplied: Boolean); Реальный пример работы с сырыми данными. Ниже приведен кусок кода из нового демонстрационного примера "Графика" -> "TfgBitmap - работа с "сырыми" данными" в котором изображение преобразуется из цветного в оттенки серого. uses FGX.Types.Color, FGX.Canvas.Types, FGX.Canvas.Types, FGX.Assets, FGX.Assets.BitmapSet; procedure TFormMain.fgButton1Tap(Sender: TObject); var LBitmapSet: TfgAssetBitmapSet; LBitmap: TfgBitmap; LBitmapData: IFGXBitmapData; I, J: Integer; begin if not TfgAssetsManager.Current.Find<TfgAssetBitmapSet>('Image', LBitmapSet) then Exit; LBitmap := LBitmapSet.GetBitmap; if LBitmap.MapData(TfgBitmapDataAccessMode.ReadWrite, LBitmapData) then try for J := 0 to LBitmap.Height - 1 do for I := 0 to LBitmap.Width - 1 do LBitmapData.Colors[I, J] := LBitmapData.Colors[I, J].ToGrayscale; finally LBitmap.UnmapData; end; fgPaintBox1.Invalidate; end; Повороты изображения. Благодаря добавлению работы с сырыми данными появилась возможность с легкостью вращать изображения. Поворот осуществляется с помощью метода TfgBitmap.Rotate: /// <summary>Поворачивает изображение на указанный угол.</summary> procedure Rotate(const AAngle: TfgRotation); В качестве аргумента передается одно из предустановленных значений угла поворота. TfgRotation = (Rotation0 = 0, Rotation90 = 90, Rotation180 = 180, Rotation270 = 270); Поворот осуществляется по часовой стрелке. Благодарим за внимание и приятного коддинга 🙂.
    12 points
  9. Скачать: Релиз доступен только по запросу. Дата релиза: 18 апреля 2021 Внимание 🚨 В этом релизе удалена поддержка значения TfgSystemStatusBarVisibility.VisibleAndPush для TfgForm.SystemStatusBar.Visibility. Если вы использовали это значение в формах, то переоткройте в IDE эти формы проигнорируйте отсутствие данного значения. Новое ✨ Поддержка iOS стиля в IDE Мы добавили поддержку стиля iOS в дизайнер формы. Переключатель стиля расположен на панели инструментов дизайнера формы справа от выпадающего списка класса устройств. Переключатель отображается только для "Universal" класса устройств. На текущий момент времени iOS стиль поддерживает только половину основных компонентов, оставшиеся стили будут добавлены в течении следующих релизов. Прочее Реализовано TfgForm.SystemStatusBar для iOS (iOS). Удалено значение TfgSystemStatusBarVisibility.VisibleAndPush. Добавлены заголовочные файлы для iOS API: PhotoKit и ImageIO. Улучшения 🙌 Дизайнер форм Мы улучшили работу дизайнера формы, пересмотрев логику работы изменения размера формы. Раньше в изменяемый размер входил декоративный элемент "панель навигации", что могло вводить в заблуждение относительно того, какой реально размер задается форме. Сейчас же при изменении размера формы, выводится именно ее размер без учета декоративных элементов. Прочее В старых проектах, часть путей для иконок iOS приложения была не актуальна. Поэтому запуск демонстрационных проектов FGX Native мог заканчиваться неудачей. Теперь при открытии любого старого проекта, автоматически происходит миграция настроек с учетом обновленных путей иконок до актуальных. Все демонстрационные проекты обновлен до последней версии FGX Native. Исправление ошибок 🐛 FGX-28 Прокрутка ScrollBox'a в Design формы. FGX-41 TfgCalendar Падает приложение на Android версии 5.0 (Android). FGX-42 Первое открытие формы в дизайнере. FGX-43 TfgWebBrowser Access Violation (iOS). FGX-44 PullToRefresh не срабатывает если нет данных в коллекции (iOS). FGX-45 Распаковка ресурсов (iOS). FGX-46 Ошибка при использовании местоположения в TfgMap (iOS). FGX-47 Странное поведение TfgAssetsManager.Current.AddBitmapFromUrl при нажатии на маркер карты (iOS). Если форма не помещалась в дизайнере формы целиком, то в областях снизу и справа сетка не отображалась. При каждом открытии FGX Native проекта, среда всегда помечала такой проект, как измененный, несмотря на то, что никаких изменений реально не было. Мы это исправили.
    12 points
  10. Скачать: Релиз доступен только по запросу. Дата релиза: 18 мая 2021 Внимание 🚨 Вспомогательные типы анимации были перенесены из FGX.Animation -> FGX.Animation.Types. Если ваш проект не собирается из-за отсутствия этих типов, подключите модуль FGX.Animation.Types. Новое ✨ Анимация Добавлена базовая реализация анимаций. Добавлен новый демонстрационный проект: "Анимация" -> "Готовые шаблоны анимации". Описание и детали использования доступны в статье. Получение фотографии с камеры или библиотеки Добавлена возможность программно запросить у системы получениe фотографии с камеры или системной галереи изображений. Для этого необходимо воспользоваться одним из методов FGX.Pickers.Photo.TfgPickerPhotoFactory. Добавлен новый демонстрационный проект: "Компоненты" -> "Пикеры" -> "Получение фотографии". Описание и детали использования доступны в статье. Компонент локализации В этой версии мы поставляем отдельный bpl-пакет с компонентом локализации TfgTranslator, который мы сами уже давно успешно используем в реализации FGX Native дизайнера. Однако, мы не рекомендуем его использовать в мобильных приложениях, поскольку все словари с переводами всегда загружаются при создании формы, и поскольку у нас есть видение того, как перевод должен осуществляться в мобильных приложениях. Несмотря на это, это рабочее решение, которое может помочь вам с локализацией ваших проектах. Мы поставляем этот компонент по правилу "as-is", то есть нет никаких гарантий, в том числе же поддержки с нашей стороны о его работе. Этот пакет не является постоянным и может в будущем быть исключен из поставки. Описание и детали установки доступны в статье. Прочее Реализован TfgDialog.InputQuery и TfgDialog.InputBox (iOS). Добавлены методы и типы Android API для работы с "Drag&Drop" (Android). Исправление ошибок 🐛 FGX-9 Не работает обратная прокрутка ScrollBox в TfgBottomSheet (Android). FGX-56 TfgForm теряется свойство SystemStatusBar.Visibility (Android). FGX-59 TfgTimeEdit Segmentation fault при удалении формы, содержащей TfgTimeEdit (Android). Исправление метода MeasureSize, который мог работать некорректно для некоторых компонентов (iOS). Иногда событие TfgNavigationBar.ActionButtons.OnTap могло не работать на Android 6 (Android).
    11 points
  11. Скачать: Релиз доступен только по запросу. Дата релиза: 6 ноября 2020 Список изменений: ~ Потеря обратной совместимости: - Удалено значение TfgTextTrimming.Word. Данное значение не поддерживается ни iOS, ни Android и реально не используется в мобильной разработке, поэтому мы решили удалить это значение, чтобы не вводить разработчиков в заблуждение. - Для канвы добавлены два новых парных метода TfgCanvas.BeginPaint/EndPaint, которые теперь НЕОБХОДИМО вызывать при любой отрисовке на канве битмапа TfgBitmap. Данные методы необходимы для корректной отрисовки в iOS. Если вы выполняете отрисовку в TfgBitmap, вам необходимо обрамить всю отрисовку в BeginPaint/EndPaint. В противном случае, в iOS вы не увидите результат отрисовки. - Тип TfgApplicationState перемещен из FGX.Platform -> FGX.Application. - Для TfgProgressBar по умолчанию включено автоматическое вычисление высоты. - Полностью переработанный компонент TfgButton. https://forum.fgx-native.com/topic/569-%D0%BD%D0%BE%D0%B2%D0%BE%D1%81%D1%82%D0%B8-%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D1%81%D1%82%D1%8C%D1%8E-%D0%BE%D0%B1%D0%BD%D0%BE%D0%B2%D0%BB%D0%B5%D0%BD%D0%BD%D1%8B%D0%B9-%D0%BA%D0%BE%D0%BC%D0%BF%D0%BE%D0%BD%D0%B5%D0%BD%D1%82-tfgbutton/ - IFGXApplicationService.SupportedOrientations теперь использует измененный перечисляемый тип TfgInterfaceOrientation вместо множества TfgInterfaceOrientations. * TfgScreen: - Для экрана добавлено новое свойство SafeAreaPadding, позволяющее получить отступы от края экрана, где не рекомендуется размещать элементы UI. Например, таким образом можно получить высоту системного статус бара и высоту системной панели навигации. * TfgApplication: - Получить текущее состояние приложения теперь можно через Application.State. - Теперь Application умеет создавать формы отложенно при старте приложения. Используется только в iOS. - Реализация блокировки смены ориентации экрана Application.SupportedOrientations для Android в рантайм. https://forum.fgx-native.com/topic/626-lock-screen-orientation-in-runtime/ * TfgArc, TfgArch: - Иногда свойства StartAngle, SweepAngle и Depth могли быть не сериализованы. Исправлено. * TfgButton: - Полностью переработанный компонент. https://forum.fgx-native.com/topic/569-%D0%BD%D0%BE%D0%B2%D0%BE%D1%81%D1%82%D0%B8-%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D1%81%D1%82%D1%8C%D1%8E-%D0%BE%D0%B1%D0%BD%D0%BE%D0%B2%D0%BB%D0%B5%D0%BD%D0%BD%D1%8B%D0%B9-%D0%BA%D0%BE%D0%BC%D0%BF%D0%BE%D0%BD%D0%B5%D0%BD%D1%82-tfgbutton/ * TfgCheckBox, TfgRadioButton: - Добавлено свойство LetterSpacing. * TfgEdit: - При использовании ReturnKeyType = Next, следующий фокусный элемент выбирается среди всех контролов открытых форм приложения. Исправлено. https://forum.fgx-native.com/topic/609-%D0%BA%D1%83%D1%80%D1%81%D0%BE%D1%80-%D0%BF%D1%80%D1%8B%D0%B3%D0%B0%D0%B5%D1%82-%D0%BC%D0%B5%D0%B6%D0%B4%D1%83-edit%D0%B0%D0%BC%D0%B8-2-%D1%83%D1%85-%D1%84%D0%BE%D1%80%D0%BC/?tab=comments#comment-2345 * TfgCollectionView: - Добавлено новое свойство ColumnWidth, которое возвращает ширину столбца. - Добавлены новые вспомогательные методы: - GetSelectionColor - возвращает цвет выделения элемента по индексу. - IsSelectableItem - проверяет, допускает ли элемент выделение. - Добавлено новое событие OnMovedItem, которое вызывается после окончания перемещения элемента на новую позицию при перетаскивании. - Не работает TfgCollectionView.OnTap при тапе на пустую область. Исправлено. * TfgWebBrowser: - Добавлена возможность обработки Basic-аутентификации. - Добавлен новый пример: "Компоненты" -> "TfgWebBrowser" -> "Basic-аутентификация". * TfgCanvas: - Для канвы добавлены два новых парных метода TfgCanvas.BeginPaint/EndPaint, которые теперь НЕОБХОДИМО вызывать при любой отрисовке на канве битмапа TfgBitmap. Данные методы необходимы для корректной отрисовки в iOS. Если вы выполняете отрисовку в TfgBitmap, вам необходимо обрамить всю отрисовку в BeginPaint/EndPaint. В противном случае, в iOS вы не увидите результат отрисовки. - Добавлены новые методы для отрисовки и закраски скругленного прямоугольника TfgCanvas.DrawRoundRect/FillRoundRect. * TfgPath: - Обновлено представление графического пути SVG Path в FGX Native, реализация стала гибче. - Теперь TfgPath хранит все данные команд. - Исправлены минорные ошибки, которые могли возникать при отрисовки сложных фигур. * TfgBitmap: - Добавлено новое свойство для получения логического размера битмапа TfgBitmap.LogicalBounds. * TfgPageControl: - Не применялся цвет шрифта для вкладок в дизайнере. - При добавлении/удалении вкладок терялись настройки шрифта табов. https://forum.fgx-native.com/topic/602-runtime-pages-creation * TfgProgressBar: - При определенных обстоятельствах нельзя было установить значение свойства Min. - Добавлено свойство Autosize. - Нельзя было обратно вернуть цвета оттенков BackgroundTintColor и TintColor. Исправлено. * TfgDrawerLayout: - При любом перемещении/скрыти компонента в TfgDrawer, панель автоматически закрывалась. Исправлено. https://forum.fgx-native.com/topic/603-%D0%B4%D0%B2%D0%B0-%D0%B8-%D0%B1%D0%BE%D0%BB%D0%B5%D0%B5-%D0%BC%D0%B5%D0%BD%D1%8E/?tab=comments#comment-2332 - При добавлении компонента на форму, его составные части были не названы. Это приводило к тому, что нельзя бы использовать события этих компонентов. Исправлено. https://forum.fgx-native.com/topic/593-%D0%BE%D1%88%D0%B8%D0%B1%D0%BA%D0%B0-%D0%BF%D1%80%D0%B8-%D1%81%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B8-%D1%81%D0%BE%D0%B1%D1%8B%D1%82%D0%B8%D0%B9-%D0%B2-%D0%B4%D0%B8%D0%B7%D0%B0%D0%B9%D0%BD%D0%B5%D1%80%D0%B5-%D0%B4%D0%BB%D1%8F-%D1%87%D0%B0%D1%81%D1%82%D0%B5%D0%B9-tfgdrawerlayout/ * Дизайнер форм: - Добавлена поддержка темной темы. - При нажатии на компонент теперь выводится метка с названием компонента. * Дизайнер ресурсов: - После переоткрытия проекта и внесении изменений в менеджер ресурсов могли пропасть все ресурсы. Исправлено. * Визард нового проекта: - Добавлена платформа "Android11". - Обновлена статистика по покрытию Android-устройств согласно выбранным настройкам платформы. * Демо проекты: - "Application" -> "SupportedOrientations" - "Компоненты" -> "TfgWebBrowser" -> "Basic-аутентификация". * Добавлен новый модуль для работы с цветами FGX.Types.Color. * Android Api: - Добавлены новые обертки: - android.graphics.Outline, - android.graphics.drawable.GradientDrawable, - android.graphics.drawable.ShapeDrawable, - android.graphics.drawable.shapes.Shape - android.graphics.drawable.shapes.RectShape, - android.graphics.drawable.shapes.RoundRectShape
    11 points
  12. Рады поделиться новинками будущего релиза 1.12.0.0. Очень часто при разработке мобильных приложений разработчики сталкиваются с одними и теми же задачами. Большинство решений, которые есть в интернете, ориентированы под FMX. Однако, зачастую из-за зависимостей в RTL на FMX Java код, эти решения нельзя просто добавить в FGX Native как есть и использовать. Поэтому мы решили по мере возможностей предлагать вам решения этих задач в виде расширений для FGX Native. Расширение будет включать необходимую обвязку/компоненты для FGX Native для сторонних OpenSource проектов. Первым таким расширением будет реализация нового компонента генерации штрихкода TfgBarcode на основе библиотеки Zint (https://www.zint.org.uk/). Отображение штрихкодов Новый пакет расширения FMXNative.Extension.Zint включен в поставку 1.11.8.0. Пакет содержит новый компонент TfgBarcode, поддерживающий отображение огромного числа типов штрихкодов. Свойство Symbology позволяет выбрать тип отображаемого штрихкода. Через свойство Data указываются кодируемые данные. А через группу свойств Appearance вы можете настроить визуальное отображение штрихкода. Новое правило именования пакетов FGX Native Мы пересмотрели правила именований пакетов библиотеки FGX Native. Поэтому, если вы создаете свои пакеты расширений на основе FGX Native, вам необходимо переименовать зависимости на пакеты. FGXNative.Core <- fgx FGXNative.Design <- fgx_design FGXNative.Registration <-fgx_reg FGXNative.Extension.Translator <- FGXTranslatorD FGXNative.Externals <- fgx_externals Так же, если вы используется наш компонент локализации, необходимо: После установки новой версии библиотеки запустить среду Среда отобразит ошибку при загрузке пакета FGXTranslatorD. Необходимо отвечать Yes во всех диалогах про этот пакет. Затем открыть список компонентов среды: "Components" -> "Install Packages..." В списке найти строчку, соответствующую FGXTranslatorD и удалить ее при помощи кнопки "Remove". Данный компонент мы теперь регистрируем автоматически при установке FGX Native. Календарь под iOS В новой версии так же появится реализация компонента TfgCalendar для iOS. iOS не имеет родной реализации календаря. Поэтому мы с нуля реализуем данный компонент. Заключение Если у вас есть потребность в миграции некоторых невизуальных компонентов из FMX, пожалуйста, отпишитесь здесь в комментариях: Ссылку на стороннюю библиотеку с наличием исходных кодов/OpenSource. Без доступа к исходным кодам мы не сможем выполнить адаптацию под FGX Native. Описание для чего данный компонент нужен. Если кто-то из участников уже озвучил в комментариях нужный вам компонент, просьба отметить такое сообщение реакцией (лайком).
    10 points
  13. Доброго дня! В ближайшем релизе 1.11.2.0 всех нас ждет появление поддержки выпадающих окон TfgPopup. Если вам необходимо отобразить содержимое в виде выпадающего окна, то эта возможность непременно вам пригодится. Создание В качестве содержимого выпадающего окна можно использовать как любой визуальный компонент так и форму. Удобнее всего использовать форму, поскольку она позволяет создать содержимое выпадающего окна прямо в дизайнере. При создании формы важно указать: Отключить полноэкранный режим формы TfgForm.FullScreen = False. Опционально сделать фон прозрачным через TfgForm.Transparent = True . В качестве начинки окна, я сделал форму с TfgCollectionView, используемым для отображения содержимого Чтобы создать выпадающее окно нужно обязательно иметь содержимое, которое вы планируете показать в этом выпадающем окне. Создание выполняется через фабрику FGX.Popup.TfgPopupFactory, как и тосты, пикеры, диалоги и тд. var FPopup: TfgPopup; FPopupContent: TFrameList; FPopupContent := TFrameList.Create(nil); FPopup := TfgPopupFactory.CreatePopup(FPopupContent); После создания TfgPopup становится владельцем вашего содержимого. Это значит, что содержимое будет уничтожено, как только TfgPopup будет удален. Если вы хотите сами контролировать время жизни содержимого, вы можете передать вторым параметром значение False. В этом случае, после уничтожения TfgPopup, ваше содержимое останется жить. FPopup := TfgPopupFactory.CreatePopup(FPopupContent, False); После создания необходимо указать размер выпадающего окна при помощи свойства TfgPopup.Size. Например, если выпадающее окно прикреплено к кнопке. то имеет смысл в качестве ширины брать ширину кнопки: FPopup.Size := TSizeF.Create(fgButton1.Width, 200); Отображение Для отображения выпадающего окна существует два одноименных метода TfgPopup.DropDown, оба которых привязывают отображение окна к указанному компоненту. /// <summary> /// Открывает выпадающее окно, прикрепленное к указанному компоненту <c>AAnchor</c> со смещением <c>AOffset</c>. /// </summary> procedure DropDown(const AAnchor: TfgControl; const AOffset: TPointF); overload; virtual; abstract; /// <summary>Открывает выпадающее окно, прикрепленное к указанному компоненту <c>AAnchor</c>.</summary> procedure DropDown(const AAnchor: TfgControl); overload; FPopup.DropDown(fgButton1); Если вам необходимо выполнить отображение выпадающего окна со смещением, то вы можете передать это смещение вторым параметром: FPopup.DropDown(fgButton1, TPointF.Create(0, 8)); Эта версия метода удобна в случаях, когда вы самостоятельно делаете внешний вид выпадающего окна и хотите добавить отступы между выпадающим окном и компонентом, вызывающим это окно. Для закрытия окна используйте метод Close. /// <summary>Закрывает выпадающее окно.</summary> procedure Close; virtual; abstract; Настройка внешнего вида По умолчанию TfgPopup выглядит, как TfgCardPanel с тенью и рамкой. Однако, если вы хотите сделать свой внешний вид окна, то вы можете отключить отображение по умолчанию через свойство TfgPopup.IsTransparent. В этом случае содержимое будет отображено прямо под привязанным компонентом. /// <summary>Прозрачное выпадающее окно или нет?</summary> property IsTransparent: Boolean read FIsTransparent write SetIsTransparent; Если вы используете в своих приложениях темы, то вы можете использовать темы и для содержимого выпадающего окна. Для этого необходимо указать название темы в свойстве TfgPopup.ThemeName. Таким образом можно добавить поддержку темной темы и детальнее настроить внешний вид попапов. /// <summary>Название темы, используемой для содержимого выпадающего окна.</summary> property ThemeName: TfgThemeName read FThemeName write SetThemeName; ios.mp4 android.mp4 События В TfgPopup поддерживается два типа событий, OnOpened и OnClosed, вызываемые при открытии и закрытии выпадающего окна соответственно. Так же мы предлагаем две версии каждого события для использования совместно с анонимными функциями и событиями. /// <summary>Вызывается, когда выпадающее окно отображается на экране.</summary> property OnOpened: TNotifyEvent read FOnOpened write FOnOpened; /// <summary>Вызывается, когда выпадающее окно отображается на экране.</summary> property OnOpenedCallback: TfgCallback read FOnOpenedCallback write FOnOpenedCallback; /// <summary>Вызывается, когда выпадающее окно скрывается с экрана.</summary> property OnClosed: TNotifyEvent read FOnClosed write FOnClosed; /// <summary>Вызывается, когда выпадающее окно скрывается с экрана.</summary> property OnClosedCallback: TfgCallback read FOnClosedCallback write FOnClosedCallback;
    10 points
  14. Название приложения: Калькулятор электропривода Платформа: Android 32 bit, Android 64 bit Поддерживаемые версии ОС: Android 5.0 и новее Необходимое свободное место: до 80 Мб Ссылка на приложение: https://play.google.com/store/apps/details?id=ru.atpdevelop.aepcalculater Описание: Калькулятор электропривода - приложение, созданное в помощь студентам для расчета и выбора электропривода. Базовая Lite версия приложения позволяет произвести расчет нескольких параметров двигателя: номинальную мощность, номинальный ток, эквивалентную мощность и эквивалентный момент инерции. Исходя из рассчитанных параметров можно выбрать двигатель, если он есть в базе данных. Содержит небольшой ликбез по основам асинхронных двигателей. Разработчики: Ильяшевич Дмитрий, Супрунчук Павел. Скриншоты окон приложения в спойлере:
    10 points
  15. Скачать: Релиз доступен только по запросу. Дата релиза: 26 мая 2021 Улучшения 🙌 TfgBottomSheetLayout Добавлена группа настроек TfgBottomSheetLayout.BlockContentSettings позволяющая автоматически свернуть/закрыть страницу в модальном режиме при касании заблокированной области основного содержимого. В эту группу перемещено свойство BlockContentMode -> BlockContentSettings.Mode. Теперь вы можете выбрать, какое действие нужно совершить автоматически при нажатии на заблокированную область основного содержимого через свойство BlockContentSettings.AutoCloseAction. Так же вы можете теперь поймать событие касания этой области через новое событие TfgBottomSheetLayout.OnBlockedContentTap для ручных манипуляций со страницей. FGX-60 Hide/Close TfgBottomSheetLayout. FGX-61 TfgBottomSheetLayout AutoHide. Менеджер ресурсов Добавлен новый метод TfgAssetsFactory.SaveConfigToFile, который позволяет сохранить информацию об отфильтрованных ресурсов в любой файл. Пример сохранения всех ресурсов, у которых имя начинается с префикса 'Cache': const CachePrefix = 'Cache'; TfgAssetsFactory.SaveConfigToFile(TfgAssetsManager.Current, ConfigFileName, function (const AAsset: TfgAsset): Boolean begin Result := string(AAsset.Name).StartsWith(CachePrefix); end, [TfgWritingOption.EmitEmptyAssets]); FGX-35 Assets Добавить возможность сохранять информацию об ассетах в файл. Прочее Теперь TfgWebBrowser может открывать https страницы, которые имеют проблемы с сертификатом (Android). Добавлены хелперы ToString и ToARGBHex для TAlphaColor. Добавлен заголовочный файл Android.Api.Accessibility для возможности использования Android Accessibility. Исправление ошибок 🐛 FGX-62 TfgAnimationHelper Access Violation (iOS). FGX-63 Некорректная работа fgNavigationBar (iOS). FGX-64 TfgBottomSheet не сохраняет AlignmentChildren.Direction. FGX-66 TfgCardPanel Магические способности(iOS). FGX-67 TfgAnimationHelper.ShowForm(FrameName) падает (iOS). FGX-68 Новая анимация - крашится приложение при вызове HideForm. FGX-69 Исключение при загрузке изображений (Android). Свойство TfgBottomSheetLayout.BlockContentMode не работало, если ContentShadingSettings.Enabled = False (Android).
    10 points
  16. 0) Свершилось, сразу прошу прощения, доступно только для Украины, потому большинству скачать не удастся (там и смотреть нечего) https://apps.apple.com/ua/app/лувис/id1561453338?l=ru 1) Предполагаем, что у нас есть платный аккаунт разработчика а) На сайте appstoreconnect.apple.com создаем приложение б)Создаем скриншоты, отвечаем на вопросы, я отвечал максимально честно, но учитывая то что мое приложение было бесплатным и не содержало рекламы, наверное что-то я выпустил из виду в)Самое сложное было не лукавя сказать про определение местоположение и идентификатор устройства. 2) Подготовка к публикации а) По прежнему предполагаем что у нас есть платный аккаунт разработчика, и вы сделали все, чтобы создать файл .ipa с Конфигурацией AppStore б) Далее предполагаем, что программа Transporter на Apple Mac или его заменителе (в моем случае), успешно установлена в) Загружаете созданный .ipa в траспортер и с помощью боковой клавиши ..., проверяете его перед загрузкой в AppStore г) С помощью appstoreconnect.apple.com пытаетесь опубликовать приложение . 3) Хатико а) По сравнению с Гугл ревизия происходит очень быстро, первый мой reject произошел в течении часа с вердиктом Метаданные отклонены. Они были отклонены по двум причинам а1) Отсутствие дополнительной информации (об этом позже) а2) Отсутствие аккаунта для тестирования Я понял, что самое интересное впереди, причем пункт а2 был у меня не готов полностью, учитывая замороченную процедуру регистрации, я взял таймаут для обдумывания 4) Возвращение Мухтара а) Исправив ошибку с аккаунтом для тестирования (к слову, если смотреть по логам, тестировал живой человек, причем ленивый, зашел в три формы, и устал), отправил повторно на ревизию б) Ревизия продолжалась два часа с вердиктом метаданные отклонены. И со следующим комментарием От: Apple 2. 1 Performance: App Completeness Guideline 2.1 - Information Needed We’re looking forward to continuing our review, but we need more information about your business model and your users to help you find the best distribution option for your app. Our preliminary review of your app suggests that your app may be a good fit for our Apple Business Manager program, which is designed specifically for business apps. Next Steps Please review the following questions and provide as much detailed information as you can for each question. 1. Is your app restricted to users who are part of a single company? This may include users of the company's partners, employees, and contractors. 2. Is your app designed for use by a limited or specific group of companies? - If yes, which companies use this app? - If not, can any company become a client and utilize this app? 3. What features in the app, if any, are intended for use by the general public? 4. Identify the specific countries or regions where you plan to distribute your app. 5. How do users obtain an account? 6. Is there are any paid content in the app? For example, do users pay for opening an account or using certain features in the app? 7. Who pays for the paid content and how do users access it? Since your App Store Connect status is Metadata Rejected, we do NOT require a new binary. To revise the metadata, visit App Store Connect to select your app and revise the desired metadata values. Once you’ve completed all changes, reply to this message in Resolution Center and we will continue the review. в) Я написал в ответ слезное, вежливое письмо с подробными ответами на вопросы. Учитывая возможно скудное владение русским языком моего визави, языком письма был выбран язык вероятного противника (английский) г) В течении нескольких минут я получил ответ После этого на протяжении небольшого времени (пару часов), я имел возможность наблюдать свою поделку на App Store Чего и вам всем желаю. З.Ы. Простите за сумбурность изложения, я надеюсь, что некоторые моменты публикации я прояснил. Всем спасибо.
    10 points
  17. Скачать: setup_1.11.3.0_release.rus.zip Дата релиза: 13 июля 2021 Улучшения 🙌 TfgPageControl Полная реализация компонента TfgPageControl под iOS. Реализована смена вкладок через прокручивание пальцем (iOS). Реализовано свойство TfgPageControl.SwipeEnabled (iOS). Реализованы все события TfgPageControl.OnPageSelecting, OnPageSelected и OnChanged (iOS). Теперь события не срабатывают при программной смене текущей вкладки (iOS). Анимация Добавлен новый тип анимаций, позволяющий изменять позицию визуального компонента. Данный аниматор можно создать через новый фабричный метод TfgAnimationManager.CreatePositionAnimation. В отличии от аниматора смещения Translate, этот аниматор работает с локальными координатами компонента, позволяя удобнее перемещать компонент. Менеджер ресурсов Добавлена прокрутка содержимого дизайнера ресурсов колесом мыши. FGX-84 Добавить возможность прокручивать содержимое дизайнера ресурсов колесом мышки. Платформа Реализовано уведомления об изменениях ориентации устройства (iOS). Отслеживать изменение ориентации можно через событие компонента TfgApplicationEvents.OnScreenOrietnationChanged. Если вы не хотите использовать этот компонент по каким-то причина, вы можете перехватить уведомление через механизм широковещательной рассылки TMessageManager: uses System.Messaging, FGX.Platform; TMessageManager.DefaultManager.SubscribeToMessage(TfgOnScreenOrientationChangedMessage, procedure(const Sender: TObject; const M: TMessage) begin TfgAssert.IsClass(M, TfgOnScreenOrientationChangedMessage); var Message := TfgOnScreenOrientationChangedMessage(M); // Message.OldOrientation // Message.NewOrientation end); Прочее Реализован метод ToString для CGSize, CGPoint, CGRect для удобной печати значений. Исправление ошибок 🐛 После окончания анимации смещения Translate позиция компонента сбрасывалась на начальное значение, хотя должна была оставаться в конечном положении (Android). Иногда после выполнения анимаций изменения положения Bounds или смещения Translation компонент мог оказаться в неверной финальной позиции (Android). При добавлении в TfgAnimationManager уже существующей одноименной анимации она не попадала во внутренний список. В следствии чего эту анимацию нельзя было найти и нельзя было остановить. FGX-73 Неправильная последовательность вызова событий (iOS). FGX-74 TfgPageControl.OnChanged срабатывает всегда, даже при программной смене вкладок (iOS). FGX-82 Требуется не пустое значение TfgPopup.FBackGroundView (iOS). FGX-83 EAccessViolation при запуске приложения (iOS). FGX-86 При отображении в TfgPopup на iPadOS одно колоночный TfgCollectionView выстраивается в две колонки (iOS). FGX-88 Некорректно отрабатывает оттенок в TfgImage в TfgCollectionView (iOS). FGX-87 Странное поведение для TfgBottomSheetLayout (iOS). FGX-90 Ошибка EAccessViolation при создании формы в методе GetItemCount для TfgCollectionView (iOS). FGX-93 Не отрабатывает событие OnVirtualKeyboardFrameChange при скрытии клавиатуры (iOS). FGX-94 Не работает Style=Translucent у TfgNavigationBar (iOS). FGX-98 Не производится смена вкладок в TfgPageControl через пролистывание (iOS). При применении оттенка TintColor кнопке TfgButton в iOS оттенок применялся к фону кнопки, хотя этого не должно было быть (iOS). Исправлено применение оттенка иконкам, заданного через дизайнер ресурсов для версий iOS < 13.0 (iOS).
    9 points
  18. Здравствуйте. В этой статье мы поговорим об отладке приложений на iOS с помощью логирования (часть материала будет актуальна и для Android). Общие сведения. Логирование позволяет получать информацию о работе вашего приложении даже когда оно запущено без отладчика, при фатальных падениях приложения и тд. Особенно тема логирования актуальна для мобильных платформ, т.к. здесь, к сожалению, Delphi отладчик не может похвастаться такой же стабильностью и качеством, как отладчик для платформы Win32. Пошаговая отладка выливается в мучительное ожидание переходов, показываемые отладчиком значения могут не соответствовать действительности, либо вообще отсутствовать и тд. Важно! Логирование не заменяет полностью отладчик, а является вспомогательным инструментом. Условно механизм логирования можно разделить на источник логов и на утилиты для сборки и просмотра логов. Источники логов. Источником логов может быть как библиотека FGX Native, операционная система, так и само приложение (сообщения отправленные непосредственно разработчиком). На первые два варианта разработчик особо не может повлиять, поэтому более подробно остановимся на третьем варианте. Отправка сообщения в лог осуществляется с помощью кроссплатформенного класса TfgLog. Все методы TfgLog являются классовыми, а сам класс существует в единственном экземпляре - это означает, что для его использования нет необходимости создавать экземпляр класса. Основным методом класса является метод Log позволяющий отправить строку с указанным уровнем лога. /// <summary>Выводит в системный лог сообщение <c>AMessage</c> типа <c>ALogType</c>.</summary> class procedure Log(const ALevel: TfgLogLevel; const AMessage: string); Уровни лога определяют степень важности того или иного события. /// <summary>Уровень логирования.</summary> TfgLogLevel = (Trace, Debug, Info, Warning, Error, Fatal); Вы можете определить минимальный уровень лога с помощью свойства MinimumLevel, чтобы уменьшить количество выводимых в лог сообщений /// <summary> /// Указывает минимальный уровень лога, начиная с которого сообщение будет выводиться в системный лог. /// Порядок следования уровней: Debug, Info, Warning, Error, Fatal. Debug - самый низкий. /// </summary> /// <remarks> /// Для <c>DEBUG</c> конфигурации выводятся все типы сообщений по умолчанию. Для <c>RELEASE</c> сообщений выше /// <c>Info</c>. Если вы хотите видеть в релизной сборке вашего приложения и отладочные сообщения, то задайте /// значение <c>TfgLogLevel.Debug</c> в это свойство. Данная настройка распространяется только на этот класс. На /// логирование через сервис <c>IFGXLoggerService</c> она не действует. /// </remarks> class property MinimumLevel: TfgLogLevel read FMinimumLogLevel write FMinimumLogLevel; Для удобства у класса TfgLog есть набор одноименных методов, соответствующих каждому уровню лога. Например: /// <summary> /// Выводит в системный лог низкоуровневое отладочное сообщение <c>AMessage</c> для выполнения трассировки. /// </summary> class procedure Trace(const AMessage: string); overload; /// <summary>Выводит в системный лог отладочное сообщение <c>AMessage</c>.</summary> class procedure Debug(const AMessage: string); overload; В дополнение, у каждого такого метода существует перегруженная версия, принимающая во втором аргументе список параметров для отправки форматированной строки: /// <summary> /// Выводит в системный лог низкоуровневое отладочное сообщение <c>AMessage</c> с поддержкой форматирования <c>System.Format</c>. /// </summary> class procedure Trace(const AFormat: string; const Args: array of const); overload; /// <summary> /// Выводит в системный лог отладочное сообщение <c>AMessage</c> с поддержкой форматирования <c>System.Format</c>. /// </summary> class procedure Debug(const AFormat: string; const Args: array of const); overload; Сборка и просмотр логов. Для просмотра логов с iOS используется утилита, работающая на компьютере под управлением macOS под названием Console. Для просмотра логов с Android используется утилита работающая на компьютере под управлением Windows под названием logcat. Частично логирование в контексте Android было затронуто ранее в Уроке 1 «Настройка окружения, Hello World приложение и логирование». В данной статье мы сосредоточимся на утилите Console. Важно! Подразумевается, что вы имеете настроенную связку: компьютер под управлением macOS к которому подключено устройство с iOS. Исходные данные: на устройстве с iOS установлено приложение под названием TestLogging, которое имеет только две кнопки, при нажатии на которые отправляются сообщения в системный лог. Код выглядит следующим образом: uses System.SysUtils, FGX.Application, FGX.Dialogs, FGX.Log; procedure TFormMain.fgButton1Tap(Sender: TObject); begin TfgLog.Debug('Hello from TfgLog.Debug'); end; procedure TFormMain.fgButton2Tap(Sender: TObject); begin TfgLog.Info('Hello from TfgLog.Info'); end; Теперь перейдем непосредственно к утилите сбора и просмотра логов. Запустите утилиту Console которая находится в Launchpad -> Other. Главное окно состоит из меню навигации в левой части (1), тулбара с органами управления вверху (2) и списка логов, который занимают остальную клиентскую область окна (3). Теперь выбираем в меню навигации слева устройство из списка Devices с которого мы хотим получать логи. В нашем случае это устройство с именем IPhone. Теперь запускаем сбор логов с помощью кнопки тулбара Start или кликнув по ссылке Start streaming находящейся в центре списка логов. После старта список логов будет быстро наполняться сообщениями. Список логов представляет собой таблицу с настраиваемыми колонками. Вы можете настроить видимость колонок по своему усмотрению с помощью контекстного меню, вызываемого по клику на заголовки таблицы. Самая полезная для нас информация находится в колонке Message - это непосредственно текстовое сообщение лога. Более удобно текстовое сообщение просматривать в окне детальной информации, которое можно открыть двойным кликом по строке списка логов, либо с помощью кнопки тулбара Info. Теперь запустим наше тестовое приложение и последовательно нажмем обе кнопки. Лог содежит тысячи записей, среди которых практически невозможно найти интересующие нас строки. Для решения этой задачи существуют фильтры, которые располагаются в правой части тулбара. Механизм фильтрация довольно гибкий и позволяет комбинировать несколько фильтров по разным колонкам с учетом выбранного способа сравнения (частичное или полное совпадение включая вариант с отрицанием). Важно! Фильтрация осуществляется без учета регистра. Есть несколько способов, как можно отобразить только те строки, которые относятся к нашему приложению. Самый простой вариант - отфильтровать по имени процесса. Вводим фразу TestLogging в окно Search и нажимаем клавишу Enter на клавиатуре. По-умолчанию создастся фильтр с типом Any и способом сравнения Containts. Теперь изменим тип фильтра с Any на Process, a Containts на Equal, что означает, что в списке логов останутся только те строки, текст которых в колоноке равен TestLogging. На скриншоте видно, как строки переданные самой библиотекой FGX Native, так и те, которые были отправлены после нажатия на кнопки (отмечены стрелками). Теперь вы можете изучать собранную информацию просматривая сообщения. При необходимости вы можете сохранить выделенные строки в буфер обмена, либо передать их в другое приложение к помощью кнопки тулбара Share. Логирование - мощный инструмент, который может пригодиться в самых трудных и запутанных ситуациях при поиске ошибок. Спасибо за внимание и удачной отладки!
    9 points
  19. Мы постоянно работаем над расширением возможностей библиотеки FGX Native. Чтобы разнообразие деталей в конструкторе росло, а создание приложений становилось все проще и быстрее. В новом релизе 1.9.2.0 мы добавили два новых компонента: TfgVirtualListPicker и TfgNumberListPicker. Эти компоненты позволяют выбрать одно значение из списка при помощи крутящегося барабана. В основном такие компоненты использовались при выборе даты и времени: TfgVirtualListPicker Этот компонент не хранит у себя элементы списка и работает подобно TfgCollectionView. А именно запрашивает все необходимые данные у разработчика через специальные события: OnGetItemsCount и OnGetItemText. Допустим у нас есть список городов. Для упрощения названия городов мы поместим в константный массив. У вас он может находится в базе данных или в любой другой модели данных: const Titles: array [0..6] of string = ('Saint-Petersburg', 'Moscow', 'Chelyabinsk', 'Sochi', 'Krasnodar', 'Voronej', 'Rostov-on-don'); Для полноценной работы компонента ему необходимо знать только: Количество элементов в списке. Оно указывается в событии OnGetItemsCount. procedure TFormMain.fgVirtualListPicker1GetItemCount(Sender: TObject; var ACount: Integer); begin ACount := Length(Titles); end; Текстовое название элемента, отображаемое в компоненте. Оно указывается в событии OnGetItemText. Если вы не указываете обработчик для этого события, то компонент по умолчанию использует надпись следующего формата "Item %d". Каждый элемент списка имеет свой индекс, по которому компонент получает текст элемента. procedure TFormMain.fgVirtualListPicker1GetItemText(Sender: TObject; const AItemIndex: Integer; var AText: string); begin AText := Titles[AItemIndex]; end; Это минимально необходимые действия для отображения списка: У компонента нет ограничения на максимально допустимое количество элементов в списке. Оно может быть абсолютно любым. Значит его можно использовать для списков любого размера. Когда пользователь выбирает элемент, срабатывают события OnChanged, OnItemSelected, через которые вы можете узнать индекс выделенного элемента. Внешний вид На текущий момент у компонента есть только одна настройка - это цвет текста элементов TextColor / TextColorName, которая по умолчанию завязана на цвет темы "Text\Text". Расширяемость Компонент TfgVirtualListPicker разработан для возможности создания своих расширений на его базе. Это значит, что вам не нужно реализовывать этот компонент для IDE, Android и iOS. Именно на его основе сделан следующий компонент TfgNumberListPicker. TfgNumberListPicker Этот компонент является кроссплатформенным расширением TfgVirtualListPicker и предлагает возможность выбрать вещественное число из указанного диапазона. Диапазон задается при помощи трех свойств: границы диапазона Min, Max и шага изменения сетки чисел Step. По умолчанию каждый элемент отображается в виде вещественного числа с двумя знаками после запятой. Однако, вы можете это поменять одним из любых способов: Указать стандартный формат через FormatKind = Integer. Указать свой произвольный форма через FormatKind = Custom и Format = 'Item %f' Указать свой обработчик события OnGetItemText. В остальном компонент позволяет использовать все возможности TfgVirtualListPicker.
    9 points
  20. Скачать: Релиз доступен только по запросу. Дата релиза: 14 марта 2021 Внимание! Теперь цвет экшен кнопок TfgNavigationBar зависит от цвета TfgNavigationBar.ButtonsOptions.IconTintColorName. Теперь события TfgPageControl.OnChanged, TfgPageControl.OnPageSelecting, TfgPageControl.OnPageSelected не вызываются при создании компонента. Теперь события TfgComboBox.OnChanged, TfgComboBox.OnItemSelected не вызываются при создании компонента. Новое ✨ Добавлена утилита генерации Delphi оберток для использования Java классов Улучшения 🙌 Андроид сервисы Теперь при сборке приложения, использующего Андроид сервис, среда автоматически добавляет в корень проекта два пропатченных файла System.Android.Service.dcu и System.Android.Service.o необходимые для корректной работы Андроид сервисов в FGX Native приложении. Добавлен хелпер для получения экземпляра Андроид сервиса TfgAndroidHelper.Service (Android). Прочее Добавлен пример по выполнению автоматического переноса компонентов на новую строчку: "Выравнивание" -> "Автоматический перенос компонентов по строкам" Реализована широковещательная рассылка уведомлений при изменении параметров экранов, подключении и отключении (iOS). Исправление ошибок 🐛 FGX-17 Ошибка публикации в apple Store (iOS). FGX-19 TfgCollectionView.OnScroll не работает (iOS). FGX-20 Изменение страницы в TfgPageControl с помощью кода (GotoPage) не вызывает событие OnChanged на (iOS). FGX-21 Не работает ScrollBottom в TfgScrollBox (Android). FGX-22 Проблемы английской локализации в IDE. Падение сканера баркодов при разрушении формы (Android). FGX-25 Assets Manager: проблемы импорта с material.io. FGX-26 Цвет текста кнопки действия на панели навигации (Android). Восстановление оригинального оттенка иконки More Image при сбросе акцентного цвета TfgNavigationBar.ButtonsOptions.IconTintColorName (Android). FGX-29 Usage TLocalServiceConnection.StartService doesn't work (Android). FGX-32 При скрытии TfgToast падает приложение в RAD Studio 10.3 (iOS). Исправлено отображение тоста в горизонтальной ориентации устройства (iOS). FGX-31 Не работает TfgLine.Stroke.Cap (Dash=Dot). FGX-23 TfgPageControl последовательность событий (Android). FGX-27 TfgComboBox как отключить событие OnChanged.
    9 points
  21. Название приложения: ГАЗ-ИНСТИТУТ Платформа: Android 32 bit, Android 64 bit Поддерживаемые версии ОС: Android 5.0 и новее Необходимое свободное место: до 10 Мб Описание: Приложение "ГАЗ-ИНСТИТУТ" предназначено для подачи заявок на обучение. Ссылка на приложение: https://play.google.com/store/apps/details?id=gazinstitut.by Заявки на обучение.mp4
    9 points
  22. Скачать: Релиз доступен только по запросу. Дата релиза: 3 декабря 2020 Новое ✨ Теперь можно автоматически добавлять наследуемые формы. Выберите Add New -> FGX Other... в контестном меню проекта на панели Projects. Полная реализация работы с маркерами в TfgMap под iOS. Полная реализация работы с кругами в TfgMap под iOS. Добавлено новое свойство TfgMap.StandardLayerKinds, позволяющее управлять отображением на карте стандартных слоев (загруженность дорог и строения). Добавлено новое свойство TfgMap.UserGestureKinds, позволяющее указать, какие жесты разрешено совершать пользователю. Добавлено новое событие TfgMap.OnInfoWindowTap, срабатывающее в момент нажатия на информационное окно маркера. Новый демонстрационный проект Android Api -> Иммерсивный режим о том, как включить иммерсивный режим в Android. Улучшения ? Теперь можно получить внутреннюю версию приложения через Application.Info.VersionCode. Добавлен заголовочный класс android.graphics.drawable.VectorDrawable для работы с векторными изображениями. Исправление ошибок ? Если в дизайнере установить TfgButton.Appearance = Contained, то в рантайме под iOS стиль не применялся. TfgImage.Opacity не работает в дизайнере. Если в проекте одновременно используется PushNotification и другие Android сервисы, то в манифесте прописывался только PushNotification сервис. При серии запуска и остановки Android сервиса могла возникать ошибка "Cannot allocate proxy. All FGX Proxy interfaces are busy.". Для TfgButton нельзя было указать цветовой фон через свойство BackgroundName.
    9 points
  23. Здравствуйте. В этой статье мы поговорим о новинке, которая появится в релизе 1.11.6.0, а именно о встроенном средстве просмотра логов устройств работающих под управлением операционной системы Android. Общие данные о том, что такое логи, их ценность при отладке и тд вы можете прочитать в статье касающейся логирования в контексте iOS Общие сведения. Для просмотра логов под Android используется утилита командной строки logcat. Вы можете использовать ее как напрямую, управляя через параметры командной строки, так и воспользоваться Android Studio в которой есть одноименное окно logcat. Второй вариант предпочтительней, т. к. имеет графический интерфейс, но, естественно, он требует установки самой Android Studio. Итак, новая утилита FGX Android Log Viewer (далее логвьювер) призвана упростить просмотр логов за счет удобной интеграции в IDE, графического интерфейса и гибкой системы фильтрации. Внешний вид. Запустить логвьювер можно из меню Project -> FGX Android Log Viewer. Левую горизонтальную часть окна занимает тулбар с основными органами управления, такими как: запуск/остановка захвата логов, очистка списка, экспорт и тд. Верхний тулбар содержит выбор активного устройства, выбор приложения, для которого будут собираться логи (либо для всех приложений) и быстрый фильтр. Основную часть окна занимает список логов, представленный в виде таблицы. Внизу располагается статус бар, отображающий количество элементов списка, в тч отфильтрованных, а так же, текущий статус захвата логов. Опциональное окно детальной информации о событии. Логвьювер поддерживает докинг форм, следовательно может быть как плавающим окном, так и быть закреплен в любом удобном для вас месте в IDE. Отправка сообщений в лог. Для начала работы выберите устройство в верхнем тулбаре (в нашем случае это Redmi Note 7) и нажмите кнопку старта захвата логов. Список будет постепенно наполняться записями. Для просмотра детальной информации о записи можно два раза кликнуть по самой записи в списке, либо выделить запись и нажать соответствующую кнопку в левом тулбаре. Теперь создадим тестовое приложение, запустим его и отправим несколько записей в лог. Для этого воспользуемся кодом из предыдущей статьи: uses System.SysUtils, FGX.Application, FGX.Dialogs, FGX.Log; procedure TFormMain.fgButton1Tap(Sender: TObject); begin TfgLog.Debug('Hello from TfgLog.Debug'); end; procedure TFormMain.fgButton2Tap(Sender: TObject); begin TfgLog.Info('Hello from TfgLog.Info'); end; Наши сообщения отправлены и встаёт вопрос, как их найти среди огромного списка других сообщений. Есть два варианта решения задачи: Изначально собирать сообщения только от нашего приложения, выбрав его перед захватом лога в верхнем тулбаре (в этом случае количество попадаемых в лог сообщений значительно сократится, но так можно пропустить важные сообщения, в т.ч. падения, от самой Android и/или её компонентов) Воспользоваться фильтрацией, которая представлена в логвьювере в двух вариантах: быстром и расширенном. Воспользуемся вариантом 2. Варианты фильтрации списка событий. Окно быстрой фильтрации находится в правой части верхнего тулбара (вариант по-умолчанию): Фильтрация осуществляется по всем столбцам списка без учёта регистра. Можно указывать несколько значений, разделённых пробелом. В итоговую выборку попадут события, которые соответствуют хотя бы одной подчасти фильтра (OR). Для включения расширенного фильтра воспользуйтесь кнопкой на левом тулбаре. После включения верхний тулбар приобретёт следующий вид: Каждое окно ввода "привязано" к одноименному столбцу списка. В итоговую выборку попадут события, которые соответствуют всем заполненным окнам фильтра (AND). Просмотр событий. Итак, чтобы найти отправленные ранее сообщения, для начала укажем в окне быстрого фильтра слово "FGX" - этим тегом помечаются все сообщения, отправленные с помощью TfgLog. Как видно на скриншоте, в списке остались только относящиеся к FGX записи, среди которых не составит труда увидеть и искомые записи. Альтернативный вариант - поиск по Process Id (PID), который можно узнать из окна IDE Events (в нашем случае 25505) В результате значений будет уже больше, т.к. в итоговую выборку попадают все сообщения, относящиеся к процессу, а не только сообщения, отправленные непосредственно FGX. Но, даже так, найти наши записи не составляет особого труда. Либо вы можете отфильтровать список непосредственно по части отправленной записи: Состав и количество фильтров огранивается только вашей фантазией. Надеемся, что вам понравится опыт работы с новым средством просмотра логов FGX Android Log Viewer. Спасибо за внимание и удачной отладки!
    8 points
  24. Скачать: setup_1.11.7.0_release.rus.zip Дата релиза: 18 сентября 2021 Новое ✨ TfgAutocompleteEdit Добавлена реализация TfgAutocompleteEdit для iOS. Помимо этого, теперь можно программно открывать и закрыть выпадающее окно на свое усмотрение при помощи новых методов DropDown и Close. Так же мы добавили новое свойство DropDownHeight, позволяющее указать фиксированную высоту выпадающего окна. Добавлено свойство BorderKind для возможности отключения рамки поля ввода. TfgSearchEdit Добавлена реализация TfgSearchEdit для iOS. Добавлено свойство BorderKind для возможности отключения рамки поля ввода. Улучшения 🙌 FGX Android Log Viewer Изменен принцип работы быстрого фильтра. Теперь он работает по принципу AND. Исходная фраза разбивается по символу пробела на отдельные слова. Для попадания в итоговую выборку строка лога должна содержать вхождения всех слов. Чтобы найти часть фразы, содержащую пробел, целиком, заключите её в кавычки. Добавлена возможность задать минимальный уровень лога для быстрого фильтра. Теперь при выборе приложения срабатывает быстрая фильтрация, а не перезапускается сбор логов для выбранного приложения. Иногда цвет некоторых элементов мог не соответствовать актуальной теме при старте средства просмотра логов. Иногда детальная информация о событии могла не отображаться при первом открытии. Теперь при старте средства просмотра логов показываются последние 2К предыдущих событий. Оптимизировано получение списка процессов. Переименован уровень лога Verbose->Trace. TfgControl Теперь можно легко получить корневую форму, в которую встроен компонент через свойство TfgControl.RootForm. Исправлена функция LocalToForm, которая раньше не учитывала наличие прокручиваемого содержимого у компонентов. TfgPath Улучшен разбор чисел. Теперь поддерживается чтение таких последовательности чисел "4.23-1.57l.27.28". Исправление ошибок 🐛 FGX-140 TfgLabel c HorzAlign <> Left не отображается, если TextType=HTML (Android). TfgCollectionView не заполнялся элементами, если создавать его программным способом (iOS). Исправлена небольшая утечка памяти в TfgPopup (iOS). Исправлена отрисовка путей в TfgSvgPath при использовании гладких кривых. Из Android API убрано несколько скрытых методов и констант.
    8 points
  25. Всем хорошей рабочей недели! Год назад мы поделились руководством по подключению популярного сервиса платформы для аналитики и маркетинга приложения Yandex AppMetrica для Android. В этой статье с мы рассмотрим, как начать использовать этот же сервис для iOS платформы. Подключение FGX Native приложения для Android платформы рассмотрено в другой статье: Для того, чтобы начать использовать AppMetrica в вашем приложении нужно выполнить два шага: Зарегистрировать ваше приложение на стороне Yandex Подключить библиотеку Yandex AppMetrika и выполнить инициализацию ключом API. Регистрация приложения в Yandex AppMetrika 1. Создаем новый проект в учетной записи AppMetrika и даем ему название: Затем далее и добавить. По окончании добавления сервис отобразит ваш API ключ, который нужно запомнить. Он будет использовать для взаимодействия вашего приложения и сервиса Yandex AppMetrika. Теперь переходим к настройкам вашего проект, путем нажатия на кнопку настройки проекта в левой панели. Теперь нам необходимо связать наш проект с iOS приложением. Среди большого числа настроек нас интересует вкладка "Основное" -> "Universal Link". Нам необходимо заполнить поля Bundle ID и App Prefix на основании данных вашего iOS приложения, зарегистрированного в портале Apple Developer. AppPrefix - это уникальный префикс, выданный Apple при участии в программе iOS разработчиков. Он же добавляется к названию пакета iOS приложения, тем самым формируя уникальное название приложения. Его можно найти в личном кабинете Apple на вкладке Membership: Bundle ID - это идентификатор пакета вашего FGX Native приложения. Если приложение уже зарегистрировано, то вы можете найти название пакета на сайте Apple в разделе Identifiers. После того, как вы указали все данные, необходимо включить "Использовать Universal Link" - это специальная технология, которая призвана обезопасить передачу статики с устройств пользователя на сервера Yandex. Чтобы закончить настройку, необходимо включить поддержку Universal Link на стороне профиля разработчика Apple. Для этого необходимо открыть настройки приложения в консоли Apple и включить поддержку "Associated Domains". Теперь ваш профиль приложения сконфигурирован для приема статистики с вашего приложения. Переходим к подключению Yandex AppMetrica к FGX Native приложению. Подключение и инициализация Yandex AppMetrica в FGX Native приложении 1. Скачиваем статическую версию AppMetrica SDK. Yandex SDK 3.17.0.zip 2. Скачиваем заголовочные файлы для Delphi. Yandex.Api.MobileMetrica.iOS.pas 3. Скачиваем модуль регистрации и инициализации AppMetrica. Этот модуль содержит код по регистрации вашего приложения в сервисе Yandex для iOS и Android. Yandex.AppMetrica.pas 4. Добавляем модуль в ваш проект и в проектном файле вызываем метод инициализации InitYandexMetrika указанием API ключа, выданном на этапе регистрации проекта в Yandex. program YandexMetrika; uses FGX.Application, FGX.Forms, Form.Main in 'Form.Main.pas' {Form.Main: TfgForm}, Yandex.AppMetrica in 'Yandex.AppMetrica.pas'; {$R *.res} begin InitYandexMetrika('Ваш API ключ'); Application.Initialize; Application.CreateForm(TFormMain, FormMain); Application.Run; end. 5. Настраиваем линковку проекта с Yandex AppMetrica SDK. 5.1. Добавляем в настройках среды переменную окружения "YandexMetrica": "Tools" -> "Options" -> "IDE" -> "Environment Variables". Указываем путь к месту, где у вас распакован AppMetrica SDK. 5.2 В настройках проекта указываем пути для линковки. "Project" -> "Options..." -> "Building" -> "Delphi Compiler" -> "Search Path". Выбираем конфигурацию "All Configuration -> iOS Deice 64-bit platform" и указываем следующие пути в "Search Path": $(YandexMetrica)\YandexMobileMetrica.framework; $(YandexMetrica)\YandexMobileMetricaCrashes.framework 5.3 В настройках линковки передаем дополнительный ключ "-ObjC" линковки: "Project" -> "Options..." -> "Building" -> "Linking" -> "Options passed to the LD linker". 6. Все. Теперь выполняем сборку приложения и запуск на устройстве. В результате ваше приложение должно успешно стартовать, а через некоторое время вы увидите статистику в личном кабинете AppMetrica.
    8 points
  26. Скачать: setup_1.11.6.0_release.rus.zip Дата релиза: 4 сентября 2021 Внимание 🚨 Мы внесли изменение в логику работы события TfgEdit.OnChanged. Теперь на Андроиде это событие вызывается только при окончании ввода текста: потеря фокуса полем ввода или нажатие на кнопку ReturnKey. Если вам необходимо знать о любых изменения текста в поле ввода, вам необходимо использовать событие OnChanging. Новое ✨ FGX Android Log Viewer Появился встроенное средство просмотра логов устройства для Android (logcat). Для запуска выберите меню Project -> FGX Android Log Viewer. TfgDrawerLayout Добавлена поддержка расположения выдвигаемой панели TfgDrawer справа. Новое свойство TfgDrawer.Location позволяет указать расположение панели (Справа или слева). FGX-135 Добавить правое расположение панели для TfgDrawerLayout. Улучшения 🙌 TfgEdit Поле ввода TfgEdit предлагает два события OnChanging и OnChanged. Первое срабатывает при любом изменении текста пользователем. Второе же вызывается в конце ввода текста и предназначен для финальной валидации текста в поле. Однако, на Android событие OnChanged работало так же, как и событие OnChanging и вызывалось при любом изменении текста. В этом релизе мы исправили это, и теперь событие OnChanged работает одинаково на обеих платформах Android и iOS и вызывается в одном из двух случаев: Потеря фокуса; Нажатие кнопки ReturnKey на виртуальной клавиатуре. Помимо этого виртуальная клавиатура на платформе Android всегда имеет кнопку ReturnKey. Поэтому у пользователя всегда есть возможность подтвердить окончание ввода при помощи нажатия на эту кнопку. В iOS такая кнопка тоже есть, однако, она есть не на всех раскладках клавиатуры, что создает для пользователя проблему о том, как сообщить, что текст полностью введен. Для этой ситуации теперь компонент TfgEdit при открытии виртуальной клавиатуры отображает тулбар с кнопкой завершения текстового ввода. TfgVerticalScrollBox/TfgHorizontalScrollBox Добавлена перегруженная верcия метода ScrollTo(AControl), которая позволяет выполнить прокрутку содержимого скроллбокса к началу указанного дочернего компонента. TfgMap Теперь можно получить массив всех объектов карты через методы Markers.ToArray, Polylines.ToArray, Polygons.ToArray или Circles.ToArray. А так же узнать количество через свойства Count. Исправление ошибок 🐛 TfgCollectionView FGX-132 Некорректно работает TfgCollectionView.ScrollToItem (iOS). FGX-133 Некорректно работает TfgCollectionView.GetFirstVisibleItemIndex (iOS). При первом вызове события TfgCollectionView.OnBindItem для элемента, элемент содержал не актуальный размер элемента (iOS). TfgNavigationBar FGX-105 Увеличить область нажатия кнопки Navigation в панели TfgNavigationBar (iOS). FGX-114 Внутренние отступы у кнопок (iOS). При нажатии на пункт меню свернутых кнопок TfgNavigationBar.ActionButtons, выпадающее меню не закрывалось (iOS). TfgDrawerLayout При первом выдвигании панели TfgDrawer пальцем, панель совершала видимый визуальный скачок (iOS). TfgForm Иногда встроенные формы могли быть недоступны для касаний (iOS). FGX-130 TfgForm некорректное отображение размеров координат x и y при изменение ориентации экрана (Android). Прочее TfgScreenManager не учитывал угол поворота экрана при возвращении размера экрана, если телефон лежал на столе (iOS). Неправильно применялся правый отступ TfgEdit.ContentPadding (iOS).
    8 points
  27. Скачать: setup_1.11.5.0_release.rus.exe.zip Дата релиза: 18 августа 2021 Улучшения 🙌 TfgLabel Теперь при нажатии на ссылку в HTML в TfgLabel (TextType=HTML) ссылка открывается системой в приложении по умолчанию (Android). FGX-125 Перестали обрабатываться нажатия на гиперссылки (Android). Исправление ошибок 🐛 FGX-117 TfgSvgPath некорректное отображение некоторых изображений (Android). FGX-118 Длинные заголовки в TfgNavigationBar не обрезаются (iOS). FGX-119 Событие TfgEdit/TfgMemo.OnChanged может вызываться при закрытии формы (iOS). FGX-120 Не работает TfgCollectionView.Padding (iOS). FGX-121 Не работает Realign при обращении к элементам TfgCollectionView (iOS). FGX-122 Не отображается текст в TfgButton на iOS 12.5.4 (iOS). FGX-123 Дублирование классов в Android API (Android). FGX-124 Ошибка в отображении Font.Style (iOS). FGX-126 Не отображается текст гиперссылок (Android). Иногда стиль отображения шрифта Italic мог не применяться (iOS). Параметры тени не применялись к тексту на кнопке TfgButton (iOS). Исправлено использования отсечения текста по символам в TfgLabel при отсутствии переноса (iOS).
    8 points
  28. Скачать: setup_1.11.2.0_release.rus.zip Дата релиза: 19 июня 2021 Новое ✨ Выпадающие окна TfgPopup В этом релизе добавлена возможность отображать любое содержимое в виде выпадающего окна, прикрепленного к указанному компоненту. Чтобы создать выпадающее окно TfgPopup необходимо воспользоваться фабрикой TfgPopupFactory и передать туда отображаемый компонент. В качестве компонента можно указывать любой визуальный компонент, в том числе и форму. FPopup := TfgPopupFactory.CreatePopup(FPopupContent); FPopup.Size := TSizeF.Create(200, 300); Чтобы отобразить попап необходимо указать компонент, относительно которого должно отобразиться выпадающее окно. Дополнительным параметром можно указать смещение. FPopup.DropDown(fgButton1); Если вы используете темы в вашем приложении, то вы можете указать название темы через свойство ThemeName. По умолчанию выпадающее окно отбрасывает тень. Однако, вы можете использовать прозрачный стиль выпадающего окна. Это управляется через свойство IsTransparent. Добавлен новый демонстрационный проект: "Компоненты" -> "TfgPopup" -> "Базовый пример". Детали: Улучшения 🙌 TfgBitmap Добавлена возможность работы с "сырыми" данными TfgBitmap с помощью IFGXBitmapData. Для начала работы вызовите TfgBitmap.MapData и TfgBitmap.UnmapData по окончанию. Добавлена возможность поворота TfgBitmap на фиксированный угол. Доступны повороты на 90, 180 и 270 градусов. Добавлен новый демонстрационный проект: "Графика" -> "TfgBitmap - работа с "сырыми" данными". Подробнее: TfgWebBrowser Пересмотрена обработка открытия ресурсов с проблемными сертификатами. Теперь по умолчанию, такие сайты не открываются. Если вы хотите допустить их отображение, необходимо использовать новое событие TfgWebBrowser.OnSSLError и через параметр AHandler запретить или разрешить загрузку таких ресурсов. Добавлен новый демонстрационный проект: "Компоненты" -> "TfgWebBrowser" -> "Обработка ошибок сертификатов". TfgCamera Для камеры добавлена возможность указывать режим работы вспышки в момент снятия фотографии. Это поведение управляется новым свойством TfgCamera.FlashMode. Дополнительно можно использовать вспышку в качестве фонарики в процессе работы предпросмотра (Preview). Это задается через новое свойство TfgCamera.TorchMode. Обратите внимание, что фонарик работает только в режиме превью и игнорируется в момент съемки фотографии. FGX-75 TfgCamera добавить функционал включения вспышки. Обновлен демонстрационный пример: "Компоненты" -> "TfgCamera" -> "Фотокамера". Добавлены элементы управления для включения вспышки и режима фонарика. Исправление ошибок 🐛 Динамическое изменение размера TfgBitmap могло приводить к исключению (Android). Методы TfgCanvas.DrawBitmap и TfgCanvas.DrawBitmapWithMask отрисовывали изображение со скейлом TfgBitmap вместо скейла TfgCanvas, что приводило к неверному размеру изображения (Android). FGX-77 TfgAnimationHelper Access Violation (iOS). FGX-78 TfgEdit нет фокуса после enabled-false/true (Android). FGX-79 Вызов событий TfgCollectionView после TfgForm.OnDestroy. FGX-80 SSL Error Handler (Android). Исправлен демонстрационный проект: "Android Api" -> "AlarmManager". Добавлен проект для сборки Java части в Android Studio.
    8 points
  29. В ближайшие дни выйдет новый релиз библиотеки FGX Native 1.9.3.0, главной новинкой которой будет утилита командной строки для генерации заголовочных файлов Delphi для использования Java API /Android API. Утилита располагается в каталоге "$(FGX)\Tools\Java2Delphi" и в ее состав входят: Java2Delphi.exe - утилита. config.template.json - Шаблон конфигурационного файла, в котором указаны правила формирования итоговых Delphi-модулей. api-versions.android-28.xml - Файл с информацией об Android API 28 версии. UsedGUID.txt - набор использованных GUID значений для Delphi интерфейсов. run.bat - пакетный файл для запуска утилиты в любом месте. Перед первым применением необходимо выполнить настройку утилиты. Настройка Управление утилитой идет при помощи конфигурационного json-файла, передаваемого через аргументы командной строки. Перед первым применением, необходимо: 1. Создать каталог в любом месте, где будут размещены все результаты генерации. 2. Скопировать файл "run.bat" в каталог (1). 3. Скопировать конфигурационный шаблон "config.template.json" в каталог (1) и назвать его "config.json" (название может быть любым). 4. Отредактировать базовые настройки Java окружения: "javap": "$(JAVA_HOME)\\bin\\javap.exe", "jar": "$(JAVA_HOME)\\bin\\jar.exe", Java2Delphi использует две утилиты командной строки из Java SDK: "javap.exe" и "jar.exe". По умолчанию она использует переменную окружения $(JAVA_HOME). Если она у вас указана в Windows, то этот шаг можно пропустить. Если нет, то либо необходимо добавить ее с указанием местоположения Java JDK: или напрямую указать пути к требуемым утилитам. 5. Указываем пути, куда будут помещены результаты генерации (опционально). "outputDir": ".\\Headers", "signatureOutputDir": ".\\Signatures", outputDir - каталог, куда будут помещены pas файлы с необходимыми обертками Java/Android Api. signatureOutputDir - вспомогательный каталог, куда будут помещены вспомогательные файлы с сигнатурами Java классов. После выполнения первичной настройки файла конфигурации, приступим теперь к указанию, какие Java классы надо транслировать. Правила генерации файлов Для того, чтобы сгенерировать заголовочные файлы необходимо указать: Jar-библиотеки, которые содержат необходимые Java классы. Указать требуемые для перевода Java классы. Указать, в какие Delphi модули разместить результирующие обертки. 1. Указываем нужные jar библиотеки. Библиотеки указываются в секции jars: "jars": [ "E:\\Development\\Android\\platforms\\android-28\\android.jar" ], По умолчанию, мы всегда подключаем jar библиотеку Android (по-этому не удаляйте ее, если хотите совместимости с Android API). Вам необходимо откорректировать расположение данного файла с учетом вашей системы. 2. Указываем требуемые для перевода Java классы. Теперь мы должны сказать утилите в секции "classes", какие классы нас интересуют в этих библиотеках. Здесь необходимо использовать полное название Java типов с учетом названия пакета: "classes": [ "java.lang.Object", "java.lang.CharSequence", "java.lang.String", "java.lang.Class", "java.lang.Boolean", "java.lang.Number", // Можно использовать * на конце пакета, чтобы выбрать все классы в данном пакете "android.provider.*", "android.view.animation.Animation", "android.view.animation.Animation.AnimationListener", "android.view.animation.Animation.Description", // и тд По умолчанию шаблон включает в себя все классы из Android API, которые используются в FGX Native. Поэтому не удаляйте эти классы, если вы хотите получить заголовочные файлы, совместимые с уже существующими хедерами в FGX Native. Добавьте сюда те, которые вас интересуют. Поскольку в некоторых библиотеках могут быть 1000 классов. То обработка такого количества классов займет много времени. Помимо этого, вы получите гигантских размеров заголовочные файлы. Поэтому лучше добавлять только те классы, которые вам реально нужны для вызовов, а не все. 3. Указываем правила генерации Delphi модулей. После того, как мы перечислили интересуемые нас Java классы, нам остается только указать, в какие Delphi модули их следует поместить. Это делается через "output": "output": [ { "name": "Android.Api.Text", // Название Делфи модуля Android.Api.Text.pas "uses": [ // Подключаемые Делфи модули в Android.Api.Text.pas "Android.Api.JavaTypes", "Android.Api.ActivityAndView" ], "classes": [ // Java классы, обертки над которыми будут добавлены в Android.Api.Text.pas "android.text.*" ], "exclude": [ // Опционально, можно исключить некоторые классы "android.text.method.*", "android.text.util.*", "android.text.ClipboardManager*" ] } ] Генерация Поздравляю, теперь вы можете запустить утилиту и наблюдать, как она трудится формируя заголовочные файлы по вашим правилам. Обратите внимание, что первый запуск занимает много времени, так как утилита генерирует сигнатуры Java классов (именно они используются для анализа структуры Java классов) и помещает их в каталог "signatureOutputDir". Однако, последующие запуски будут выполняться моментально, за счет того, что утилита не выполняет повторную генерацию сигнатур, если она уже есть. Не удаляйте файлы сигнатур, они помогут ускорить повторную генерацию заголовочных файлов. Разбор пропущенных классы/методов/полей В процессе генерации утилита выполняет много сложной работы с анализом зависимостей, доступных типов и тд. Если какой-то из Java типов не указан в секции "classes", то утилита пропустит все его использования. При этом она сообщит об этом через лог. Например: При генерации класса android.text.HTML были пропущены два метода fromHTML (они не попали в pas файлы), потому что не был указан тип android.text.Html$ImageGetter. Skipped members of the Java type: android.text.Html Methods: - fromHtml(const AArg0: JString; const AArg1: Integer; const AArg2: JHtml_ImageGetter; const AArg3: JHtml_TagHandler): JSpanned; [android.text.Html$ImageGetter] - fromHtml(const AArg0: JString; const AArg1: JHtml_ImageGetter; const AArg2: JHtml_TagHandler): JSpanned; [android.text.Html$ImageGetter] Если вам нужны эти методы, то необходимо в секцию classes добавить этот тип: "classes": [ "android.text.Html.ImageGetter", Обратите внимание, что в Java "$" - это разделитель для вложенных классов. Однако в конфигурационном файле вместо него надо использовать ".".
    8 points
  30. Название приложения: Фаберлик Подарки Платформа: Android 32 bit, Android 64 bit Поддерживаемые версии ОС: Android 5.0 и новее Необходимое свободное место: до 80 Мб Описание: Приложение "Фаберлик Подарки" предназначено для для сопровождения постоянных покупателей продукции Фаберлик. Приложение соединяется с базой данных MySQL на обычном хостинге сайта. Для подключения использую компоненты UniDAC, SecureBridge. Каждому скачиванию присваивается порядковый номер, сохраняется в телефоне, по нему отбираются и показываются сообщения чата для данного клиента. При приходе сообщения делаю "Local notification" из примера. Программа администрирования на Delphi 10.4.1 VCL компонентах. Ссылка на приложение: https://play.google.com/store/apps/details?id=faberlic24.by
    8 points
  31. Скачать: Релиз доступен только по запросу. Дата релиза: 19 января 2021 Потеря обратной совместимости 🚨 TfgCanvas Теперь по умолчанию направление градиента слева-направо, а не сверху-вниз TfgBottomSheetLayout Мы пересмотрели модальный режим работы TfgBottomSheetLayout компонента и решили расширить возможности компонента. Для этого мы ввели две новые группы настроек: TfgBottomSheetLayout.ContentShadingSettings - настройки затемнения основной области содержимого TfgBottomSheetContent, позволяющие указать цвет и включить/выключить отображение затемнения. TfgBottomSheetLayout.BlockContentMode - позволяет указать, когда нужно блокировать доступ к основному содержимому TfgBottomSheetContent. При помощи этих настроек вы можете, как с легкостью настроить модальный режим, так и сделать комбинированный модальный режим при котором основное содержимое будет доступно в Collapsed режиме. Чтобы отобразить страницу в модальном режиме достаточно включить затемнение через TfgBottomSheetLayout.ContentShadingSettings.Enabled = True и блокирование через TfgBottomSheetLayout.BlockContentMode = WhenCollapsedOrExpanded. Новое ✨ TfgListMenu Добавлено новое свойство TfgListMenu.Appearance, которое предназначено для настройки цветовой схемы элементов пунктов меню. Данная группа настроек не позволяет раскрасить в разные цвета все пункты меню, так как компонент следует концепции Material Design, где используется именно общая цветовая схема. Однако, теперь вы можете указать базовые цвета схемы и цвета для разделителя для обычного режима отображения пункта меню и выделенного, чего нельзя было делать ранее. Помимо этого, довольно часто, используемые иконки в пунктах меню, необходимо перекрашивать. Это можно было решить на уровне дизайнера ресурсов, просто указав для иконки нужный оттенок. Однако, используемые в меню иконки могут быть использованы в других местах на практике. В такой ситуации приходилось иметь два дубликата одной и той же иконки, но с разными оттенками, что безусловно увеличивает размер приложения и усложняет дальнейшую правку ресурсов. Ситуация осложняется, когда цвет иконки при выделении отличается от цвета иконки без выделения. Решение данной проблемы теперь лаконично сделано через новую группу настроек Appearance.Icon, работающей по такому же принципу, как и аналогичное свойство у TfgButton. Здесь вы можете указать цвет иконки без и с выделением. В результате вам достаточно иметь всего лишь одну иконку в ресурсах данного базового размера для всех остальных мест. Буфер обмена Реализован новый кроссплатформенный сервис по работе с буфером обмена FGX.Clipboard.TfgClipboardService для Android и iOS. На текущий момент сервис позволяет работать только с текстом. Для ознакомления с работой сервиса доступен пример "Системные сервисы" -> "Текстовый буфер обмена". Замер размера текста Добавлен метод TfgCanvas.MeasureText, позволяющий получить размер текста. Прочее Раньше, использование не реализованных компонентов под iOS (TfgCalender, TfgVideoControl, TfgSearchEdit, TfgAutocompleteEdit), приводило к падению приложения. Теперь приложение не будет падать, а вместо компонентов будет отображаться заглушка с названием класса компонента. Добавлены заголовочные файлы для iOS API: AVFoundation, CoreMedia и CoreVideo. Улучшения 🙌 Темы Не смотря на то, что темы поддерживаются уже давно, с ними был ряд сложностей, связанных с использованием кастомных названий ресурсов. Смена темы автоматически работала отлично для всех компонентов, у которых разработчик не указывал свой ресурс. Однако, как только указывался любой ресурс (не по умолчанию), то такой ресурс считался не зависимым от темы и при переключении темы не менялся. Мы исправили эту ситуацию, и теперь ресурс привязывается к текущей теме формы, если ресурс указывается из текущей формы. Это позволяет сделать полноценное переключение темы для всех свойств. Если же ресурс не привязан к теме, то такой ресурс не будет меняться при смене темы у формы. Теперь мы всегда отображаем название ресурса, используемого по умолчанию у свойства даже если ресурса нет, если другое не указано. Мы решили, что это облегчит понимание какие ресурсы использует компонент по умолчанию. Прочее Добавлены новые два ресурса цвета для темы: "On Surface" и "On Background" - это контрастные цвета, предназначенные для использования отображения элементах, использующих цвета "Surface" или "Background". Чтобы получить данные цвета, достаточно заново сгенерировать тему в дизайнере ресурсов. Добавили дополнительные хелперы для типа TAlphaColor (см. FGX.Types.Color), позволяющие работать с компонентами цвета, выполнять базовые преобразования альфа канала и т.д. Оптимизация использования шрифтов для рисования на холсте TfgCanvas.FillText (Android). Исправление ошибок 🐛 TfgCanvas TfgArch with SweepAngle 360 not drawing properly (iOS). Исправлено рисование градиентной кистью TfgCanvas.Fill и градиентным пером TfgCanvas.Draw (Android). Исправлено рисование точек пером TfgCanvas.DrawPoints(s) (Android). Исправлено рисование дуги пером TfgCanvas.DrawArc (Android). Исправлена заливка полигона TfgCanvas.FillPolygon (Android). Исправлено рисование дуги являющейся частью TfgCanvas.TfgPath (Android). Исправлено положение рисования текста на холсте TfgCanvas.FillText (iOS). Прочее Компоненты TfgArch и TfgArc неверно отображали круглое состояние при IsCircle=True, если высота компонента была больше, чем ширина. Поправили декларации всех внешних процедур и функции iOS API. Исправлены задержки в выравнивании компонентов (iOS). Теперь после создания формы она имеет корректные размеры (iOS). Исправлена ошибка распаковки файла ресурсов (iOS). При указании фиксированного размера иконки в кнопке через Appearance.Icon.Size, неверно центрировалась иконка (Android). Событие TfgListMenu.OnTapItem могло иногда не работать (iOS). Событие TfgTrackBar.OnChanging не работало (iOS). Теперь событие TfgTrackBar.OnChanging не вызывается, если ContinuesUpdates = False (Android). Открытие формы с TfgForm.IsTransparen = True приводило к падению приложения (iOS).
    8 points
  32. Скачать: Релиз доступен только по запросу. Дата релиза: 14 декабря 2020 Новое ✨ Добавлен новый компонент TfgBottomSheetLayout для IDE и Android и два демо-проекта "Компоненты" -> "TfgBottomSheetLayout" -> "Модальный режим", "Интересные места на карте". Улучшения ? Транслировали все типы android.telephony пакета в Android.Api.Telephony. Пометили все методы Android Api, которые введены позднее Android 5.0. Немного реструктурировали группировку заголовочных файлов. Все классы, связанные с анимацией перенесли в Android.Api.Animations. Перенесли базовые классы текстовых классов в Android.Api.Text. Раньше все загружаемые битмапы из файла или потока в Андроиде были не изменяемыми. Это значит, что на них нельзя было ничего рисовать. Чтобы выполнить отрисовку поверх приходилось делать копию через отрисовку битмапа на канве другого битмапа. Сейчас все битмапы мутабельны в принципе. Исправление ошибок ? При автоматическом открытии форм при загрузке группы FGX Native проектов, могли не применяться ассеты у форм. Исправлена потенциальная ошибка, которая могла возникать при закрытии формы, проекта или среды. Приложение с кнопкой с картинкой могло падать на iOS. При первом открытии TfgDrawer при помощи кнопки, панель открывалась без анимации.
    8 points
  33. Скачать: setup_1.11.4.0_release.rus.zip Дата релиза: 30 июля 2021 Внимание 🚨 Оболочка MIUI автоматически пытается применить системную темную тему в обход стандартным средствам Android. Такая попытка применения темы может визуально выражаться в искаженных цветах именно на MIUI последних версий, так как она переопределяет системное поведение чистого Android по адаптации приложений к темной теме. Приложения FGX Native пока не поддерживают темную тему, поставляемую системой. Поэтому, чтобы избежать искажения цветов, необходимо: Если приложение старое, то внести в файл styles.xml строчку и выполнить полную сборку приложения: <item name="android:forceDarkAllowed">false</item> Если приложение создано на новой версии библиотеки, то ничего дополнительно делать не нужно. FGX-115 Тусклое изображения на устройстве с темной темой (Android). Улучшения 🙌 TfgNavigationBar Переработана реализация компонента для iOS. Реализовано выпадающее меню для схлопнутых кнопок ActionButtons, которые не помещаются на панели. Теперь если у кнопки нету иконки, то отображается ее текст. TfgVirtualKeyboard Добавлено новое событие TfgForm.OnVirtualKeyboardBeginFrameChanging, вызываемое в начале анимации изменения области отображения виртуальной клавиатуры. В параметрах события передаются параметры анимации (длительность анимации, тип интерполяции), которые вы можете использовать для анимированной подстройки вашего UI под виртуальную клавиатуру. Событие дублируется широковещательной рассылкой сообщения FGX.VirtualKeyboard.TfgOnVirtualKeyboardBeginFrameChangingMessage, которое вы можете поймать в любом месте вашего приложения. Для Android новое событие пока вызывается сразу же перед OnVirtualKeyboardFrameChanged. FGX-113 Изменение фазы обработчика OnFormVirtualKeyboardFrameChanged (iOS). Прочее Добавлен новый демонстрационный проект: "Форма" -> "Безопасные отступы". Исправление ошибок 🐛 FGX-81 Некорректная работа нескольких TfgNavigationBar.ActionButtons (iOS). FGX-85 Нет сплеша (iOS). FGX-96 Не изменяется высота TfgItemWrapper в TfgCollectionView (iOS). FGX-106 Некорректно работает TfgVerticalScrollBox.ScrollBottom (iOS). FGX-108 Неверные размеры формы в событии Form.OnCreate (iOS). FGX-109 Ошибка в выполнении PositionAnimation (Android). FGX-115 Тусклое изображения на устройстве с темной темой (Android). FGX-116 TfgSVGPath не понимает кодировку картинок. Иногда могло вызываться событие TfgForm.OnVirtualKeyboardFrameChanged до полной загрузки/создания формы (iOS). Иногда тема могла применяться не верно для компонентов динамически добавленных в TfgPopup. В событии TfgForm.OnSafeAreaChanged передавалось не корректное значение нижнего отступа (Android). Удаление формы с TfgDrawerLayout или TfgBottomSheetLayout приводило к падению приложения (iOS). Событие TfgMap.OnMapReady вызывалось до TfgForm.OnCreate (iOS). Удаление формы с выделенным маркером в TfgMap приводило к падению (iOS). При касании маркера текущего положения пользователя в TfgMap приводило к падению (iOS). При создании маркера через использование TfgMapMarkerOptions точка привязки изображения маркера Anchor не применялась (Android). Так же изменена точка привязки изображения маркера с центра (0.5, 0.5) на нижнюю центральную точку (0.5, 1.0) по умолчанию. Добавлено применение дефолтных отступов кнопки для (iOS).
    7 points
  34. Стала доступна запись вэбинара Демо-пример будет выложен сразу после очередного релиза, т.к. в нем используется часть нового функционала недоступного в текущем релизе.
    7 points
  35. Пример мобильного приложения из вебинара так же будет доступен на форуме несколько позже.
    7 points
  36. Продолжаем анонсировать интересные возможности новой версии FGX Native 1.11.0.0. И в этот раз - это компонент локализации TfgTranslator. В этой версии мы поставляем отдельный bpl-пакет с компонентом локализации TfgTranslator, который мы сами уже давно и успешно используем в реализации FGX Native дизайнера. Однако, мы не рекомендуем его использовать в мобильных приложениях, поскольку все словари с переводами всегда загружаются при создании формы, а так же, поскольку у нас есть иное видение того, как должен осуществляться перевод в мобильных приложениях. Несмотря на сказанное - это рабочее решение, которое может помочь вам с локализацией ваших проектов. Мы поставляем этот компонент по правилу "as-is", то есть нет никаких гарантий (в том числе и поддержки) с нашей стороны по его работе. Этот пакет не является постоянным и может быть в будущем исключен из поставки при появлении рекомендованного решения. Как установить? Чтобы установить компонент локализации нужно выполнить регистрацию нового пакета компонента в среде. Для этого: Открываем менеджер пакетов: Main menu -> Component -> Install Packages. Нажимаем кнопку "Add..." Открываем каталог, где установлен FGX Native и открываем каталог, соответствующий версии вашей IDE. Если вы не меняли место установки библиотеки, то: "C:\Users\Yaroslav\AppData\Local\FGX Native\Libs\<версия IDE>\Win32\Release" Выбираем "FGXTranslatorD.<версия IDE>.bpl": Для 10.3 - 260 Для 10.4 - 270 Закрываем окно нажатием на кнопку OK. Теперь компонент TfgTranslator доступен для использования на панели "Pallette": FGX: Translator -> TfgTranslator. Как использовать? Компонент TfgTranslator выполняет перевод всех строковых свойств в рамках одной формы. Чтобы им воспользоваться, нужно бросить компонент на форму. Чтобы выполнить первичную настройку, необходимо создать список поддерживаемых языков и, по желанию, выполнить перевод текущих строк. По двойному нажатию на компонент открывается редактор: Добавление языков По умолчанию, в компоненте есть только один язык "default", который используется для всех языков, если перевода нет. Вы можете добавить любое количество дополнительных языков. Для этого нажмите кнопку с глобусом и введите код языка (например "en"). После добавления всех языков, необходимо выполнить перевод доступных строковых ресурсов или завести свои строковые константы. Сканирование строковых ресурсов Компонент позволяет автоматически собрать все доступные строковые значения свойств компонентов формы. Для этого нужно нажать на кнопку с двумя стрелками. Это автоматически добавит в словарь все строковые ресурсы. В столбце "Ключ" указаны уникальные идентификаторы переводимых строк, в остальных столбцах содержатся переводы на доступные языки. С большой долей вероятности, после сканирования строк, вам будет необходимо удалить все лишние строки. Вы можете это сделать при помощи кнопки Delete. Ручные строковые ресурсы Вы можете указать свои строковые ресурсы для использования их в рантайме. Для этого надо нажать на кнопку "T+" и указать код строки и ее переводы. Перевод Выполните перевод текущего словаря путем двойного нажатия на ячейку таблицы. Смена языка Смена языка осуществляется при помощи свойства TfgTranslator.LangId, где нужно указать нужный язык. При смене кода языка, компонент автоматически выполнит перевод указанных свойств. Русский (по умолчанию): Английский:
    7 points
  37. Название приложения: БрГТУ Ассистент Платформа: Android 32 bit, Android 64 bit Поддерживаемые версии ОС: Android 5.0 и новее Необходимое свободное место: до 60 Мб Ссылка на приложение: https://play.google.com/store/apps/details?id=atpdev.bstu_assistant Ссылка на сайт приложения: http://dilyaso1.beget.tech/ Описание: БрГТУ Ассистент - приложение, созданное студентами для студентов. Базовая версия приложения позволяет удобно просматривать расписание занятий для учебной группы, а также новости Брестского Государственного Технического Университета. Разработчики: Супрунчук Павел, Ильяшевич Дмитрий. Приложение только недавно было создано, и находится в стадии большой доработки. В будущем планируем расширять функционал.
    7 points
  38. Скачать: Релиз доступен только по запросу. Дата релиза: 30 января 2021 Новое ✨ Реализован компонент TfgComboBox для iOS. Портирован компонент TfgSignature предназначенный для ввода подписи (iOS, Android). Компонент позволяет получить подпись пользователя в векторном виде, сохранить ее в TfgBitmapили в поток. Добавлен новый пример показывающий использование нового компонента TfgSignature: "Компоненты" -> "TfgSignature" -> "Базовый пример". Добавлена реализация системного сервиса (APS) Push-уведомлений для iOS (Не протестировано!). Улучшения 🙌 Добавлены перегруженные версии методов TfgBitmap.SaveToStream и SaveToFile с возможностью указать качество сохранения. Теперь при сохранении TfgBitmap в поток, можно указывать формат изображения (PNG, JPEG). Исправление ошибок 🐛 TfgEdit.Text иногда мог возвращать неактуальный текст (iOS). У некоторых компонентов, используемых в TfgCollectionView, могли слетать ресурсы. У TfgButton при использовании не Default вида тема могла применяться не с первого раза. При работе с TfgBitmap после сохранения в файл приложение могло падать (iOS). TfgCanvas не учитывал параметры шрифта в IDE при работе с текстом (Win). Добавление пункта меню в рантайме TfgListMenu приводило к ошибке (iOS). TfgCollectionView Требуется непустое значение Owner при закрытии дочерней формы (iOS).
    7 points
  39. Скачать: Релиз доступен только по запросу. Дата релиза: 22 ноября 2020 Новое ✨ Базовая реализация TfgMap для iOS (без объектов на карте). Добавлены заголовочные файлы для iOS MapKit. Теперь TfgWebBrowser автоматически выводит в лог устройства сообщения из JavaScript консоли. Улучшения ? Реализовали TfgControl.BackgroundName для iOS. Теперь фоновая картинка растягивается на весь компонент и поддерживается 9-patch. Реализованы TfgImage.TintColor и TfgImage.TintColorName для iOS. Реализовано событие TfgCollectionView.OnTapItem для iOS. Реализовано событие TfgNavigationBar.OnNavigationIconTap для iOS. Исправление ошибок ? Изменение свойства TfgImage.TintColor в рантайме не обновляло визуальное отображение изображения. FGX Native Андроид сервис падал при старте. Использование TfgCollectionView.FindItemIndexByObject приводило к падению приложения на iOS. TfgNavigationBar не мог открыть TfgDrawerLayout в iOS. При изменении стиля или размера шрифта TfgFont у компонентов, iOS не использовала системный шрифт. В результате чего отображение стилизованного текста могло отличаться от шрифта, используемого по умолчанию. System.Bluethooth использует часть классов от FMX, в результате чего приложение падало при старте в FGX Native окружении.
    7 points
  40. В эту среду совместно с компанией Embarcadero проводим вебинар посвященный разработке мобильного приложения с использованием FGX Native. На вебинаре разберем одну из возможных архитектур мобильного приложения, применим шаблон MVVM для построения экранов. И познакомимся с приемами создания мобильных интерфейсов с FGX Native. Когда: 23 июня 2021 в 12:00 МСК Язык: русский Заголовок: Примеры использования библиотеки FGX Native для создания макетов реальных мобильных приложений. Ссылка на регистрацию: https://lp.embarcadero.com/fgx-native Анонс:
    6 points
  41. Добрый день , так сказать, "листая старые страницы". С докуки перевел оное на fgx. Под иос не публикую, ибо своих диалогов там не предусмотрено, а пример, который я уже публиковал всё объясняет. Спасибо. З.Ы. Не забываем про jar и разрешения. З.З.Ы ставьте лайк и жмите на колокольчик Это я шутю конечно, youtube пересмотрел. FingerPrint.zip
    6 points
  42. Скачать: Релиз доступен только по запросу. Дата релиза: 29 апреля 2021 Новое ✨ Добавлен новый демонстрационный проект: "Компоненты" -> "TfgCollectionView" -> "Перемещение элементов между собой". Улучшения 🙌 FGX-52 Отображение белых картинок в инспекторе объектов. Исправление ошибок 🐛 FGX-48 Прокрутка ScrollBox'a в Design формы. FGX-49 Переключение Code->Design по F12. FGX-50 "Segmentation fault (11)" при завершении приложения, если было изменение ItemIndex у TfgComboBox (Android). FGX-51 Удаление страниц в редакторе формы у fgPageControl. FGX-53 Падение IDE при перетаскивании TfgPage в Desingtime. FGX-55 Игнорируются свойство Enabled и HitTest у TfgEdit (Android).
    6 points
  43. Download: The distributive is available by request only. Release date: 19 January 2021 Loss of backward compatibility 🚨 TfgCanvas The default direction of the gradient is left-to-right instead of top-to-bottom now. TfgBottomSheetLayout We have revised the modal mode of TfgBottomSheetLayout and decided to expand possibility of this component. We introduced 2 new settings group: TfgBottomSheetLayout.ContentShadingSettings - shading settings of main content TfgBottomSheetContent. It allows to specify color of shading and enable/disable it. TfgBottomSheetLayout.BlockContentMode - mode of blocking touch events of main content TfgBottomSheetContent. You can easily tune the modal mode with these settings. At the same time you can do combined modal mode, when main content is available in collapsed sheet mode. You can use TfgBottomSheetLayout.ContentShadingSettings.Enabled = True and TfgBottomSheetLayout.BlockContentMode = WhenCollapsedOrExpanded for emulating old modal mode. New ✨ TfgListMenu We introduced new property to fine-tune the component's color scheme. This settings group doesn't allow set different colors for different menu items since the component follows the concept of Material Design. However, you can now specify the base colors of the scheme and the colors for the separator for the normal display mode of the menu item and the selected one, which was not possible before. In addition, quite often, the icons used in menu items need to be tinted. This could be solved at the assets designer level by simply specifying the desired tint color for an icon. However, the icons used in the menu can be used in other places in practice. In this situation, you had to have two duplicates of the same icon, but with different shades, which certainly increases the size of the application and complicates further editing of resources. The situation is complicated when the color of the icon when selected differs from the color of the icon without selection. The solution to this problem is now succinctly done through a new group of settings Appearance.Icon, which works on the same principle as the similar property of TfgButton. Here you can specify the color of the icon without and with selection. As a result, you only need to have one icon in the resources of this base size for all other places. Clipboard We implemented new crossplatform service FGX.Clipboard.TfgClipboardService for Android and iOS for working with system clipbaord. At the moment, the service allows you to work only with text. To get acquainted with the work of the service, an example is available "System services" -> "Text clipboard". Measure Text The new method TfgCanvas.MeasureText was added for calculation text size. Other Now, if you are using non-implemented components (TfgCalender, TfgVideoControl, TfgSearchEdit, TfgAutocompleteEdit) for iOS, it will not lead to application crash and application will show visual stubs instead. We added new iOS API headers: AVFoundation, CoreMedia and CoreVideo. Improvements 🙌 Themes Despite the fact that the themes have been supported for a long time, they had a number of difficulties associated with the use of custom resource names. Changing the theme automatically worked perfectly for all components that the developer did not specify their resource. However, as soon as any resource was specified (not by default), such a resource was considered independent of the theme and did not change when switching the theme. We fixed this situation and now the resource is bound to the current form topic if the resource is specified from the current form. This allows you to make a full-fledged theme switch for all properties. If the resource is not linked to a topic, then this resource will not change when the form changes the topic. Now we always display the name of the asset used by default for the property even if there is no asset, unless otherwise specified. We decided that this would make it easier to understand what resources the component uses by default. Other We provided two new theme colors to the theme generator: "On Surface" and "On Background" - These are contrasting colors intended for use in elements that use the "Surface" or "Background " color scheme. To get the color data, just re-generate the theme in the asset designer. We added new helpers for TAlphaColor (look at FGX.Types.Color) allowing you to work with color components, perform basic alpha channel transformations, and so on. Optimization for using fonts for painting on canvas TfgCanvas.FillText (Android). Bug Fixes 🐛 TfgCanvas TfgArch with SweepAngle 360 not drawing properly (Android). Fixed drawing with a gradient brush TfgCanvas.Fill and a gradient pen TfgCanvas.Draw (Android). Fixed drawing points with pen TfgCanvas.DrawPoints(s) (Android). Fixed drawing arc with pen TfgCanvas.DrawArc (Android). Fixed polygon filling TfgCanvas.FillPolygon (Android). Fixed drawing of an arc as part of a TfgCanvas.TfgPath (Android). Fixed drawing position of text on canvas TfgCanvas.FillText (iOS). Other TfgArch and TfgArc didn't show correctly round state IsCircle=True, if component's height was greater than width. We fixed wrong declaration of external functions and procedures in iOS API. We fixed delays in alignment system (iOS). The form has right size immediately after creating now (iOS). The bug of extracting file asset was fixed (iOS). If TfgButton used custom icon size Appearance.Icon.Size, it used wrong icon position. The TfgListMenu.OnTapItem event could sometimes not work (iOS). The TfgTrackBar.OnChanging event didn't work (iOS). The TfgTrackBar.OnChanging is not invoked, if ContinuesUpdates = False (Android). The openning form with TfgForm.IsTransparen = True led to crash (iOS).
    6 points
  44. Скачать: Релиз доступен только по запросу. Дата релиза: 29 декабря 2020 Потеря обратной совместимости 🚨 Изменена логика обработки нажатия кнопки HardwareBack при включенной опции TfgForm.CloseOnHardwareBack: Нажатие кнопки теперь обрабатывает только активная форма, а не все формы, как ранее. Вместо TfgForm.Hide вызывается TfgForm.Close. Если нажатие кнопки было на главной форме и CloseAction равен Hide, то приложение уходит на задний план. Новое ✨ Добавлено новое свойство TfgVirtualKeyboard.IsKeyboardShown показывающее открыта ли в данный момент виртуальная клавиатура. Добавлен новый метод TfgForm.Close позволяющий скрыть или разрушить форму. Решение о действии с формой принимается на основании свойства TfgForm.DefaultCloseAction или в событии TfgForm.OnClose. Улучшения 🙌 Теперь с помощью TfgAutoreleasePool можно отложено уничтожать объекты и интерфейсы, которые не были прежде помещены во внутренний список хранения. Для iOS компонентов добавлена возможность управления фокусом (SetFocus, ResetFocus, IsFocused). Реализованы свойства ContentPadding, IconName, BorderStyle, SelectAllOnFocus, OnReturnKeyPressed, OnEnter, OnExit и все методы по работе с выделением для TfgEdit под iOS. Реализованы события OnEnter и OnExit для TfgMemo под iOS. Реализованы события TfgNavigationBar.OnActionButtonTap и TfgNavigationBarButton.OnTap под iOS. Исправление ошибок 🐛 Метод TfgCanvas.FillText игнорировал аргумент WordWrap для отрисовки многострочного текста. При установленном свойстве TfgDateEdit.IsEmpty в True невозможно выбрать сегодняшнюю дату. Свойство TfgMemo.Text всегда возвращало пустую строку iOS. При определенных условия приложение могло упасть при использовании TfgButton под iOS. При использовании маски в TfgImage изображение в компоненте могло неправильно отображаться в дизайнере. TfgLine неверно отображалась верхняя часть вертикальной линии.
    6 points
  45. Очень часто нам задают вопрос о проблемах, возникающих в процессе разработки с использованием библиотеки. При этом в 95% случаях мы задаём однотипные вопросы, которые необходимы для понимания проблемы. На это уходит, как ваше время, так наше. В результате чего решение вопроса откладывается до ответов на самые базовые вопросы. И как следствие откладывается и решение проблемы. При этом с определенной долей вероятности проблема встречается в клиентском коде. Мы решили собрать базовые вопросы, на которые надо ответить, задавая вопрос. Здесь собраны основные рекомендации о том, как сообщить о проблеме, с которой вы столкнулись. Эти рекомендации нацелены на быстрое и оперативное решение проблемы. Обязательно: Указать версию IDE. (Например: Embarcadero® RAD Studio 10.4 Version 27.0.39600.2474 - узнать можно в окне Help-> About Embarcadero RAD Studio) Указать версию FGX Native. (Например: 1.6.0.3) Если речь идет о проблеме на мобильном устройстве, то: Указать версию OC (Например: Android 7.1.1). Снять логи с устройства, если приложение падает. (Видео-инструкция для Android). Если приложение падает, то предоставить StackTrace. (Инструкция) Минимальный демо проект, который демонстрирует описываемую проблему (если проблема не плавающая). Если проблему не удается локализовать и создать демо-проект, то сообщить об этом в вопросе. Указать шаги для ее воспроизведения. Желательно: Если проблема связана с внешним видом, то приложить скриншот или видео запись с экрана, на котором видна описанная проблема. Указать модель устройства (Например: Nokia 5.3).
    6 points
  46. Скачать: Релиз доступен только по запросу. Дата релиза: 16 ноября 2020 Новое ✨ Теперь можно указывать оттенок изображения на уровне компонента TfgImage. Для этого добавлены новые свойства TintColor и TintColorName. Полная реализация TfgWebBrowser компонента для iOS. Добавлены заголовочные файлы для iOS WebKit. Улучшения ? Транслировали все типы android.webkit пакета. Добавили новый уровень логирования сообщений TfgLogLevel.Trace, предназначенный для логирования отладочных диагностических сообщений библиотеки. Сообщения данного уровня не попадают в лог по умолчанию. Чтобы включить отображение в логе Trace сообщений нужно изменить TfgLog.MinimumLevel = TfgLogLevel.Trace. Все отладочные сообщения библиотеки уровня Debug убраны по умолчанию из системного лога. Если вам необходимо выполнить диагностику работы компонентов или платформы в целом, вам необходимо изменить TfgLog.MinimumLevel = TfgLogLevel.Trace. Данное изменение призвано упростить поиск в логах сообщений разработчиков, при этом оставив возможность для полноценной отладки и поиска ошибок в вашем приложении. В окне “История изменений” можно отключить автоматическое отображение этого окна при старте, если установлена новая версия библиотеки. Пересмотрели ведение Changelog, обновили отображение в Release Notes, добавили форматирование, ссылки и т.д… Исправили несколько утечек памяти в дизайнере. Исправление ошибок ? Невозможно было изменить цвет выделения TfgCollectionView. При вводе текста в поле ввода в runtime не обновлялось значение свойства TfgEdit.Text под iOS. При добавлении любого вида TfgScrollBox iOS приложение падало на старте. Выполнение Javascript кода в TfgWebBrowser приводило к падению приложения, собранного в IDE 10.4.
    6 points
  47. Скачать: Релиз доступен только по запросу. Дата релиза: 13 октября 2020 Список изменений: * Текстовые контролы с настраиваемым шрифтом: - Реализована поддержка недостающих стилей шрифта Underline & Strikeout. https://forum.fgx-native.com/topic/563-tfgabel-%D0%BD%D0%B5-%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0%D0%B5%D1%82-%D0%BF%D0%BE%D0%B4%D1%87%D0%B5%D1%80%D0%BA%D0%B8%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5-%D0%B8-%D0%B7%D0%B0%D1%87%D0%B5%D1%80%D0%BA%D0%B8%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5-%D1%82%D0%B5%D0%BA%D1%81%D1%82%D0%B0/ * TfgPageControl: - В дизайнере текст вкладок всегда отрисовывался шрифтом по-умолчанию. - При переключении вкладок фокус с предыдущей страницы переносился на первый контрол новой вкладки. Исправлено. https://forum.fgx-native.com/topic/559-%D0%BA%D0%B0%D0%BA-%D1%83%D0%B1%D1%80%D0%B0%D1%82%D1%8C-%D0%B0%D0%B2%D1%82%D0%BE%D1%84%D0%BE%D0%BA%D1%83%D1%81-%D1%83-tfgedit/ * TfgCanvas: - Добавлен новый метод для отрисовки на холсте изображения с маской DrawBitmapWithMask. Результат работы этого метода аналогичен работе TfgImage при задействовании MaskImageName. * TfgTrackBar: - Исправлена ошибка при загрузке границ значений трекбара в runtime. https://forum.fgx-native.com/topic/571-tfgtrackbar-%D0%BE%D1%88%D0%B8%D0%B1%D0%BA%D0%B0-%D0%BF%D1%80%D0%B8-%D1%83%D0%BA%D0%B0%D0%B7%D0%B0%D0%BD%D0%B8%D0%B8-%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B8-min/
    6 points
  48. Название приложения: Займы в Займ Платформа: Android32, Android64 Поддерживаемые версии ОС: Android 6.0 и новее Описание: Приложение Займы в Займ – это сервис по выдаче срочных займов онлайн. Ссылки на приложения: Google Play - Ссылку предоставлю как приложение с новым интерфейсом пройдет модерацию Google P.S. На некоторых скриншотах еще старое меню навигации, эти изображения представлены т.к. пока "по техническим причинам" не могу полностью пройти этап подачи заявки. Представлены только часть окон приложения. P.S.S Если у кого какие вопросы, или критика пишите, всегда рад!)
    5 points
  49. Скачать: Релиз доступен только по запросу. Дата релиза: 29 марта 2021 Исправление ошибок 🐛 Закрытие формы с TfgPageControl приводило к падению приложения (Android).
    5 points
  50. Скачать: Релиз доступен только по запросу. Дата релиза: 19 октября 2020 Список изменений: * TfgPageControl: - Регрессия. При определенных обстоятельствах контролы, лежащие на TfgPageControl могли терять фокус. * TfgComboBox: - Добавлен новый метод "Open" для программного открытия списка.
    5 points
×
×
  • Create New...