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.

1.20.0.0 English

Featured Replies

  • Administrators

Download:

Release date:
03 June 2026


Warning ๐Ÿšจ

  • Upon the first build of the FGX Native application for Android, the Gradle distribution 9.6.1 will be downloaded and installed with all the auxiliary plugins and libraries needed to build applications. This requires Internet access and time. Subsequent builds will run quickly.

  • The attribute android:extractNativeLibs has been removed from the Android application manifest template. It is now automatically affixed by the assembly system automatically.

  • If you use the animation of displaying or hiding shapes via TfgAnimationHelper, then you need to remove this code. The form now uses animation automatically. To animate the display of the modal window, you need to use the new TfgForm.ShowModal method.

New โœจ

Forms

This release has improved the mechanisms for animating, displaying, hiding, and managing the lifetime of forms.

Animations

Now all forms use animation for their display and hiding by default. As a result, you no longer need to resort to using the auxiliary animation class TfgAnimationHelper.

Using the example of opening a form.

Old:

{ Regular form }
TfgAnimationHelper.ShowForm(Form);
TfgAnimationHelper.HideForm(Self, [TfgAnimationOption.ReleaseControlOnFinish]);

{ Modal form }
TfgAnimationHelper.ShowModalForm(Form);
TfgAnimationHelper.HideModalForm(Self, [TfgAnimationOption.ReleaseControlOnFinish]);

New:

{ Regular form }
Form.Show;
Form.Close;

{ Modal form }
Form.ShowModal;
Form.Close;

The old TfgCustomForm.Show method is supplemented with an optional APresentationStyle parameter, which allows you to select the type of animation for displaying the form. Currently, there are only two options available:

  • TfgFormPresentationStyle.Default - with default animation (as it is accepted on the current platform).

  • TfgFormPresentationStyle.None - Do not apply animation and display the form immediately.

Therefore, if you do not want to apply animation, then you need to pass the optional parameter TfgFormPresentationStyle.None to the Show method.

In addition to this method, a method ShowModal has been added for the modal display of the form. When hiding/closing a form, the Hide and Close methods use the reverse animation used when opening it.

/// <summary> 
/// Display the form on the screen by applying the passed style <c>APresentationStyle</c> to the display animation.
/// </summary> 
procedure Show(const APresentationStyle: TfgFormPresentationStyle = TfgFormPresentationStyle.Default); 

/// <summary> 
/// Display the form modally on the screen by applying the passed style <c>APresentationStyle</c> to the display animation. 
/// </summary> 
procedure ShowModal(const APresentationStyle: TfgModalFormPresentationStyle = TfgModalFormPresentationStyle.Default); 

/// <summary>Hide the form from the screen.</summary> 
/// <remarks>When hiding, the animation is reversed to the one that was used when displaying the form.</remarks>
procedure Hide; overload; 

/// <summary>Hide the shape from the screen without animation.</summary>
procedure HideWithoutAnimation; 

/// <summary>Hide the form from the screen with the possibility of its self-destruction of the instance.</summary> 
/// <remarks>The decision to act on the form can be influenced using the <c>DefaultCloseAction</c> property and/or the <c>onClose</c> event.</remarks>
procedure Close; 

/// <summary>Was the form displayed on the screen?</summary>
/// <remarks>
/// Does not take into account its optical visibility, taking into account possible overlap with other forms, but captures the fact that it
/// is located somewhere on the screen and its representation is embedded in the scene. 
/// </remarks>
function IsShown: Boolean;

Management and Closing

Despite the fact that the form closing mechanism has been introduced for a long time, it is worth mentioning separately in light of the addition of animation on how to correctly manage the lifetime of the form.

The form must be closed and hidden using the Close method. In this case, the form asks the developer what to do with the form through the AAction parameter of the OnClose event. The following options are available:

  • TfgFormCloseAction.None - The request to close the form is ignored. For example, if a user tries to close a form to save a change, and the filled-in data is incorrect, you can cancel the closing and point out the problem to the user.

  • TfgFormCloseAction.Hide - The form is hidden, but the form instance is not deleted and it can be reused.

  • TfgFormCloseAction.Free - The form is hidden and the form instance is deleted after it is completely hidden.

