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. Скачать: RAD Studio 12.* - 13.0 setup_1.20.0.0_release.rus.zip Дата релиза: 15 сентября 2026 Внимание 🚨При первой сборке FGX Native приложения под Android будет скачен и установлен дистрибутив Gradle 9.6.1 со всеми вспомогательными плагинами и библиотеками, необходимыми для сборки приложений. Для этого требуется доступ к сети Интернет и время. Последующие сборки будут выполняться быстро. Из шаблона манифеста Андроид приложения был удален атрибут android:extractNativeLibs. Теперь он проставляется системой сборки автоматически. Если вы используете анимацию отображения или скрытия форм через TfgAnimationHelper, то вам необходимо убрать этот код. Теперь форма автоматически использует анимацию. Для анимации отображения модального окна нужно использовать новый метод TfgForm.ShowModal. Новое✨ФормыВ этом релизе доработаны механизмы анимации, отображения, скрытия и управления временем жизни форм. АнимацияТеперь все формы по умолчанию используют анимацию своего отображения и скрытия. В результате чего теперь не нужно прибегать к использованию вспомогательного класса анимации TfgAnimationHelper. На примере открытия формы. Было: { Обычная форма} // Открытие TfgAnimationHelper.ShowForm(Form); // Закрытие с удалением TfgAnimationHelper.HideForm(Self, [TfgAnimationOption.ReleaseControlOnFinish]); { Модальная форма } // Открытие TfgAnimationHelper.ShowModalForm(Form); // Закрытие с удалением TfgAnimationHelper.HideModalForm(Self, [TfgAnimationOption.ReleaseControlOnFinish]);Стало: { Обычная форма} // Открытие Form.Show; // Закрытие с удалением Form.Close; { Модальная форма } // Открытие Form.ShowModal; // Закрытие Form.Close;Старый метод TfgCustomForm.Show дополнен необязательным параметром APresentationStyle, позволяющим выбирать типа анимации отображения формы. На текущий момент доступно всего два варианта: TfgFormPresentationStyle.Default - с анимацией по умолчанию (как это принято на текущей платформе). TfgFormPresentationStyle.None - Не применять анимацию и отобразить форму немедленно. Поэтому если вы не хотите применять анимацию, то вам необходимо передать необязательный параметр TfgFormPresentationStyle.None в метод Show. Помимо этого метода добавлен метод для модального отображения формы ShowModal. Методы Hide и Close при скрытии/закрытии формы используют обратную анимацию, используемую при ее открытии. /// <summary> /// Отобразить форму на экране, применяя переданный стиль <c>APresentationStyle</c> анимации отображения. /// </summary> procedure Show(const APresentationStyle: TfgFormPresentationStyle = TfgFormPresentationStyle.Default); /// <summary> /// Отобразить форму модально на экране, применяя переданный стиль <c>APresentationStyle</c> анимации отображения. /// </summary> procedure ShowModal(const APresentationStyle: TfgModalFormPresentationStyle = TfgModalFormPresentationStyle.Default); /// <summary>Скрыть форму с экрана.</summary> /// <remarks>При скрытии используется обратная анимация к той, что применялась при отображении формы.</remarks> procedure Hide; overload; /// <summary>Скрыть форму с экрана без анимации.</summary> procedure HideWithoutAnimation; /// <summary>Скрыть форму с экрана с возможностью её саморазрушения инстанса.</summary> /// <remarks>На решение о действии с формой можно повлиять с помощью свойства <c>DefaultCloseAction</c> и/или события <c>OnClose</c>.</remarks> procedure Close; /// <summary>Отображается ли форма на экране.</summary> /// <remarks> /// Не учитывает ее оптическую видимость с учетом возможно перекрытия другими формами, а фиксирует факт, что она /// находится где-то на экране и ее представление встроено в сцену. /// </remarks> function IsShown: Boolean;Управление и ЗакрытиеНе смотря на то, что механизм закрытия форм уже введен давно, стоит отдельно упомянуть в свете добавления анимации о том, как корректно управлять временем жизни формы. Закрытие и скрытие формы нужно производить при помощи метода Close. При этом форма спрашивает у разработчика, что делать с формой через параметр `AAction` события OnClose. Доступны следующие варианты: TfgFormCloseAction.None - Запрос закрытия формы игнорируется. Например, если пользователь пытается закрыть форму, чтобы сохранить изменение, а заполненные данные не корректны, вы можете отменить закрытие и указать пользователю на проблему. TfgFormCloseAction.Hide - Форма скрывается, но экземпляр формы не удаляется и она может быть использована повторно. TfgFormCloseAction.Free - Форма скрывается и экземпляр формы удаляется после ее полного скрытия. Если вы заранее знаете, что форму нужно уничтожать при закрытии, вы можете указать это через свойство TfgForm.DefaultCloseAction. В этом случае, это будет значение по умолчанию, которое будет передаваться в событие OnClose, если оно определено. Этот механизм существует уже давно, однако, из-за того, что раньше закрытие формы с анимацией выполнялось через хелпер TfgAnimationHelper, не возможно было им воспользоваться так как удаление формы нужно производить только после того, как закончиться анимация. Теперь же, когда анимация является частью формы, этот механзим полностью с ней синхронизирован. Модальные формыВ этом релизе для форм добавлен асинхронный режим модальности. Чтобы отобразить форму в модальном режиме, необходимо воспользоваться новыми методами: procedure ShowModal(const APresentationStyle: TfgModalFormPresentationStyle = TfgModalFormPresentationStyle.Default); overload; procedure ShowModal(const ACloseCallback: TfgCloseModalCallback; const APresentationStyle: TfgModalFormPresentationStyle = TfgModalFormPresentationStyle.Default); overload;Форма будет отображена на экране с анимацией (по умолчанию), а результат отображения формы TModalResult будет передан в функцию обратного вызова ACloseCallback. Пример использования: MyForm.ShowModal( procedure (const AModalResult: TModalResult) begin case AModalResult of mrCancel: TfgToastFactory.Show('Cancel was pressed'); mrOk: TfgToastFactory.Show('OK was pressed'); end; end);Возвращаемое значение модального результата задается через новой свойство формы TfgForm.ModalResult. Помимо этого, теперь у кнопки TfgButton появилось публичное свойство ModalResult. При нажатии на кнопку, это значение автоматически задается в TfgForm.ModalResult. Кнопка vkHardwareBack на Android 16+Начиная с приложений, разработанных для Android 16+, Google отключила работу кнопки vkHarwareBack. Это значит, что в ваших приложениях, обработка этой кнопки не работала. Мы сэмулировали вызов нажатия этой кнопки, как было ранее. GradleОбновлена система сборки Gradle для Android приложений с версии 8.13 до 9.6.1. Внимание: При первой сборке FGX Native приложения под Android будет скачен и установлен дистрибутив Gradle 9.6.1 со всеми вспомогательными плагинами и библиотеками, необходимыми для сборки приложений. Для этого требуется доступ к сети Интернет и время. Последующие сборки будут выполняться быстро. Обновление Android библиотекВ этом релизе обновлены следующие используемые Android библиотеки до последних версий и используемые их сервисы FGX Native: Google PDF 1.0.0-10 -> 1.0.0-19 AndroidX 1.9.0 -> 1.15.0 Lottie 5.2.0 -> 6.7.1 Visio 18.1.0 -> 18.3.1 Google Maps 18.1.0 -> 20.0.0 Firebase Common 20.1.2 -> 22.0.1 Firebase Messaging 23.0.8 -> 25.1.1 Firebase Analytics 21.2.0 -> 23.2.0 Admob 21.2.0 -> 25.4.0 Facebook Login 16.2.0 -> 18.3.0 Yandex Analytics 7.5.0 -> 8.5.1 Yandex Mobile Ads 6.4.0 -> 8.3.0 Android Billing 7.0.0 -> 9.1.0 Помимо этого обновлены все заголовочные файлы Android.Api.* до последних версий библиотек. TfgCollectionViewВ 1.19.6.0 был изменен подход к расчету размера элементов списка. В результате которого, событие OnBindItem может вызываться для одного и того же элемента несколько раз. В одном случае для расчета размера элемента, в другом для его отображения. В iOS при первом отображении идет запрос размеров всех элементов. И если список предполагает отображение изображений, загружаемых асинхронно, это приводит к проблеме массовой загрузки всех изображений сразу. В результате чего, может как кончится оперативная память, отводимая под приложение, так и замедлиться все приложение в целом. Теперь же вы можете определить назначение связывания данных (вызов OnBindItem) с элементам при помощи нового свойства TfgItemWrapper.Purpose и пропустить загрузку или связывание изображений с компонентами элемента тем самым, ускорив расчет размеров элементов. /// <summary> /// <para> /// Назначение элемента в списке /// </para> /// <para> /// <list> /// <item><b>Measure</b> - Элемент используется для расчета своего размера.</item> /// <item><b>Display</b> - Элемент используется для отображения на экране.</item> /// </list> /// </para> /// </summary> TfgItemWrapperPurpose = (Measure, Display); TfgItemWrapperPurposes = set of TfgItemWrapperPurpose;Совет: Если вы используете списки с элементами с динамической высотой и отображаете изображения, то для TfgItemWrapperPurpose.Measure необходимо пропустить загрузку и отображение этих изображений в целях ускорения работы списка. Улучшения 🙌Java2DelphiУлучшена работа вспомогательной утилиты для генерации заголовочных файлов для Java/Kotlin библиотек: Если при импорте встречались два одноименных Java класса, встречающиеся в разных пакетах, то они могли неверно использоваться в качестве родительского класса. Раньше генератор не учитывал регистр имен классов, в результате чего некорректно могли обрабатываться классы package.MyClass и package.myClass. Поправлена генерация сеттеров для статических полей джава классов. Название Java метода inline является ключевым слово и обрабатывается отдельно. TfgComboBoxДобавлена возможность указать ширину выпадающего окна для TfgComboBox. Свойство имеет смысл только под Android. FGX-511 Как вычислить ширину выпадающего списка? Исправление ошибок 🐛Для TfgLabel не применялся пользовательский шрифт и горизонтальное выравнивание режиме TfgTextType.HTML. FGX-245 TfgPickerPhotoFactory не возможно выбрать фото из галереи (Android). FGX-463 TfgSwitch. При динамическом создании некорректно работает свойство TintColorName (Android). FGX-512 Yandex SDK давно не обновлялся (Android). FGX-513 Сильная просадка производительности на iOS при задействовании TfgCollectionViewStyle.VariableSize (iOS). FGX-514 Некорректное значение AVKFrame.Height на Android 15+ (Android).
  2. В сентябре. Сейчас работаем над добавлением жеста возврата к предыдущей форме и настроек иконок приложения для Андроида. Как закончим эти работы, можно будет делать релиз.
  3. Changed Status to Fixed Changed Resolution to Fixed Changed Fix version to 1.19.10.0
  4. Добрый вечер, Данную проблему устранили в будущей версии. Временно, нужно представить цвет в виде ARGB, а не RGB. Для локального исправления, нужно добавить FF к коду цвета в начало. #FFE91E63 Для справки. В 1.19.6.0 мы написали свой кроссплатформенный парсер HTML, чтобы везде (включая дизайнер) рендерился HTML текст и исправить проблему с псевдоасинхронным нативном разбором HTML в TfgCollectionView.
  5. В коде переключение типа содержимого управляется таким кодом: procedure TFormMain.fgRadioButton1Changed(Sender: TObject); begin SystemStatusBar.ContentStyle:=TfgSystemStatusBarContentStyle((Sender AS TfgRadioButton).Tag); end;Значение берется у кнопок из свойства Tag. В то же время тип: TfgSystemStatusBarContentStyle = (Auto, Light, Dark);Auto = 0 Light = 1 Dark = 2 А у радио кнопки темного оттенка - 1, а у светлого - 2.
  6. Changed Status to Fixed Changed Resolution to Test case error
  7. Changed Status to Fixed Changed Resolution to Fixed Changed Fix version to 1.19.6.0
  8. Телефон Samsung A26 (Android 16). Включен режим управления жестами, о чем можно судить по скриншоту ниже и отображении полоски жестов, вместо системных кнопок: В дизайнере отображаю прямоугольник с толстыми краями и располагаю его по расположению клавиатуры. Попутно вывожу в метку размер клавиатуры: procedure TFormMain.fgFormVirtualKeyboardFrameChanged(Sender: TObject; const AVKFrame: TRectF); begin fgLabel1.Text := Format('%f x %f', [AVKFrame.Width, AVKFrame.Height]); reVKSpacer.BeginUpdate; try reVKSpacer.Position.SetPointF(AVKFrame.Left, AVKFrame.Top - reVKSpacer.Stroke.Thickness); reVKSpacer.Size.SetSizeF(AVKFrame.Width, AVKFrame.Height + reVKSpacer.Stroke.Thickness); finally reVKSpacer.EndUpdate; end; end;В результате в рантайме проблемы нет: Нужно больше информации, прикрепить демо-проект.
  9. Changed Status to Fixed Changed Resolution to Fixed Changed Fix version to 1.19.6.0
  10. Changed Status to Fixed Changed Resolution to Fixed Changed Fix version to 1.20.0.0
  11. Changed Status to Closed Changed Resolution to Test case error
  12. Changed Status to Fixed Changed Resolution to Fixed Changed Fix version to 1.20.0.0
  13. Changed Status to Wait for Reply
  14. У нас используется версия 7.5.0
  15. Речь про рекламу или все-таки аналитику?
  16. Changed Status to Open
  17. Добавил новое свойство, чтобы можно было задать свою ширину выпадающего списка: 0 - автоматический расчет ширины на основании содержимого элементов. (по умолчанию). Имеет смысл только в Андроид. Потому что в iOS, выпадающее окно отображается в виде выдвигаемой снизу панели или Popover.
  18. Changed Status to Fixed Changed Resolution to Fixed Changed Fix version to 1.19.7.0
  19. Глянул. В Андроиде можно узнать ширину выпадающего окна и задать ее свою. Так же есть возможность указывать смещение. по вертикали и горизонтали. По скольку в iOS выпадашка наша, эта информация так же доступна и возможна к изменению. Так что в принципе можно добавить в кросс апи.
  20. В Android ширина выпадающего окна вычисляется автоматически Андроидом и обычно равна ширине контента, так чтобы текст элементов не обрезался. В iOS мы сами реализуем выпадающее окно и его ширина совпадает с шириной компонента. Не очень понятно, что даст это знание? И что хочется добиться?

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.