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.19.6.0 English

Featured Replies

  • Administrators

Download:

Release date:
03 June 2026


New

TfgWebBrowser

Two new events have been added: OnPermissonRequest and OnConsoleMessage.

Added a new demo project: "Components" -> "TfgWebBrowser" -> "Request Permissions"

Permissions

The OnPermissonRequest event allows you to control web browser access to the camera, microphone, and private media data. The event is triggered at the moment when the downloaded content in the browser wants to gain private access to the camera, microphone, or other resources. A set of requested AResources resources is passed to the event input:

TfgPermissionResource = (AudioCapture, VideoCapture, ProtectedMedia);
TfgPermissionResources = set of TfgPermissionResource;


TfgPermissionRequestEvent = procedure(Sender: TObject; const AUrl: string; const AResources: TfgPermissionResources;
                                      const AHandler: IFGXPermissionRequestHandler) of object;

The AHandler is used to confirm or reject such access. In this event, you need to make such a request to the system, and upon receiving confirmation from the user, inform the browser that access is allowed by calling AHandler.Grant(Resources). If no access is granted - AHandler.Deny.

Please note that the system permissions are requested via TfgPermissionService.RequestPermissionsAsync are issued for your entire application. This means that any component and code within your application automatically gets access. However, the web browser allows you to load any content dynamically. And so that the content of the web browser cannot monitor the user (subject to previously granted access), it automatically requests such access permission from the developer through a new event. If the developer does not grant such access or does not write a handler, such an access request is automatically considered rejected.

Also, this event does NOT request access to the camera or microphone from the system, but only allows you to block such access. If you approve this access at this event, but do not get permission from the system, the browser will not be able to use the camera and microphone.

This event is only relevant for the Android platform. By default, iOS automatically requests such access from the user automatically.

Console

The OnConsoleMessage event allows you to intercept a message output by Javascript to the web browser console. It only works on Android.

Improvements 🙌

TfgCollectionView

This release has changed the approach to dynamically calculating the size of TfgCollectionView elements. Despite the fact that the list allowed for changing the heights (for a vertically oriented list) of elements, the solution we proposed was not fully consistent with how the list works in iOS.

As you know, the display of elements in the TfgCollectionView does not depend on their number. Because only visible elements are always displayed. Despite the fact that the working principle of the list is similar in Android and iOS, there is still a difference:

  1. In the Android, you will never know the total size of the list items (aka ContentSize) and the exact offset of the contents of the ContentOffset. To find out the exact offset of the list and the size of the content, it would have to load all the elements first in order to find out the actual height of each element. But for the speed of work in Android, this is not done. Therefore, the offset is calculated based on the average height of the elements in the visible window (the sliding window algorithm is used). This means that in Android, you can change the size of an element at any time with impunity, because this does not affect the calculation of the offset and the size of the content in the Android component's paradigm.

  2. In the iOS, the situation is completely the opposite, the list first asks for the sizes of all the elements and only then outputs them. Therefore, any change in the size of the elements after the list has requested all the sizes and performed all the heavy calculations leads to a very difficult updating of the internal state of the list with further problems in speed. Starting with iOS 26, any such attempt to resize ends up crashing the app, because the native implementation of the list does not take this into account.

Therefore, we had to rethink the approach to the dynamic calculation of the heights of the elements.:

  1. If you plan to change the height of the elements dynamically, now you need to explicitly indicate this to the list by setting the value of the new TfgCollectionViewStyle.VariableSize = True property. By default, the value is set to `False`. If this is not done, the set size of the elements in the OnBindItem will be ignored and the style size taken from the designer will be used.

  2. As before, the calculation of the height of the elements must be performed in TfgCollectionView.OnBindItem. The specified height is cached in the list and used to speed up the list. When changing the size of the list, as well as when calling `ReloadItems` and other similar methods, the cache is automatically reset and you will be prompted to recalculate the sizes of the elements in TfgCollectionView.OnBindItem.

  3. If for some reason you want to recalculate the size of an element, then you need to inform the list about this by calling the methods ReloadItems, ReloadItem. If this is not done, any attempt to set a new size that differs from the original one will be ignored by the list.

Let's take an example. We have a simple list with the elements displayed by the label using a single component of the style TfgLabel (text).

Then an auxiliary method that calculates the height of the label at a fixed width may look like this:

procedure TFormMain.AdjustHeight(const AItem: TfgItemWrapper);
begin
  var LLabel := AItem.GetControlByLookupName<TfgLabel>('text');
  if LLabel = nil then
    Exit;

  var Item := AItem.Item;
  // Calculating the available width of the label for text output, taking into account the external and internal margins
  var TotalHItemPadding := Item.Padding.LeftRtl + Item.Padding.RightRtl;
  var TotalHLabelMargins := LLabel.Margins.LeftRtl + LLabel.Margins.RightRtl;
  var TotalVLabelMargins := LLabel.Margins.Top + LLabel.Margins.Bottom;
  var ContentWidth := Item.Width - TotalHItemPadding - TotalHLabelMargins;

  // Calculating the size of the label for displaying the text, taking into account the fixed width.
  var Sz := LLabel.MeasureSize(TfgMeasuringSpecification.Fixed, ContentWidth, TfgMeasuringSpecification.Unspecified, 0);
  
  Item.Height := Sz.Height + TotalVLabelMargins;
end;

Then binding the elements to the data and setting the size will look like this:

procedure TFormMain.cvListBindItem(Sender: TObject; const AIndex: Integer; const AStyle: string;
  const AItem: TfgItemWrapper);
var
  ItemText: string;
begin
  ItemText := FItems[AIndex];
  var LLabel := AItem.GetControlByLookupName<TfgLabel>('text');
  if LLabel <> nil then
    LLabel.Text := ItemText;
  AdjustHeight(AItem);
end;

Important. Don't forget to set TfgCollectionViewStyle.VariableSize = True for style.

TfgNavigationBar

The appearance settings of ActionButtons were extended. The new property Icon was introduced for TfgNavigationBarButton. It allows to adjust default icon appearance on button level. It provides:

  • RenderMode - It is responsible for whether the icon needs to be repainted in a given shade or whether the icon should be displayed as it is.

  • TintColor/TintColorName - the color of the icon shade. Allows you to redefine the icon shade set via the TfgNavigationBar.ButtonsOptions.IconTintColor/IconTintColorName property by default.

TfgLabel

  • The TfgLabel HTML parser has been unified across all platforms.

  • Text display in the designer has been added for the TfgLabel.TextType = TfgTextType.HTML mode.

  • A multi-line text editor for TfgLabel.Text has been added when editing in the object inspector.

Bug Fixes 🐛

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.