If you know in advance that the form needs to be destroyed when closing, you can specify this via the TfgForm.DefaultCloseAction property. In this case, this will be the default value that will be passed to the OnClose event, if it is defined.

This mechanism has been around for a long time, however, due to the fact that previously closing the form with animation was performed through the TfgAnimationHelper helper, it was not possible to use it since deleting the form only needs to be done after the animation is over. Now that animation is part of the form, this mechanism is fully synchronized with it.

Modal forms

In this release, asynchronous modality mode has been added for forms. To display the form in modal mode, you need to use new methods:

procedure ShowModal(const APresentationStyle: TfgModalFormPresentationStyle = TfgModalFormPresentationStyle.Default); overload; 
procedure ShowModal(const ACloseCallback: TfgCloseModalCallback; 
                    const APresentationStyle: TfgModalFormPresentationStyle = TfgModalFormPresentationStyle.Default); overload;

The form will be displayed on the screen with animation (by default), and the result of displaying the form TModalResult will be passed to the callback function ACloseCallback.

Usage example:

MyForm.ShowModal(
  procedure (const AModalResult: TModalResult)
  begin
    case AModalResult of
      mrCancel:
        TfgToastFactory.Show('Cancel was pressed');
      mrOk:
        TfgToastFactory.Show('OK was pressed');
    end;
  end);

The return value of the modal result is set via a new form property TfgForm.ModalResult. In addition, the TfgButton button now has a public ModalResult property. When the button is clicked, this value is automatically set in TfgForm.ModalResult.

vkHardwareBack key on Android 16+

Starting with applications developed for Android 16+, Google disabled operation of the vkHarwareBack button. This means that in your applications, the processing of this button did not work. We simulated the challenge of pressing this button, as it was before.

Gradle

We updated the Gradle build system for Android applications from version 8.13 up to 9.6.1.

Attention: During the first build of the FGX Native application for Android, the Gradle 9.6.1 distribution will be downloaded and installed with all the auxiliary plugins nd libraries needed to build applications. This requires Internet access and time. Subsequent builds will run quickly.

Upgrading used Android libraries

In this release, the following used Android libraries have been updated to the latest versions and their FGX Native services have been used:

  • 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

In addition, all header files Android.Api.* have been updated to the latest library versions.

Improvements ๐Ÿ™Œ

TfgCollectionView

In 1.19.6.0 the approach to calculating the size of list items has been changed. As a result, the OnBindItem event can be called for the same element multiple times. In one case, to calculate the size of the element, in the other to display it.

In iOS, the first time it is displayed, the size of all elements is requested. And if the list assumes the display of images loaded asynchronously, this leads to the problem of loading all images at once en masse. As a result, the RAM allocated for the application may run out, and the entire application may slow down.

Now you can determinate the data binding assignment (call OnBindItem) to the elements using the new TfgItemWrapper.Purpose property and skip loading or linking images to the components of the element, thereby speeding up the calculation of the size of the elements.

/// <summary>
/// <para>
/// Assignment of an item in the list
/// </para>
/// <para>
/// <list>
/// <item><b>Measure</b> - The item is used to calculate its size.</item>
/// <item><b>Display</b> - The item is used to display on the screen.</item>
/// </list>
/// </para>
/// </summary>
TfgItemWrapperPurpose = (Measure, Display);
TfgItemWrapperPurposes = set of TfgItemWrapperPurpose;

Tip: If you are using lists with dynamic height elements and displaying images, then use TfgItemWrapperPurpose.Measure to skip loading and displaying these images in order to speed up the list.

Java2Delphi

Improved the auxiliary utility for generating header files for Java/Kotlin libraries:

  • If two Java classes with the same names were found in different packages during import, they could be incorrectly used as a parent class.

  • Previously, the generator did not take into account the case of class names, as a result of which the classes package.MyClass and package.MyClass could be handled incorrectly.

  • Fixed the generation of setters for static java class fields.

  • The name of the Java method inline is a keyword and is processed separately.

