Jump 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.18.14.0 Русский

Featured Replies

  • Administrators

Скачать:
setup_1.18.14.0_release.rus.zip

Дата релиза:
13 августа 2025


Новое

TfgCanvas

Cохранение состояния

Переработан подход к управлению состоянием канвы, а именно методы SaveState / RestoreState. Раньше при сохранении состояния вы получали объект состояния, который в дальнейшем надо было использовать для восстановления в методе RestoreState. Такой подход оказался избыточным, так как команды отрисовки выполняются последовательно и управление состоянием идет тоже последовательно (восстановление до предыдущего состояния).

Теперь при сохранении состояния оно автоматически сохраняется во внутреннем стеке состояний канвы. Добавлен новый парный метод RestoreState(), который извлекает последнее состояние из стека и восстанавливает его.

Теперь шаблон работы с состоянием канвы выглядит так:

ACanvas.SaveState;
try
  // Выполняем отрисовку 
finally 
  ACanvas.RestoreState;
end;

Внимание: Теперь нельзя восстанавливать любое состояние, только последнее. Это связано также с принципом работы нативной канвы в Android / iOS, которые не предусматривают такой возможности.

Обрезание по пути

Добавлена поддержка обрезания области отображения по указанному пути. Новый метод TfgCanvas.ClipPath позволяет добавить к текущей области отсечения новую.

Например, отрисовка красного круга обрезанного центральным кругом, вписанным в область TfgPaintBox:

procedure TFormMain.fgPaintBoxPaint(Sender: TObject; const ACanvas: TfgCanvas);
var
  CirclePath: TfgPath;
begin
  ACanvas.SaveState;
  CirclePath := TfgPath.Create(nil);
  try
    CirclePath.AddArc(fgPaintBox.LocalBounds, 0, 360)
              .ClosePath;
    ACanvas.ClipPath(CirclePath);

    ACanvas.Fill.Kind := TfgBrushKind.Solid;
    ACanvas.Fill.Color := TAlphaColorRec.Red;
    ACanvas.FillCircle(TPointF.Create(0, fgPaintBox.Height / 2), fgPaintBox.Height / 2);
  finally
    CirclePath.Free;
  end;
  ACanvas.RestoreState;

Восстановление области отсечения осуществляется только при помощи восстановления состояния канвы SaveState / RestoreState.

Внимание: Данный функционал не поддерживается в дизайнере.

Заполнение путей

Добавлена возможность управлять способом заполнения путей Canvas.FillPathRule.

Внимание: Данный функционал не поддерживается в дизайнере.

Пользовательский штрих Stroke

Добавлена возможность использовать пользовательский шаблон штриха в кисти TfgBrushStroke. Задание пользовательского штриха осуществляется при помощи метода:

procedure SetCustomDash(const ADash: TDashArray; const AOffset: Single); 

TfgSvgPath

Добавлено новое свойство FillRule (NonZero, EvenOdd).

Дизайнер формы

Добавлен новый редактор градиентной кисти.

Провайдер тайлов от Яндекс карт

Для TfgMap добавлен новый провайдер тайлов от Яндекс карт TfgYandexMapTileProvider. Провайдер тайлов поддерживает кастомизацию внешнего вида в рамках API.

Для использования необходимо получить бесплатный API ключ. Подробности по ссылке.

Новый сервис IFGXApplicationMetaDataService

Добавлен новый сервис для получения метаданных приложения. Чтобы прочитать значение переменной с именем `test_value` вы можете использовать код

var value: string;
value := Application.MetaData.Values['test_value'];

Для iOS метаданные хранятся в файле info.plist, для Android в манифесте AndroidManifest.xml в тегах meta-data.

Перетаскивание контролов (Drag & Drop)

Для всех контролов (за исключением некоторых композитных контролов типа TfgDrawerLayout, TfgBottomSheetLayout и т.д.) добавлена возможность перетаскивания на другие контролы по Long Tap. За возможность перетаскивания отвечает свойство DragEnabled. Чтобы узнать, находится ли в настоящее время контрол в состоянии перетаскивания, обратитесь к свойству `IsDragged`. Так же в процессе перетаскивания у контрола возникают события OnDragStarted (в начале) и OnDragFinished (в конце перетаскивания).

Для возможности приёма перетаскиваемых контролов добавлено свойство AcceptDropMode. По умолчанию приём перетаскивавых контролов запрещён (TfgAcceptDropMode.Restricted). Однако, вы можете разрешить приём всех контролов (TfgAcceptDropMode.AcceptAll), либо же в рантайм контролировать приём с помощью события OnCanAcceptDrop (режим TfgAcceptDropMode.AcceptByEvent).

Основное событие OnDragDrop оповещает о бросании перетаскиваемого контрола на контрол приёмник.

OnDragEntered - перетаскиваемый контрол оказался над принимающим контролом, OnDragExited перетаскиваемый контрол покинул пределы принимающего контрола. Событие OnDragOver возникает при перемещении перетаскиваего контрола над принимающим контролом.

Типичный пример обработки бросания компонента:

procedure TFrameDrop.fgFrameDragDrop(Sender: TObject; const AData: TfgDragObject; const APoint: TPointF);
var
  LTarget: TfgControl;
  LDragged: TfgControl;
