Skip to content
View in the app

A better way to browse. Learn more.

FGX Native

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Yaroslav Brovin

Administrators
  • Joined

  • Last visited

Everything posted by Yaroslav Brovin

  1. Hello, Any visual control in FGX Native consists from 2 parts: Crossplatform heirs from TfgControl NativeControl - implementation of control (1) on each platform Android/iOS. When TfgControl is being allocated, it request Native Control class implementor on current platform from FGX.Controls.Factory.TfgNativeControlFactory. constructor TfgControl.Create(AOwner: TComponent); begin inherited; // skipped lines FHandle := TfgNativeControlFactory.CreatePresentation(DefineNativeControlName, Self); By default native controls implementors are registered in TfgNativeControlFactory by control class name. function TfgControl.DefineNativeControlName: string; begin Result := ClassName; end; TfgEdit has 2 implementors FGX.Edit.iOS.TfgiOSEdit for iOS and FGX.Edit.Android.TfgAndroidEdit for the Android. The typical registration can be looks like: initialization TfgNativeControlFactory.Register(TfgEdit, TfgiOSControl.CreateHandle<TfgiOSEdit>); initialization TfgNativeControlFactory.Register(TfgEdit, TfgAndroidControl.CreateHandle<TfgAndroidEdit>); Since you introduced new control, TfgNativeControlFactory doesn't know about who is implementing native parts for iOS and Android. There are 2 possible ways: If your implementation doesn't work with native control (your case). You can tell point on using existed implementor from TfgEdit. So just add this method: TfgEditNumber = class(TfgEdit) protected function DefineNativeControlName: string; override; function TfgEditNumber.DefineNativeControlName: string; begin Result := TfgEdit.ClassName; end; So your implementation will request default implementor for TfgEdit class. If you are interact and need to extend native controls implementation, so you need to create 2 different heirs from TfgiOSEdit and TfgAndroidEdit and register them in TfgNativeControlFactory.
  2. Is this application for TV?
  3. Hello, What do you mean about OnGetFocused? Item in collection view doesn't have focus in general. If you are talking about selection, so you should have a look at the: OnItemSelectionChanged, OnSelectionChanged
  4. Hello, ImageName is just a reference on asset with name in TfgAssetsManager. It cannot be URL. There are at least 2 ways how to download image: Automatically via FGX Native. Look at the followed demo samples: Assets -> Images -> "Asynchronous image loading by URL". It demonstrates how to load image with Assets manager by URL via the Internet. TfgAssetsManager can download image. Manually. You can manually download all required images via the THttpClient component for example, than add images to TfgAssetsManager via Add method and Also keep in mind, the device has limited memory, so if you try to downoad 10K images to memory, application will crashed with OutOfMemory exception. However, AssetsManager has special mechanizm for it. Look at the demo "Assets" -> "Images" -> "Releasing image from memory" It's completly wrong code. You need to study the demo projects. Components -> TfgCollectionView. PS. All demo projects are available from the main menu File -> New -> FGX Sample If you have questions after trying our demo samples, feel free to ask here. Thank you
  5. Данная статья является полной информацией о темах в FGX Native и актуальным руководством, начиная с 1.19.0.0. Введение Виды тем Акцентный цвет Системная тема и тема приложения Системная тема Получение параметров системной темы Механизмы отслеживания системной темы Как управлять системной темой в приложении Запрет автоматической смены системной темы в приложении Темная тема Тема FGX Native Цветовая система Material Design Основной цвет Вторичный цвет Цвета поверхности, фона и ошибок Цвета "На" Альтернативные цвета Прочее Генерация темы в FGX Native Применение темы Приложение Форма Принцип смены темы Использование ресурсов темы Типы значений Приоритет Применение ресурсов темы Фиксация темы Расширение темы Пример разработки приложения с поддержкой темной и светлой тем и разных цветовых оттенков. Создание тем в дизайнере ресурсов Настройки тем в проекте Программная смена тем и акцентированного цвета Советы 1. Введение Тема — это совокупность настроек, цветов, звуков, шрифтов, курсоров, иконок, фоновых изображений и других элементов, отвечающих за интерфейс приложения. 1.1 Виды тем В современном мире обычно различают два вида тем: Светлая тема - преимущественно использует светлые цвета в UI. Темная тема - преимущественно использует темные цвета в UI. Именно эти два вида распространены в Android и iOS. Далее, в каждом виде могут быть уже темы разных цветовых палитр, с разными акцентными цветами и т.д. 1.2 Акцентный цвет Акцентный цвет - это дополнительный цвет, который контрастирует или дополняет основные цвета, используемые в приложения. По умолчанию, в iOS такой цвет голубой, а в Android - изумрудный. Вот некоторые задачи, для которых используют акцентные цвета: Привлечение внимания. Яркий акцентный цвет привлекает взгляд пользователей и помогает им ориентироваться на странице. Организация информации. Использование акцентного цвета для заголовков и подзаголовков помогает организовать информацию на странице и делает её более понятной для пользователей. Выделение важных элементов. Акцентный цвет помогает выделить важные элементы, такие как акционные предложения или срочные сообщения, и привлечь внимание пользователей к ним. При выборе акцентного цвета часто используют правило 60-30-10: 60% — основной цвет, 30% — акцентный, 10% — второй акцентный цвет, если он имеется. 1.3 Системная тема и тема приложения В дальнейшем, когда мы будем говорить про тему, то мы будем рассматривать два типа тем: Системная тема (Обязательная). Это та, которая поставляется вместе с операционной системой и все приложения используют ее по умолчанию. Тема приложения (Необязательная). Это та, которая поставляется вместе с приложением и предназначена для переопределения системной темы. 2. Системная тема Тема операционной системы / системная тема — это совокупность настроек, цветов, звуков, шрифтов, курсоров, иконок, фоновых изображений и других элементов, отвечающих за интерфейс ОС. Эти ресурсы уже включены в дистрибутив операционной системы. Практически каждое приложение прямо или косвенно использует эти ресурсы. При запуске приложения, каждый компонент выбирает цвета, настройки шрифтов и многое другое из текущей темы системы. Разработчик может оставить внешнее отображение компонентов, как есть, доверив их системе. Либо же, может переопределить их на уровне своего приложения и настроить внешний вид уже так, как он хочет на уровне темы приложения. В любом случае, получение параметров системной темы, может пригодиться для динамической настройки внешнего вида вашего приложения. 2.1 Получение параметров системной темы В FGX Native предоставляет кроссплатформенный механизм для получения некоторых параметров системной темы и отслеживания их изменения. В любой момент времени вы можете запросить параметры системной темы через FGX.SystemInfo.TfgSystemInfo.Appearance: /// <summary>Данные о отображении операционной системы.</summary> TfgSystemAppearance = class private function GetSystemColor(const Index: TfgSystemColorType): TAlphaColor; function GetThemeKind: TfgSystemThemeKind; public /// <summary> /// Акцентный цвет операционной системы. Обычно используется для подчеркивания элементов компонентов. /// </summary> property AccentColor: TAlphaColor index TfgSystemColorType.Accent read GetSystemColor; /// <summary>Вид системной темы.</summary> property ThemeKind: TfgSystemThemeKind read GetThemeKind; end; ThemeKind - вид системной темы (Светлая/Темная). AccentColor - акцентный цвет в текущей теме. В случае, если вам понадобятся другие параметры системной темы, пожалуйста, дайте нам об этом знать и оставьте заявку через Feature Request. 2.2 Механизмы отслеживания изменений системной темы. При изменении любых параметров системной темы, которые влияют на приложение, система оповещает приложение о таких изменениях. Эти изменения можно узнать следующими способами: Первый способ: На уровне формы есть событие TfgForm.OnSystemAppearanceChanged, которое вызывается каждый раз, когда меняется один из параметров отображения системной темы. TfgSystemAppearanceChangedEvent = procedure(Sender: TObject; const AAppearance: TfgSystemAppearance) of object; В параметре AAppearance (FGX.Platform.TfgSystemAppearance) передается объект, позволяющий извлечь базовую информацию о теме. Для удобства, это событие вызывается всегда один раз при первом отображении формы. Это сделано, чтобы вы могли поместить код по адаптации внешнего вида формы в одно место без необходимости отдельно запрашивать текущие параметры системной темы. Второй способ: Если вы хотите отслеживать изменения в системной теме вне формы, то вы можете подписаться на широковещательную рассылку на сообщение FGX.Platform.TfgSystemAppearanceChangedMessage /// <summary>Уведомление о смене системной темы.</summary> TfgSystemAppearanceChangedMessage = class(TObjectMessage<TfgSystemAppearance>); Полученный объект TfgSystemAppearance удалять не нужно. 2.3 Управление системной темой в приложении. Как мы упомянули выше, системная тема определяет внешний вид вашего приложения по умолчанию. Однако, пользователи вашего приложения могут иметь свои предпочтения в использовании светлой или темной темы в рамках вашего приложения. И поэтому FGX Native предлагает механизм для указания этого предпочтения. Управление применением системной темой к приложению осуществляется при помощи настроек Application.Themes. Вид системной темы указывается в свойстве: Application.Themes.Kind. TfgThemeKind = (SystemDefault, Light, Dark); Допускает три варианта значений: Light - приложение использует светлую тему. Dark - приложение использует темную тему. SystemDefault - приложение использует такую же тему, как и в системе. При смене темы в системе, автоматически изменится тема и в приложении. Только, если приложение поддерживает темную тему (смотри следующий раздел). 2.4 Запрет автоматической смены темы в приложении Если ваше приложение не поддерживает темную тему. Например, если вы используете свой дизайн или вы не предусмотрели отображение приложения в темной теме, то вы можете отключить темную тему для приложения, чтобы приложение не пыталось её использовать. Это выполняется в настройках проекта Project -> FGX Options -> Приложение -> Темы. Необходимо снять галку "Включить темную тему". 2.5 Темная тема Не смотря на то, что темная системная тема появилась относительно давно, ее полноценная поддержка есть не на всех версиях. iOS 13.0+. До 13 версии поддержки нет. Android 10+ (Level 29+). До 10 версии есть только адаптация. 3. Тема FGX Native Тема FGX Native представляет собой ни что иное, как заранее определенный набор цветовых ресурсов, которые помещены в одну папку и имеют относительно этой папки "известные" для FGX Native названия. В качестве цветовой системы использует цветовая системы Material Design 2.0 по умолчанию. Не смотря на это, вы можете использовать свои цветовые системы, которые вам могут быть удобнее. Выбор в большей степени зависит от вашего дизайна приложения. Прежде, чем перейти непосредственно к использованию темы в FGX Native, следует разобраться с принципом построения и использования системы Material Design. 3.1 Цветовая система Material Design Примечание: Данный текст частично взят и переработан с учетом специфики FGX Native с официального сайта Material Design. Система цветов помогает вам применять цвета в UI вашего приложения осмысленным образом. В системе Material Design 2.0 вы выбираете основной (Primary) и дополнительный (Secondary) цвета для представления вашего бренда. Затем на основании этих двух цветов строятся все остальные цвета, включая темные и светлые варианты каждого цвета. Базовая цветовая тема состоит из следующих цветов: Первичный/Основной (Primary) и вторичный (Secondary) цвета. Варианты основных и дополнительных цветов (Primary Varian, Secondary Variant). Эти цвета в FGX Native имеют следующие названия: "Primary\Dark Primary", "Secondary\Dark Primary" - Темный вариант основного и вторичного цветов "Primary\Light Primary", "Secondary\Light Primary" - Светлый вариант основного и вторичного цветов Дополнительные цвета пользовательского интерфейса, такие как цвета фона, поверхностей, ошибок, типографики и иконок. 3.1.1. Основной цвет Это цвет, который чаще всего отображается на экранах и в компонентах вашего приложения. Он же используется как акцентированный цвет для многих компонентов. Основной цвет можно использовать для создания цветовой темы для вашего приложения, включая темные и светлые варианты основного цвета. Например, чтобы создать контраст между элементами пользовательского интерфейса, верхней панелью приложений и системной панелью, вы можете использовать светлые или темные варианты основных цветов. Вы также можете использовать их для визуального различия элементов внутри компонента. 3.1.2 Вторичный цвет Вторичный цвет обеспечивает больше возможностей для акцентирования и выделения вашего продукта. Наличие вторичного цвета необязательно и должно применяться умеренно для акцентирования выбранных частей вашего пользовательского интерфейса. Если у вас нет вторичного цвета, основной цвет также можно использовать для акцентирования элементов. Вторичные цвета лучше всего подходят для: Плавающие кнопки действий Элементы управления выбором, такие как ползунки и переключатели Выделение выделенного текста Индикаторы прогресса Ссылки и заголовки Как и основной цвет, ваш вторичный цвет может иметь темные и светлые варианты. Цветовая тема может использовать ваш основной цвет, вторичный цвет и темные и светлые варианты каждого цвета. 3.1.3 Цвета поверхности / фона и ошибок Цвета поверхности, фона и ошибок обычно не представляют бренд и не зависят от основного и вторичного цветов. Однако, именно они и добавляют визуального порядка в пользовательском интерфейсе: Цвета поверхности (Surface) влияют на поверхности компонентов, таких как карточки TfgForm / TfgCardPanel / TfgBottomSheetLayout / TfgDrawerLayout, списки TfgCollectionView/TfgListMenu и меню. Цвет фона (Background) отображается за прокручиваемым содержимым. Базовый фон и цвет поверхности — #FFFFFF. Цвет ошибки (Error) указывает на ошибки в компонентах, такие как недопустимый текст в текстовом поле. Базовый цвет ошибки — #B00020. Если попробовать упростить эту модель и перенести ее на компоненты FGX Native, то можно выделить основные правила использования: Background обычно используется, как самый задний цвет контейнера верхнего уровня. Например, TfgForm. Surface используется, как цвет заднего фона для контейнеров, которые лежат на контейнере с фоном Background. Чаще всего это TfgCardPanel, TfgBottomSheetLayout 3.1.4 Цвета На/On Поверхности приложений используют цвета из определенных категорий в вашей цветовой палитре, например, основной цвет. Всякий раз, когда элементы, такие как текст или иконки, появляются перед этими поверхностями, эти элементы должны использовать цвета, разработанные так, чтобы быть четкими и разборчивыми по сравнению с цветами позади них. Эта категория цветов называется «На/On» цветами, ссылаясь на тот факт, что они окрашивают элементы, которые появляются «на» поверх поверхностей и используют следующие цвета: основной цвет, вторичный цвет, цвет поверхности, фоновый цвет или цвет ошибки. Когда цвет появляется «на» поверх основного цвета, он называется «над основным цветом». Они маркируются с использованием исходной цветовой категории (например, основной цвет) с префиксом «On». «On» цвета применяются в основном к тексту, иконографии и штрихам. Иногда они применяются к поверхностям. Такие цвета есть для всех цветов: основного, вторичного, поверхности, фона и ошибок цветов. В FGX Native такой набор состоит из 6 цветов: Text - основной цвет текст. Secondary Text - цвет дополнительного текста. Используется для выделения второстепенной текстовой информации, как примечание, подзаголовок и тд. Icon - цветовой оттенок иконок, отображаемых на текущем цвете. Dividers - цвет полосок разделителей. Например, полоса-разделитель элементов в списке TfgCollectionView. Hint Text - цвет текста для подсказки ввода текста в поля ввода (TextPrompt) Disabled Text - текст на компонентах, не доступных для взаимодействия. Пример ниже иллюстрирует ручное применение цветов темы для элементов кнопки. Если кнопка использует основной цвет "Primary", как фон. То, соответственно, иконка и текста должны использовать цвета из группы цветов "On Primary" 3.1.5 Альтернативные цвета Используемая цветовая система является рекомендованной, но не обязательной. Вы всегда можете, как добавить в нее дополнительные основные "Primary" цвета, чтобы расширить разнообразие цветов, так и использовать любую другую, например из Material Design 3.0. Например, приложение LEDPanel из выступления про разработку приложения, как раз демонстрирует использование альтернативной цветовой системы: 3.1.6 Прочее Об остальных вариантах использования цветов и правил их применения следует обратиться к официальной документации. Официальная документация 3.2 Генерация темы FGX Native Для того, чтобы добавить тему буквально в один клик, мы предлагаем генератор темы в дизайнере ресурсов (Project -> FGX Assets Manager). Он доступен либо в контекстном меню дерева ресурсов "Сгенерировать тему" , либо через соответствующую иконку на панели инструментов. В самом верху окна вам необходимо выбрать тип темы. Здесь все просто: "светлая" или "темная". Затем выбираете два базовых цвета: Основной Primary/P и Вторичный Secondary/S цвета. Левой кнопкой мыши выбирается основной цвет P, а правой - вторичный S. При выборе основных цветов, генератор автоматически определяет оттенок группы цветов "On" используемой на каждом из двух цветов. При необходимости вы можете откорректировать группы при помощи радиокнопок внизу. Если основной цвет яркий, то для соблюдения контраста, все элемента отображаемые На ярком цвете, должны быть темными и наоборот. После нажатия на кнопку "Сгенерировать", мы получаем наборы цветом согласно системе цветов Material Design. Если вы планируете использовать несколько тем в вашем приложении, мы рекомендуем группировать темы по типу (Светлая / Темная) и цветовым оттенкам. Например, так: Обратите внимание, что если вы хотите использовать темы вашем приложении, то вам как минимум надо сгенерировать светлую тем, а максимум, добавить еще и темную. 3.3 Применение темы В FGX Native тема может применяться на двух уровнях: Приложение Форма 3.3.1 Приложение Тема, применяемая на уровне приложения автоматически применяется ко всем формам и ко всем компонентам. Кроме случаев, о которых будет сказано далее. Тема может быть задана двумя способами. 1. На уровне настроек проекта (DesignTime) с 1.19.0.0: Этот основной способ и он позволяет применить тему, как в дизайнере, так и автоматически на старте приложения на устройстве. Чтобы задать тему на уровне приложения, нужно зайти в настройки проекта Project -> FGX Options... -> Приложение -> Темы В поле (1) мы можем указать способ выбора темы при старте приложения. Доступны три варианта: Согласно системной теме. Если на устройстве используется светлая тема, то будет использоваться светлая тема в приложении, если же в системе используется темная, то в приложении автоматически будет применена темная тема Светлая - Независимо от системной темы, внутри приложения будет использовать светлая тема. Темная - Независимо от системной темы, внутри приложения будет использовать темная тема. В поле (2) указываем название светлой FGX Native темы из дизайнера ресурсов. Если вы использовали нашу рекомендацию по группировке и именованию тем, то это может быть "Themes\Light\Green" (Светлая тема с зеленым основным цветов). В поле (3) включаем или отключаем поддержку темной темы в приложении. Возможно, ваш дизайн приложения не предусматривает темную тему или у вас ее нет. В этом случае, необходимо убедиться, что галка с этого поля снята. В поле (4) указываем название темной темы из дизайнера ресурсов (если включена поддержка темной темы). В момент старта приложения FGX Native применяет тему согласно вашим настройкам. Например, вот так: В режиме выполнения (Runtime): Этот способ может использоваться, если вы хотите позволить пользователю менять вашу тему в соответствии с его предпочтениями. За настройки темы (аналогичные 3.3.1) отвечает свойство Application.ThemeSettings: /// <summary>Название светлой темы FGX Native, используемой по умолчанию во всех формах.</summary> property LightThemeName: TfgThemeName read FLightThemeName write SetLightThemeName; /// <summary>Название темной темы FGX Native, используемой по умолчанию во всех формах.</summary> property DarkThemeName: TfgThemeName read FDarkThemeName write SetDarkThemeName; /// <summary>Применяемая тема по умолчанию.</summary> property ThemeKind: TfgThemeKind read FThemeKind write SetThemeKind; По сути здесь те же свойства, что и в настройках проектах, кроме возможность отключить темную тему во всем приложении. Например, если вы хотите добавить несколько вариантов тем для разных акцентных цветов, то вы можете это сделать так (если вы используете предложенные вариант группировки тем в дизайнере ресурсов) Application.ThemeSettings.LightThemeName := 'Themes\Light\' + AccentColorName; Application.ThemeSettings.DarkThemeName := 'Themes\Dark\' + AccentColorName; В любой момент времени, изменяя название темы приведет к автоматическом применению темы ко всему приложению. Узнать используемое в текущий момент времени название темы приложения можно через Application.ThemeName. 3.3.2 Форма Если по каким-то соображениям, вы не хотите, чтобы на каком-то экране/форме у вас использовалась тема приложения, вы можете ее переопределить локально на уровне формы, указав ее имя в свойстве TfgForm.ThemeName: В этом случае все вложенные компоненты будут автоматически использовать тему формы, а не приложения. 3.3.3 Принцип смены темы Когда меняется тема в приложении или локально в рамках одной формы, форма сообщает всем компонентам дерева о необходимости сменить тему. У каждого компонента вызывается виртуальный метод TfgControl.ThemeChanged и передается имя новой темы "AThemeName": /// <summary>Информирует, что изменена тема и следует обновить связи с ресурсами.</summary> procedure ThemeChanged(const AThemeName: TfgThemeName); virtual; Затем каждый компонент в зависимости от набора настроек выполняет применение новой темы к свойствам. Например, каждый компонент имеет задний фон BackgroundName, который поддерживает темизацию. Поэтому базовая реализация вызывает метод для установки нового имени темы для фона при помощи BackgroundLink.ChangeTheme (BackgroundLink - это сущность, связывающая ресурс фона с компонентом). procedure TfgControl.ThemeChanged(const AThemeName: TfgThemeName); begin TfgAssert.IsNotNil(BackgroundLink, 'BackgroundLink'); if TfgDebugAssetsOption.Themes in TfgLibraryDiagnostics.DebugAssetsOptions then TfgLog.Trace(ThemesTag, SThemesApplyingNewTheme, [ToString, AThemeName]); BackgroundLink.ChangeTheme(AThemeName); SendMessage<TfgThemeName>(TfgControlMessages.WM_THEME_CHANGED, AThemeName); end; Если в имени ресурса используется указание на использование темы (наличие ":", как разделитель между название темы и ресурса), то происходит автоматическая замена старой темы на новую. В противном случае, ничего не происходит. 3.4 Использование ресурсов темы После того, как мы научились делать свою тему и применять ее, теперь необходимо научиться настройке внешнего вида компонента на основании текущей темы. Компоненты FGX Native предлагают широкий набор свойств, отвечающих за изменение внешнего вида компонента. Например, TfgButton дает возможность поменять цвет фона, рамки, текста, перекрасить иконку и т.д. 3.4.1 Типы значений Большинство компонентов уже настроены для работы с ресурсами будущей темы. Это значит, что часть свойств компонента, отвечающие за связь с ресурсами цвета и настройку внешнего вида, уже могут быть по умолчанию связаны с темой. Чтобы это понять, достаточно посмотреть на свойство в инспекторе объектов: 1. Если в свойстве ничего не указано, то значит будет использовать соответствующий цвет из системной темы. Например: у кнопки по умолчанию не используется цвет из темы, поэтому ее внешний вид и цвет будет отличаться в Android и iOS. 2. Если в свойстве бледно серым цветом указано название ресурса, то это название ресурса из темы FGX Native, которое будет использоваться, если в приложении создана тема. Например, форма по умолчанию использует цвет "Background": На изображении выше видно, что по умолчанию форма использует белый цвет Background из светлой темы с зеленым основным цветом "Themes\Light\Green". 3. Если в свойстве значение указано бледно серым цветом и слева от названия вы видите рамку с красным крестиком, это значит, что либо в приложении нет темы FGX Native, либо в текущей теме нет ресурса с именем Background. 4. Если в свойстве название ресурса указано ярким цветом, то это значит, что цвет указан вручную и переопределяет цвет по умолчанию из темы, если он есть. 5. Начиная с 1.19.0.0. Цветовое свойство допускает указание кода цвета напрямую в качестве имени ресурса. 3.4.2 Приоритеты Большинство цветовых свойств компонентов FGX Native присутствует в двух вариантах: С постфиксом "Name": TintColorName, ColorName Без постфикса "Name": TintColor, Color Если вы видите такие парные свойства, значит они оба отвечают за настройку одной характеристики внешнего вида компонента. Приоритет у таких свойств следующий в порядке убывания и наличия: Указанное вручную название ресурса цвета. Указанное название ресурса цвета из темы по умолчанию. Значение цвета из свойства Color, TintColor и т.д. Значение цвета из системной темы (определяется каждым компонентов самостоятельно реализацией). Данное дублирование появилось с самого начала разработки FGX Native и было предназначено только для быстрого прототипирования компонентов в дизайнере и облегчения перехода разработчиков с VCL и FMX. Однако, использование цвета напрямую не было рекомендовано к использованию. Несмотря на это, главным и основным способом указания цвета остается использование цвета через имя ресурса. В будущих версиях мы планируем скрыть из дизайнера все свойства с прямым заданием кода цвета и перенесем эту возможность напрямую в свойство имени цвета (Как указано в конце раздела 3.4.1). 3.4.3 Применение ресурсов темы Для корректного отображения некоторых компонентов, которые могут иметь несколько вариантов отображения (например, кнопка), вам необходимо настроить внешний вид, используя ручное указание ресурсов темы. Например, мы используем в приложении заполненную (Contained) цветом кнопку с иконкой. Указываем цвета для иконки, текста и оттенок согласно системе цветов. И тогда при переключении темы с "Themes\Dark\Green" на "Themes\Light\Blue" внешний вид кнопки будет согласован с темами. При указании ресурса из темы важно (начиная с 1.19.0.0) использовать ":", как знак разделитель темы и ресурса темы. Соответственно, если у нас есть тема: "Themes\Light\Blue", а внутри цвет "Secondary\Color", то полное имя ресурса будет выглядит так "Themes\Light\Blue:Secondary\Color" При смене темы формы или приложения, все свойства, которые используют имена ресурсов с указанием темы с ":" будут автоматически обновлены на использование новой темы. 3.4.4 Фиксация ресурса цвета Возможны ситуации, когда необходимо использовать цвет из темы, но без автоматического обновления. Например, вы сделали несколько тем с разными акцентными цветами, и хотите их отобразить на форме. В таком случае, не нужно использовать ":", как разделитель ресурсов, а использовать "\". Тогда при смене темы такие значения не будут изменены. 3.5 Расширение темы Использование темы не ограничено лишь цветами. Вы можете добавлять в структуру темы ресурсы любого типа и использовать их. Например, вы можете использовать разные наборы иконок в темах. 4. Пример разработки приложения с поддержкой темной и светлой тем и разных цветовых оттенков. Рассмотрим применение тем на практике. В качестве площадки для практики возьмем любое приложение. Вы можете взять свое. Я же взял заготовку из демонстрационных проектов. В данном проекте нет никакого использования ресурсов, а так же нет никаких тем. Перед нами стоят следующие задачи: Добавить поддержку темной и светлой тем. Добавить возможность переключать темы вручную. Добавить возможность переключать темы автоматически согласно настройкам системной темы на устройстве. Добавить возможность менять акцентированный цвет. В примере рассмотрим два цвета: зеленый и синий. На практике как цвета, так и их количество может быть любым. 4.1 Создание тем в дизайнере ресурсов Добавление поддержки тем начинается с создания темы в дизайнере ресурсов. У нас должно быть два вида тем: Светлая Темная А так же два вида акцентированного (Primary) цвета для каждого вида тем: Зеленый Синий. В результате у нас должно получиться 4 темы. Для удобства организации тем в дизайнере ресурсов я решил использовать такую группировку: Первый уровень - Themes, сюда складываем все виды тем. Второй уровень - Dark/Light - группировка всех тем по виду. Третий уровень - Green/Blue акцентированный цвет. Открываем дизайнер ресурсов Project -> FGX Assets Manager. Создаем такую структуру. После чего пользуемся встроенным мастером создания темы и создаем две темы с одинаковыми акцентированными цветами для светлой и темной тем. В результате должно получиться вот так: 4.2 Настройки тем в проекте Наши FGX Native темы готовы, теперь сохраняем изменения и переходим к настройке тем в проекте. Для этого открываем настройки проекта Project -> FGX Options...-> Приложение -> Темы. Выбираем конфигурацию "All Configurations - All platforms", чтобы наши настройки тем применились для всех платформ и конфигураций. Пусть при старте у нас будет использоваться такая же тема, как и в системе. Для этого в "Используемая тема при старте" (2) выбираем "Согласно системной теме" В поле "название светлой темы" (3) указываем одну из двух наших светлых тем. Будем считать, что зеленый акцентированный цвет будет использоваться по умолчанию. Поэтому указываем соответствующую светлую тему: "Themes\Light\Green" Включаем поддержку темной темы в приложении (4). В поле "название темной темы" (5) указываем соответствующую темную тему: "Themes\Dark\Green" Теперь при старте нашего приложения, приложение автоматически получит тему с зеленым акцентированным цветом соответствующего типа. Запускаем и проверяем. При старте в системе установлена светлая тема, она же и применилась в приложении. Меняем системную тему на темную при помощи панели управления Android или iOS и приложение автоматически меняет ее на темную. Как вы можете видеть, компоненты уже адаптированы и заточены на использование тем FGX Native, поэтому в данном случае мы не выполняли никакой ручной настройки компонентов. Половина дела уже сделана. Добавлена поддержка двух тем с автоматической синхронизацией с системной темой. Теперь необходимо добавить возможность ручного управления темами и акцентированным цветом. 4.3 Программная смена тем и акцентированного цвета Чтобы пользователь мог менять тему в приложении по своему усмотрению, создадим такую панель управления, выдвигаемую снизу экрана. Для этого используем TfgRadioButton и TfgBottomSheetLayout. Чтобы пользователь видел акцентированный цвет, для нижней группы радио кнопок по отдельности указываем соответствующий акцентированный цвет из темных или светлых тем: Для синего цвета используем такое указание название цвета: "Themes\Light\Blue\Primary\Color". Важно: чтобы в качестве разделителя имени темы "Themes\Light\Blue" и ресурса "Primary\Color" использовался разделитель "\". В этом случае, при любой смене темы данное имя не будет изменяться. В противном случае, при смене темы цвет так же будет изменяться. Задаем группы (TfgRadioButton.GroupName ) "ThemeKind" и "AccentColor" для трех верхних и двух нижних групп радиокнопок соответственно. Тип используемой темы задается при помощи перечисляемого типа "TfgThemeKind = (SystemDefault, Light, Dark);". Чтобы нам было удобнее, задаем трем верхним радио кнопкам соответствующие значениям TfgThemeKind целочисленные значения от 0 до 2 в свойстве Tag. Теперь при выборе типа темы, нам нужно отразить это изменение в приложении. Для этого выбираем три верхних TfgRadioButton и пишем такой обработчик OnChanged.ChangeTheme: procedure TFormMain.ChangeTheme(Sender: TObject); var RadioButton: TfgRadioButton; begin TfgAssert.IsClass(Sender, TfgRadioButton); RadioButton := TfgRadioButton(Sender); Application.ThemeSettings.ThemeKind := TfgThemeKind(RadioButton.Tag); // Свойство Tag содержит целочисленное значение TfgThemeKind end; Проверяем, Sender действительно ли является TfgRadioButton. Затем извлекаем целочисленное значение TfgThemeKind и устанавливаем его в настройки приложения Application.ThemeSettings.ThemeKind. Для того, чтобы поменять акцентированный цвет, нам нужно поменять название светлой и темной тем в Application.ThemeSettings. Для этого пишем такой обработчик для двух нижних радиокнопок: procedure TFormMain.ChangeAccentColor(Sender: TObject); var RadioButton: TfgRadioButton; AccentColorName: TfgThemeName; begin TfgAssert.IsClass(Sender, TfgRadioButton); RadioButton := TfgRadioButton(Sender); AccentColorName := RadioButton.Text; Application.ThemeSettings.LightThemeName := 'Themes\Light\' + AccentColorName; Application.ThemeSettings.DarkThemeName := 'Themes\Dark\' + AccentColorName; end; Берем название акцентированного цвета напрямую из названия TfgRadioButton. И формируем новое название тем. Проверяем. Запускаем наше приложение. video_2025-03-28_04-12-07.mp4 Вот таким незамысловатым способом можно легко добавить поддержку тем в 1.19.0.0. 5. Советы При проектировании интерфейса всегда учитывайте, что у вас должна быть поддержка светлой и темной тем. Лучше сразу добавить в самом начале две базовые темы: светлая и темная с одним из основных цветов. При настройке внешнего вида компонентов, используйте ресурсы из темы, где это необходимо. Это сильно упростит вам дальнейшую настройку внешнего вида приложения и добавление поддержки новых тем. Вы всегда можете проверить корректность внешнего вида приложения в дизайнере, вручную указав название темы в форме, либо воспользовавшись переключателем вида темы в дизайнере форм. Не используйте зашитые коды цветов прямо в компонентах (свойства Color, TintColor и т.д.), иначе при смене темы, эти цвета останутся без адаптации. При любом использовании цветов, выносите его в ресурсы. Если вы понимаете, что данный цвет может зависеть от темы, то смело включайте его в состав тем.
  6. This is a false positive of Microsoft Defender. You should to add this file to the Defender exception rules.
  7. The separated build of 12.3 is available in 1.18.11.0. The trial will be available later.
  8. Download: The distributive is available by request only. Release date: 18 March 2025 Warning 🚨 The Delphi 12.3 (Update 3) breaks backward compatibility for design-time packages, so FGX Native design time packages cannot be loaded. This release adds separate version of built design time packages for 12.3. if you are using 12.3, you should choose designer version for 12.3 in FGX Native installer. Improvements 🙌 TfgPermissionService The new method TfgPermissionService.IsSupported was added. It allows determinate availability of permission service on current platform. Bug Fixes 🐛 The demo sample was fixed "Services" -> "Push-notifications". It could crash on startup on old iOS versions.
  9. Скачать: Релиз доступен по запросу. Дата релиза: 18 марта 2025 Внимание 🚨 В Delphi 12.3 (Update 3) сломана обратная совместимость пакетов из-за чего FGX Native пакеты не могут быть загружены. В этом релизе добавлена отдельная сборка пакетов дизайнера для 12.3. Если вы используете 12.3, то вам при установке необходимо выбрать версию дизайнера для 12.3. Улучшения 🙌 TfgPermissionService Добавлен новый метод TfgPermissionService.IsSupported, который проверяет доступность сервиса на текущей платформе. Исправление ошибок 🐛 Исправлен демонстрационный проект "Сервисы" -> "Push-уведомления". Он мог падать на старых iOS версиях.
  10. Hello, I will check. Any binary versions must be compatible within a single major version of delphi. So on 12.3, the library should work in the same way as on 12.2, and so on. However, if you see a problem, I'll check it myself. Maybe Embarcadero broke backward compatibility in 12.3
  11. Download: The distributive is available by request only. Release date: 14 March 2025 New ✨ TfgCollectionView New events have been added to track the entire dragging process of the item. Exactly: OnDragBegin(Sender: TObject; const AInitialIndex: Integer) - the user has started the process of dragging an item with the index AInitialIndex. OnDragEnd(Sender: TObject; const AInitialIndex: Integer) - the user has finished dragging the item with the initial index AInitialindex. It is called when the finger is lifted from the screen. OnDropItem(Sender: TObject; const AFromIndex, AToIndex: Integer) - the user dropped the dragging of the element with the initial index AInitialindex to the position AToIndex. Bug Fixes 🐛 The demo sample was fixed: "Components" -> "TfgCollectionView" -> "Items ordering". When dragging an element, the elements could receive incorrect titles. FGX-426 TfgCollectionView + Selection + Index. FGX-428 Problems with TfgSwitch (iOS). FGX-429 The TfgSwitch.Appearance settings wasn't serialized.
  12. Скачать: Релиз доступен по запросу. Дата релиза: 14 марта 2025 Новое ✨ TfgCollectionView Добавлены новые события для отслеживания всего процесса перетаскивания элемента. А именно: OnDragBegin(Sender: TObject; const AInitialIndex: Integer) - пользователь начал процесс перетаскивания элемента с индексом AInitialIndex. OnDragEnd(Sender: TObject; const AInitialIndex: Integer) - пользователь закончил процесс перетаскивания элемента с первоначальным индексом AInitialIndex. Вызывается в момент отрыва пальца от экрана. OnDropItem(Sender: TObject; const AFromIndex, AToIndex: Integer) - пользователь бросил перетаскивание элемента с первоначальным индексом AInitialIndex в позицию AToIndex. Исправление ошибок 🐛 Иcправлен демонстрационный проект: "Компоненты" -> "TfgCollectionView" -> "Перемещение элементов между собой". При перетаскивании элемента элементы могли получать неверные заголовки. FGX-426 TfgCollectionView + Selection + Index. FGX-428 Проблемы с TfgSwitch (iOS). FGX-429 Настройки TfgSwitch.Appearance не сериaлизуются в ресурсы формы.
  13. Download: The distributive is available by request only. Release date: 12 March 2025 Warning 🚨 The unused unit FGX.Calendar.Types was removed in this release. If you are using it, please, remove it from uses section. New ✨ TfgAppMetricaAnalytics The new component TfgAppMetricaAnalytics for collect application statistics was added. It uses Yandex AppMetrica service. Description. Improvements 🙌 TfgSwitch The new settings TfgSwitch.Appearance were added for adjust TfgSwitch appearance. Now you can change tint color of different switch parts. The same appearance of TfgSwitch in Active (IsCheked=True) and non active (IsChecked=False) states. Firebase Push-notifications Now, if the vector icon is not specified for FireBase Push Notification icon, the raster version is used. Bug Fixes 🐛 The rendering of TfgImage was fixed, if assets keep only bitmap for 1x scale. The previously control decrease rendering bitmap size for HiDPI screens (Android). The rendering of text on TfgButton in tio icon align was improved (iOS). In some cases title could cropped. An empty element was added to the info.plist file for custom fonts, which could result in the app being rejected for moderation for publication in the store (iOS). FGX-420 Assets manager does not save images. FGX-424 Button with absolute position. FGX-424 TfgImage(Tile) strange line. FGX-425 Application.OpenURL in iOS Devices (iOS).
  14. Скачать: Релиз доступен по запросу. Дата релиза: 12 марта 2025 Внимание 🚨 В этом релизе удален не используемый модуль FGX.Calendar.Types. Если при сборке проекта компилятор не может найти этот модуль, необходимо исключить его из секции использований ваших модулей. Новое ✨ TfgAppMetricaAnalytics Добавлен новый компонент для сбора статистики использования вашего приложения в сервисе Yandex AppMetrica. Описание. Улучшения 🙌 TfgSwitch Добавлены новые настройки внешнего отображения компонента TfgSwitch.Appearance. Теперь можно менять оттенок ползунка и заднего фона для разных состояний. Одинаковый вид TfgSwitch в активном (IsCheked=True) и неактивном (IsChecked=False) состоянии. Firebase Push-уведомления Теперь, если не указана векторная версия иконки уведомления, будет использовать растровая. Исправление ошибок 🐛 Исправлено отображение изображения в TfgImage, если в ассете хранится изображения только для 1х скейла. Раньше в таком случае изображение выводилось слишком маленьким (Android). Исправлено отображение текста на кнопке TfgButton (iOS). В определенных случаях с отображением иконки сверху, текст мог обрезаться. В файл info.plist добавлялся пустой элемент для кастомных шрифтов, чтобы могло приводить к отказу при модерации приложения для публикации в магазин (iOS). FGX-420 Assets manager не сохраняет изображения. FGX-424 Кнопка с позицией Absolute. FGX-424 TfgImage(Tile) Странная полоса. FGX-425 Application.OpenURL in iOS Devices (iOS).
  15. Changed Status to Open
  16. Hello, The issue in your project is not the same as described in changelog. You didn't update styles.xml file correctly. Please, compare correct styles.xml file with your version and update it, if its required: Pay attention on tag <item name="windowActionBar">false</item> and <item name="windowNoTitle">true</item> <?xml version="1.0" encoding="utf-8"?> <resources xmlns:android="http://schemas.android.com/apk/res/android"> <!-- Basic theme for all Android versions --> <style name="BaseAppTheme" parent="Theme.AppCompat.Light"> <!-- Hiding toolbar --> <item name="android:windowContentOverlay">@null</item> <item name="windowActionBar">false</item> <item name="windowNoTitle">true</item> <!-- Splash screen image, which is displayed on cold application startup before first rednering form. --> <item name="android:windowBackground">@drawable/launch_screen</item> <!-- We make the system status bar transparent so that when loading the status bar overlaps on a splash screen with a transparency effect --> <item name="android:windowTranslucentStatus">true</item> <!-- By default, Android does not use reels to select the date and time. However, we have TfgDatePicker/TfgTimePicker components that should work like drums. --> <item name="android:datePickerStyle">@style/SpinnerDatePicker</item> <item name="android:timePickerStyle">@style/SpinnerTimePicker</item> </style> <style name="AppTheme" parent="BaseAppTheme"> </style> <!-- TfgDatePicker style for displaying component like a wheel --> <style name="SpinnerDatePicker" parent="android:Widget.Material.DatePicker"> <item name="android:datePickerMode">spinner</item> </style> <!-- TfgTimePicker style for displaying component like a wheel --> <style name="SpinnerTimePicker" parent="android:Widget.Material.TimePicker"> <item name="android:timePickerMode">spinner</item> </style> <!-- TfgCollectionView style, which is necessary for the native view to have the ability to display scrollbars. Even though in the end there can be only one scrollbar, it is necessary to specify two types here. --> <style name="CollectionView" parent="android:Widget"> <item name="android:scrollbars">vertical|horizontal</item> </style> <!-- TfgVerticalScrollBar style, which is necessary for the native view to have the ability to display scrollbars. --> <style name="VerticalScrollBox"> <item name="android:scrollbars">vertical</item> </style> </resources> Thank you
  17. Добрый вечер, Библиотека - это не только визуальные компоненты, но и набор кросс платформенных сервисов для взаимодействия с операционными системами. Ну и, конечно, FGX Native активно использует именно нативное Android/iOS API для реализации. Поэтому ответ на ваш вопрос - да. Вы можете использовать нативные процедуры и функции. Более того, мы даем доступ к нативным представлениям на уровне кроссплатформенного контрола. Другими словами, вы можете при необходимости работать с нативным представлением напрямую. Так же советую почитать в нашем блоге про интеграцию сторонних Андроид Java/Kotlin библиотек. Для Android API мы используем свою реализацию моста, она немного отличается от той, что предлагает Embarcadero. Но вы так же можете использовать и мост от Embarcadero, они могут использовать одновременно. Для IOS API мы используем мост от RTL. Хотелось бы более развернутого пояснения для понимания.
  18. Добрый вечер, Если вас интересует, сколько пользователей используют ваше приложение, как часто, как именно и т.д., то вы можете использовать аналитику приложения от Firebase Google Analytics. Эта возможность была добавлена в 1.18.5.0. Начиная с версии 1.18.9.0, мы добавили поддержку сбора аналитик так же и от сервиса Yandex AppMetrica. Ранее мы выкладывали инструкции, как это можно сделать самостоятельно, отдельно настраивать приложение, отдельно использовать разное API для отправки метрик. Однако, мы полностью интегрировали эту поддержку и теперь ей так же легко воспользоваться, как и Firebase Google Analytics. Но, обо всем по порядку. Регистрация приложения в Yandex AppMetrica 1. Регистрируемся на сервисе, если не сделали этого ранее: https://appmetrica.yandex.ru/ 1. Создаем новый проект в учетной записи AppMetrica и даем ему название: Затем далее. По окончании добавления сервис отобразит ваш API ключ, который нужно запомнить. Именно он будет использоваться для взаимодействия вашего приложения и сервиса Yandex AppMetriсa. Теперь переходим к настройкам вашего проекта, путем перехода в пункт меню Settings -> Main (Настройки -> Главные) в левой панели. Если нам необходимо связать наш проект с 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 приложении Чтобы подключить Yandex AppMetrica в приложении, достаточно настроить подключение в настройках проекта и бросить новый компонент TfgAppMetricaAnalytics на главную форму или дата модуль, который создается при старте приложения. 1. Переходим в настройки приложения Project -> FGX Options... -> Services (Сервисы) -> Yandex AppMetrica Для всех требуемых конфигураций Android 32-bits / Android 64-bits / iOS Device 64-bit включаем поддержку сервиса (Enabled - 1) и указываем API ключ (2). Опционально можно поменять значение длительности сессии. По умолчанию AppMetrica использует значение 10 секунд. Если в течении этого времени пользователь ничего не будет делать в приложении, то это будет означать, что при новом взаимодействии пользователя с приложением, это будет считаться как новая сессия взаимодействия пользователя. 2. Бросаем на главную форму или дата модуль, который создается при запуске приложения, новый компонент TfgAppMetricaAnalytics. Через него же можно будет отправлять пользовательские события. После чего все готово и можно запускать приложение. Как посмотреть статистику Чтобы посмотреть аналитику, нужно перейти в личный кабинет Yandex AppMetrica: https://appmetrica.yandex.ru/overview и уже на главной странице можно будет увидеть информацию о количестве установок вашего приложения, аудитории, падениях приложения и т.д. Важно: первые отчеты в AppMetrica появляются с небольшой задержкой, а не в режиме реального времени. Если приложение запустилось без видимых ошибок, то подождите пару минут появления метрик на портале https://appmetrica.yandex.ru/application В разделе Technologies/Технологии будут доступны интересные технические отчеты о версиях SDK, приложениях, размерах экранов, типах устройств и многое другое. Отслеживание экранов приложения и отправка пользовательских метрик В интеграции сервиса у нас встроены две дополнительные возможности: 1. Это отслеживания открытых форм/экранов вашего приложения. Если вы хотите узнать, с какими экранами чаще всего взаимодействуют ваши пользователи, вы можете воспользоваться методом компонента SetCurrentScreen. Данный метод отправляет на сервер информацию о названии формы/экрана и ее классе. Типичный пример отслеживания открытия формы, может выглядеть так: procedure TFormMain.fgFormShow(Sender: TObject); begin fgAppMetricaAnalytics1.SetCurrentScreen(Name, ClassName); end; После запуска приложения, в личном кабинете AppMetrica на вкладке Reports / Отчеты -> Events / События можно наблюдать названия открытых экранов: 2. Для отправки своего события на сервер, можно воспользоваться методом LogEvent. Доступно две версии этого метода: простой и с параметрами: /// <summary> /// Отправляет на сервер AppMetrica событие с именем <c>AName</c>, параметрами c именами <c>AKeys</c> и значениями /// <c>AValues</c>. /// </summary> procedure LogEvent(const AName: string; const AKeys: TArray<string>; const AValues: array of const); overload; /// <summary>Отправляет на сервер AppMetrica событие с именем <c>AName</c>.</summary> procedure LogEvent(const AName: string); overload; Например, если мы хотим зафиксировать, что пользователь в приложении покупок нажимал на кнопку "положить товар в корзину", то отправка этого события может выглядеть так: LogEvent('Положили в корзину', ['product_id', 'product_name', price], [1423, 'Sony PlayStation 5', 60000]); Решение возможных проблем Приложение падает на старте Если приложение при запуске падает, то скорее всего, вы: либо не указали API ключ или же указали некорректный ключ либо не включили сервис в настройках проекта Еще раз проверьте, что все пункты выше выполнены. Так же, при таком падении, можно узнать причину падения в логе устройства, что на iOS, что и на Android. Приложение падает на старте и вы используете компоненты FireDAC. (спасибо @Roman) Заключение Подключение данного сервиса выполняется довольно просто и быстро в FGX Native, но при этом открывает для вас большой набор полезной статистики, которую вы можете предложить, как вашим клиентам, так и использовать ее для совершенствования ваших личных приложений.
  19. Добрый день, Для 11.3 нужно использовать такой же номер версии, как и для 11.0 - 280 iOS Simulator ARM 64-bit Library Path: $(BDSLIB)\$(PLATFORM)\Release;$(BDSCOMMONDIR)\Dcp\$(PLATFORM);$(FGX)\Libs\290\iOSSimARM64\Release;$(FGX)\Libs\Common\iOSSimARM64\Debug Browsing Path: $(BDS)\source\rtl\common;$(BDS)\SOURCE\RTL\SYS;$(BDS)\source\rtl\ios;$(BDS)\source\rtl\osx;$(BDS)\source\ToolsAPI;$(BDS)\SOURCE\IBX;$(BDS)\source\Internet;$(BDS)\SOURCE\PROPERTY EDITORS;$(BDS)\source\soap;$(BDS)\SOURCE\XML;$(BDS)\source\Indy10\Core;$(BDS)\source\Indy10\System;$(BDS)\source\Indy10\Protocols;$(BDS)\source\fmx;$(BDS)\source\databinding\components;$(BDS)\source\databinding\engine;$(BDS)\source\databinding\graph;$(BDS)\source\data;$(BDS)\source\data\cloud;$(BDS)\source\data\datasnap;$(BDS)\source\data\dbx;$(BDS)\source\data\dsnap;$(BDS)\source\rtl\posix;$(BDS)\source\rtl\posix\osx;$(BDS)\source\data\datasnap\connectors;$(BDS)\source\data\datasnap\proxygen;$(BDS)\source\DataExplorer;$(BDS)\source\DUnit\Contrib\DUnitWizard\Source\Common;$(BDS)\source\DUnit\Contrib\DUnitWizard\Source\Common\dunit;$(BDS)\source\DUnit\Contrib\DUnitWizard\Source\DelphiExperts\Common;$(BDS)\source\DUnit\Contrib\DUnitWizard\Source\DelphiExperts\DUnitProject;$(BDS)\source\DUnit\Contrib\DUnitWizard\Source\DelphiExperts\DUnitProject\dunit;$(BDS)\source\DUnit\src;$(BDS)\source\DUnit\tests;$(BDS)\source\Experts;$(BDS)\source\indy\abstraction;$(BDS)\source\indy\implementation;$(BDS)\source\indyimpl;$(BDS)\source\Property Editors\Indy10;$(BDS)\source\soap\wsdlimporter;$(BDS)\source\Visualizers;$(BDS)\source\DUnit\Contrib\XMLReporting;$(BDS)\source\DUnit\Contrib\XPGen;$(BDS)\source\data\rest;$(BDS)\source\data\firedac;$(BDS)\source\tethering;$(BDS)\source\DUnitX;$(BDS)\source\data\ems;$(BDS)\source\rtl\net;$(BDS)\source\FlatBox2D;$(BDSCOMMONDIR)\Dcp\$(PLATFORM);$(FGX)\Sources Debug DCU Path: $(BDSLIB)\$(PLATFORM)\debug;$(FGX)\Libs\290\iOSSimARM64\Debug iOS Device 64-bit Library Path: $(BDSLIB)\$(PLATFORM)\Release;$(BDSCOMMONDIR)\Dcp\$(PLATFORM);$(FGX)\Libs\290\iOSDevice64\Release;$(FGX)\Libs\Common\iOSDevice64\Debug Browsing Path: $(BDS)\source\rtl\common;$(BDS)\SOURCE\RTL\SYS;$(BDS)\source\rtl\ios;$(BDS)\source\rtl\osx;$(BDS)\source\ToolsAPI;$(BDS)\SOURCE\IBX;$(BDS)\source\Internet;$(BDS)\SOURCE\PROPERTY EDITORS;$(BDS)\source\soap;$(BDS)\SOURCE\XML;$(BDS)\source\Indy10\Core;$(BDS)\source\Indy10\System;$(BDS)\source\Indy10\Protocols;$(BDS)\source\fmx;$(BDS)\source\databinding\components;$(BDS)\source\databinding\engine;$(BDS)\source\databinding\graph;$(BDS)\source\data;$(BDS)\source\data\cloud;$(BDS)\source\data\datasnap;$(BDS)\source\data\dbx;$(BDS)\source\data\dsnap;$(BDS)\source\rtl\posix;$(BDS)\source\rtl\posix\osx;$(BDS)\source\data\datasnap\connectors;$(BDS)\source\data\datasnap\proxygen;$(BDS)\source\DataExplorer;$(BDS)\source\DUnit\Contrib\DUnitWizard\Source\Common;$(BDS)\source\DUnit\Contrib\DUnitWizard\Source\Common\dunit;$(BDS)\source\DUnit\Contrib\DUnitWizard\Source\DelphiExperts\Common;$(BDS)\source\DUnit\Contrib\DUnitWizard\Source\DelphiExperts\DUnitProject;$(BDS)\source\DUnit\Contrib\DUnitWizard\Source\DelphiExperts\DUnitProject\dunit;$(BDS)\source\DUnit\src;$(BDS)\source\DUnit\tests;$(BDS)\source\Experts;$(BDS)\source\indy\abstraction;$(BDS)\source\indy\implementation;$(BDS)\source\indyimpl;$(BDS)\source\Property Editors\Indy10;$(BDS)\source\soap\wsdlimporter;$(BDS)\source\Visualizers;$(BDS)\source\DUnit\Contrib\XMLReporting;$(BDS)\source\DUnit\Contrib\XPGen;$(BDS)\source\data\rest;$(BDS)\source\data\firedac;$(BDS)\source\tethering;$(BDS)\source\DUnitX;$(BDS)\source\data\ems;$(BDS)\source\rtl\net;$(BDS)\source\FlatBox2D;$(BDSCOMMONDIR)\Dcp\$(PLATFORM);$(FGX)\Sources Debug DCU Path: $(BDSLIB)\$(PLATFORM)\debug;$(FGX)\Libs\290\iOSDevice64\Debug
  20. Hello, Considering that this is an unfinished project and it was developed purely for the webinar and my own needs, I just posted it as-is Thank you
  21. Добрый вечер, Последняя триал версия поддерживается только на IDE версий 11.* и 12.* Установите любую поддерживаемую версию, например RAD Studio Community Eidtion. Спасибо
  22. Download: The distributive is available by request only. Release date: 28 December 2024 Bug Fixes 🐛 The application with TfgNavigationBar could crashed on startup (Android).
  23. Скачать: Релиз доступен по запросу. Дата релиза: 28 декабря 2024 Исправление ошибок 🐛 Исправлена регрессия при использовании TfgNavigationBar, которая могла приводить к падению приложения на старте (Android).
  24. Download: The distributive is available by request only. Release date: 27 December 2024 Warning 🚨 To build Android apps on this version, you have to use the Android SDK 35+ versions. Improvements 🙌 Biometric Authentication Added new service for biometric authentication (fingerprint, face, iris). A non-visual component can be used for authentication TfgBiometricAuthentication. It is also possible to use the service directly: TfgBiometricAuthenticationFactory.CreateBiometricAuthentication .SetFallbackAsPasscode; .SetSubtitle('Subtitle') .SetDescription('Description') .Execute(BiometricAuthenticationResul, 'Title'); New demo example "Services" -> "Authentication" -> "Biometric Authentication". Gradle We updated supported Gradle version to 8.9. Now you can now use the JDK up to and including version 23. FGX Android Log Viewer Now FGX Android Log Viewer can work with devices via Wi-Fi. FGX-204 Android logs viewer and Wi-Fi debug. Project settings For components that require special project settings, the ability to go to project settings using a double click and context menu has been added (TfgMap, TfgPushNotificationService, TfgInAppPurchase, TfgFirebaseAnalytics, TfgGooglePayClient, TfgGoogleAdMobProvider, TfgYandexMobileAdsProvider, TfgFacebookLoginAuthenticationClient, TfgVKLoginAuthenticationClient). Android libraries Added the ability to edit a previously added library dependency Android. Other Some user's font files didn't work on iOS. We improved supporting it. Improved key event dispatching in the Android for nested forms if the form is created and displayed from the TfgForm.OnShow handler (Android).

Account

Navigation

Search

Search

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.