TfgComboBox

Added the ability to specify the width of the drop-down window for the TfgComboBox. The property TfgComboBox.Appearance.Popup.Width only makes sense under Android.

Bug Fixes ๐Ÿ›

Access violation ะฟั€ะธ ะพั‚ะบั€ั‹ั‚ะธะธ ั„ะพั€ะผั‹ ะฒ ะดะธะทะฐะนะฝะตั€ะต ะฒ RAD Studio 13.2

FGX Native: 1.20.0.0

IDE: RAD Studio 13.2 (BDS 37.0), bds.exe 37.0.60952.8797

ะŸั€ะธ ัƒัั‚ะฐะฝะพะฒะบะต ะฒั‹ะฑั€ะฐะฝ ะฒะฐั€ะธะฐะฝั‚: Designer (13.1+)

ะŸั€ะธ ะพั‚ะบั€ั‹ั‚ะธะธ ะปัŽะฑะพะณะพ .xfm ะฒ ะดะธะทะฐะนะฝะตั€ะต IDE ะฒั‹ะดะฐั‘ั‚ ะพัˆะธะฑะบัƒ:

Error creating form in Form.Main.xfm: Access violation at address FB7A59E9 in module

'bds.exe' (Offset FB7A59E9). Execution of address FB7A59E9.

(ะฒ ะฝะตะผะตั†ะบะพะน ะปะพะบะฐะปะธะทะฐั†ะธะธ: ยซFehler beim Erzeugen des Formulars in Form.Main.xfm:

Zugriffsverletzung bei Adresse FB7A59E9 in Modul 'bds.exe' โ€ฆยป)

ะ’ะพัะฟั€ะพะธะทะฒะพะดะธั‚ัั ะฝะฐ ะปัŽะฑะพะผ ะฟั€ะพะตะบั‚ะต, ะฒะบะปัŽั‡ะฐั ัˆั‚ะฐั‚ะฝั‹ะต ะฟั€ะธะผะตั€ั‹, ะฝะฐะฟั€ะธะผะตั€

Samples\ActivityIndicator - Tint\Form.Main.xfm.

ะงั‚ะพ ัƒะดะฐะปะพััŒ ะฒั‹ััะฝะธั‚ัŒ:

- ะŸะฐะบะตั‚ั‹ ะทะฐะณั€ัƒะถะฐัŽั‚ัั ะฑะตะท ะพัˆะธะฑะพะบ: ะฒัะต ะธะผะฟะพั€ั‚ั‹ FGXNative.Designer.370.bpl ะฟั€ะธััƒั‚ัั‚ะฒัƒัŽั‚

ะฒ ะฟะฐะบะตั‚ะฐั… 13.2 (ะฟั€ะพะฒะตั€ะตะฝะพ ะฟะพ ั‚ะฐะฑะปะธั†ะฐะผ ะธะผะฟะพั€ั‚ะฐ/ัะบัะฟะพั€ั‚ะฐ PE). ะžัˆะธะฑะบะฐ ะฒะพะทะฝะธะบะฐะตั‚ ั‚ะพะปัŒะบะพ

ะฟั€ะธ ะฟะตั€ะฒะพะผ ะฒะธั€ั‚ัƒะฐะปัŒะฝะพะผ ะฒั‹ะทะพะฒะต.

- ะะดั€ะตั FB7A59E9 ะปะตะถะธั‚ ะดะฐะปะตะบะพ ะทะฐ ะฟั€ะตะดะตะปะฐะผะธ ะฐะดั€ะตัะฝะพะณะพ ะฟั€ะพัั‚ั€ะฐะฝัั‚ะฒะฐ 32-ะฑะธั‚ะฝะพะณะพ bds.exe,

ะธ ัะพะพะฑั‰ะตะฝะธะต ะณะพะฒะพั€ะธั‚ ยซExecution of addressยป, ั‚ะพ ะตัั‚ัŒ ะฒั‹ะทะพะฒ ะฟะพ ะฝะตะบะพั€ั€ะตะบั‚ะฝะพะผัƒ ัƒะบะฐะทะฐั‚ะตะปัŽ