begin
  LTarget := Sender as TfgControl;
  LDragged := AData.Control as TfgControl;

  LDragged.Position.SetPointF(APoint - AData.DragPoint);
  LTarget.InsertControl(LDragged);
end;

Добавлен новый демонстрационный проект "Перетаскивание" -> "Базовый пример".

Улучшения 🙌

SVG

Добавлена поддержка следующих атрибутов: stroke-dasharray, stroke-dashoffset, stroke-linecap, stroke-linejoin, fill-rule.

TfgMap

Добавлен новый метод TfgMap.FindVisibleMarkersRegion для определения видимого региона на карте, охватывающего все видимые маркеры на карте. Один из вариантов использования отображения видимого региона всех маркеров:

var VisibleMarkerRegion: TfgMapRect;
if fgMap1.FindVisibleMarkersRegion(VisibleMarkerRegion) then
  fgMap1.MoveCameraToVisibleRegion(VisibleMarkerRegion, 20);

Добавлен дополнительный параметр Animate в метод MoveCameraToVisibleRegion, позволяющий управлять применением анимации при перемещении камеры.

TfgControl

Добавлен новый метод TfgControl.LocalTo, предназначенный для конвертации точки в локальной системе координат контрола в систему координат указанного контрола ATo.

Android Api

Обновлен заголовочный файл Android.Api.ActivityAndView для типа android.app.ActivityManager. Теперь можно узнать запущенные процессы и потребляемую ими память.

Разное

Теперь все окна библиотеки используют темизированный заголовок, как остальные окна IDE.

Исправление ошибок 🐛

  1. FGX-449 Событие TfgMap.OnTap не работает.

  2. FGX-450 Под IOS невозможно убрать все окна маркеров на карте (iOS).

  3. Исправлена работа Bluetooth BLE для Delphi 12.2 и ниже.

  4. Приложение могло падать при использовании двух экземпляров TfgWebBrowser с инициацией процесса выбора файла на странице.

  5. Приложение могло падать при использовании TfgMap в ландшафтной ориентации при изменении зума (iOS).

  6. FGX-457 Под IOS не работает TfgMap.CameraZoom (iOS).

  7. FGX-458 Примеры с картой не рассчитаны под iOS (iOS).

  8. FGX-461 AccessViolation при использовании TfgAppleIdButton (iOS).

  9. FGX-462 Баг с отображением TfgArch.

  10. Для Android могли не сохраняться параметры на странице "Основные настройки" в настройках проекта.

Поставил новую версию. В приложении пропали все прямоугольники (TfgRectangle). А их много!

Они не пропали, но не отображаются как раньше

Под IOS вообще много чего сломалось. Проблемы с цветами в разных местах.

  • Author
  • Administrators
4 hours ago, Mineev said:

Они не пропали, но не отображаются как раньше

Есть более подробная информация, о чем речь идет?

3 hours ago, Mineev said:

Проблемы с цветами в разных местах.

Аналогично, в каких местах и что за цвета?

Снимок экрана 2025-08-13 133748.png

Вот! Даже в дизайнере рамки нет!

Создал пустой проект. Кинул прямоугольник. Если цвет задан через ColorName, рамка не отображается. Если задать Color, то рамка начинает отображаться цветом ColorName

  • Author
  • Administrators
Just now, Mineev said:

Создал пустой проект. Кинул прямоугольник. Если цвет задан через ColorName, рамка не отображается. Если задать Color, то рамка начинает отображаться цветом ColorName

Спасибо, это воспроизвел. Сейчас поправлю и сделаю хотфикс. Что-то еще?

Рамка не отображается, если указан Color = Null.

Еще куча проблем с цветами под iOS. Сейчас буду разбираться что и где не так. Там и цвета текста и цвета фона испортились. Может это одна и та же проблема?

Edited by Mineev

  • Author
  • Administrators
4 minutes ago, Mineev said:

Еще куча проблем с цветами под iOS. Сейчас буду разбираться что и где не так. Там и цвета текста и цвета фона испортились. Может это одна и та же проблема?

Скорее всего. Вот исправленный файл FGX.Canvas.Types.pasЕго нужно добавить в проект и пересобрать.

Проблема с прямоугольниками и цветами под iOS ушла. В дизайнере бы еще хотелось нормально увидеть.

Еще под iOS вылезла такая вот ошибка карты (TfgMap)

Simulator Screenshot - iPhone 14 Pro Max - 2025-08-13 at 13.56.57.png

Это явно не моё. Под android данный код работает. Возможно это связано с FGX-457?!

Отдельного проекта нет. На версии 18.13 работало.

  • Author
  • Administrators

Тогда попробовать поймать исключение в отладчике или локализовать место. Без этого, исправления не будет. Потому что на ваших проектах в баг трекер я падение не ловил.

Ошибка у вас возникает в момент создания формы. Видимо, что-то вы там делаете при создании формы, что приводит к падению. Если вы считаете, что это связано с картой. То как минимум можно локализовать форму и найти строчку, которая приводит к этому падению.

Ошибка возникает в событии OnMapReady

Recently Browsing 0

  • No registered users viewing this page.

Account

Navigation

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.