(ัะผะตั‰ั‘ะฝะฝะฐั VMT). ะŸะพั…ะพะถะต ะฝะฐ ั‚ัƒ ะถะต ะฝะตัะพะฒะผะตัั‚ะธะผะพัั‚ัŒ design-time ะฟะฐะบะตั‚ะพะฒ, ั‡ั‚ะพ ะฑั‹ะปะฐ

ั 12.3 (1.18.11.0) ะธ 13.1 (1.19.6.0).

- ะšะพะผะฟะธะปัั†ะธั ะธ ัะฑะพั€ะบะฐ ะฝะต ะทะฐั‚ั€ะพะฝัƒั‚ั‹: ะฟั€ะธะผะตั€ ะฟะพะด Android64 ัะพะฑะธั€ะฐะตั‚ัั ั‡ะตั€ะตะท msbuild

ัƒัะฟะตัˆะฝะพ (exit code 0). ะŸั€ะพะฑะปะตะผะฐ ั‚ะพะปัŒะบะพ ะฒ design-time.

- FGXNative.Designer.370.bpl: link timestamp 2026-09-08 21:58 UTC, ะฒะตั€ัะธั ั„ะฐะนะปะฐ 1.20.0.0.

- ะ’ ะธะฝัั‚ะฐะปะปัั‚ะพั€ะต 1.20.0.0 ะฒะฐั€ะธะฐะฝั‚ะฐ ะดะธะทะฐะนะฝะตั€ะฐ ะดะปั 13.2 ะฝะตั‚ โ€” ั‚ะพะปัŒะบะพ 13.0 ะธ 13.1+.

ะ’ะพะฟั€ะพั: ะฝัƒะถะฝะฐ ะปะธ ะพั‚ะดะตะปัŒะฝะฐั ัะฑะพั€ะบะฐ ะดะธะทะฐะนะฝะตั€ะฐ ะดะปั 13.2?

  • Author
  • Administrators

Hello,

We haven't tested build for 13.2. But based on your usefull feedback, looks liek 13.2 is not backward compatible with 13.1 At least Designer. We will prepare special build of the form designer for 13.2 and will make fresh release in the nearest 1-2 days. Sorry for inconvenience.

Thank you

Title

[Build] Precompiled iOSSimARM64 DCUs are rejected by the compiler (F1027) on RAD Studio 13.2

Body

Summary

With FGX Native 1.20.1.0 on RAD Studio 13.2, no project can be compiled for the iOS Simulator
(iOSSimARM64). The compiler rejects every precompiled FGX DCU shipped in
Libs\370\iOSSimARM64\ with F1027 Unit not found. The same installation compiles fine for
Android64 and iOSDevice64. Your own samples fail as well, so this is not specific to our
application.

Environment

FGX Native

1.20.1.0 (installed with the designer version for RAD Studio 13.2)

RAD Studio

13.2 โ€” bds.exe / dcciossimarm64.exe file version 37.0.60952.8797, dated 2026-09-09

Host

Windows 11

Mac

Xcode 27.0 (27A266a), PAServer 37.0_13.2, SDK iPhoneSimulator27.0.sdk

Library path

$(FGX)\Libs\$(FGXCOMPILER)\$(PLATFORM)\... with FGX = c:\projekte\delphi_sp\FGX Native, FGXCOMPILER = 370

Symptom

Building any FGX project for iOSSimARM64 (msbuild or IDE library path, Debug or Release):

BSYSMobileApp.dpr(91): error F1027: Unit not found: 'FGX.Application' or binary equivalent (.dcu/.o)

Your own sample Samples\ActivityIndicator - Tint fails with exactly the same error:

ActivityIndicatorDemo.dpr(7): error F1027: Unit not found: 'FGX.Application' or binary equivalent (.dcu/.o)

Minimal reproduction

t.dpr:

program t;
uses FGX.Consts;
begin
end.
dcciossimarm64.exe --no-config ^
  -U"c:\projekte\delphi_sp\FGX Native\Libs\370\iOSSimARM64\Debug;C:\Program Files (x86)\Embarcadero\Studio\37.0\lib\iOSSimARM64\debug" ^
  -NSSystem t.dpr

t.dpr(1) Fatal: F1027 Unit not found: 'FGX.Consts' or binary equivalent (.dcu/.o)

FGX.Consts.dcu (758 bytes) and FGX.Consts.o (3868 bytes) are both present in that directory.
The same happens for every FGX unit we tried (FGX.Types, FGX.Controls, FGX.Application, โ€ฆ),
for both Debug and Release, and with or without the .o file present.

What we verified (to rule out the usual causes)

  1. The search path is fine. A DCU we compiled ourselves, placed in the same directory as the
    rejected FGX.Consts.dcu, is found and loaded by the very same compiler invocation.

  2. The RTL for that platform is fine. uses System.SysUtils against
    lib\iOSSimARM64\debug compiles and only stops at the (locally unavailable) Mac linker.

  3. Other platforms work. The FGX DCUs for Android64 (dccaarm64) and iOSDevice64
    (dcciosarm64) from the same installation load correctly โ€” compilation succeeds and the run
    only stops in the linker.

  4. The source is fine โ€” only the shipped binary is not. Compiling
    Sources\FGX.Consts.pas ourselves with this exact compiler produces a DCU that loads without
    any problem. Interesting detail: our .o has exactly the same size as the shipped one
    (3868 bytes), while our .dcu is 799 bytes versus the shipped 758 bytes. So the code is
    identical; the DCU container is not.

  5. Not a regression of 1.20.1.0 alone. The iOSSimARM64 DCUs of 1.20.0.0 and 1.19.6.0 (we keep
    the library in git) are rejected in the same way by this 13.2 compiler.

  6. The DCU header looks correct. Platform magic and compiler tag are identical to a DCU
    produced by this compiler:

    • our own DCU: 4D 88 00 25 F3 00 00 00 ... + FE 27 FE EF 07 96 01

    • shipped FGX: 4D 88 00 25 F6 02 00 00 ... + FE 27 FE EF 07 96 01

    • RTL System.dcu (iOSSimARM64): 4D 88 00 25 ... + FE 27 FE EF 07 96 01

Our interpretation

Since only the iOS Simulator platform is affected, while Android and iOS device binaries from the
same package are fine, it looks like the iOSSimARM64 libraries of 1.20.1.0 were not built against
the same RAD Studio 13.2 / iOS 27 simulator RTL as the other platforms โ€” or the simulator platform
was not rebuilt for the 13.2 package at all.

Question

Could you please check the Libs\370\iOSSimARM64\Debug and ...\Release binaries of the 13.2
package? At the moment we cannot build or test anything on the iOS Simulator.

Happy to provide any further output (full compiler command line, hex dumps, the failing sample).

  • Author
  • Administrators

Hello,

You should check:

  1. Paths in IDE Tools -> Options... -> Language -> Delphi -> Library -> iOS Device 64-bit -> Library path. It has to contains paths to FGX Native dcu binary files for iOS SImulator target.

  2. If you have specified paths in (1). So you should check, that you selected iOS target files in installer (when you install FGX Native).
    image.png

Thank you

Hello Yaroslav,

thank you, that was it. After reinstalling FGX Native 1.20.1.0 with the iOS targets selected, the library path for iOS Simulator ARM64 now contains $(FGX)\Libs\370\iOSSimARM64\Release, and both a sample and our app build and link for iOSSimARM64 again (error F1027 for FGX.Consts is gone).

One observation that may help other users: the installed files were byte-identical to the previous installation โ€” only the IDE library path for the simulator platform was missing. It seems the installer only writes that path when the iOS targets are checked, so a hint in the installer or in the release notes could save others some time.

Best regards,

Stefan

Recently Browsing 0

  • No registered users viewing this page.

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.