Смотрите видео ниже, чтобы узнать, как установить наш сайт в качестве веб-приложения на домашнем экране.
Примечание: Эта возможность может быть недоступна в некоторых браузерах.
Основное изменение - наконец разобрались с правильной схемой владения окнами.
Раньше была неправильная модель: FMX-окно считалось отдельным top-level окном, а Inno Setup выступал просто как внешний хозяин. Из-за этого начали появляться побочные эффекты с окнами, отображением в системе.
Сейчас сделано как в обычном приложении:
окно FMX имеет правильный Owner через Application;
убрана лишняя независимость окна от приложения;
поведение окна стало ближе к обычному FMX-приложению.
После этого пришлось заново пройтись по внутреннему позиционированию и размеру клиентской области. Исправлена работа с client area - теперь содержимое окна правильно располагается относительно реального клиентского пространства, а не относительно внешнего размера окна.
Отдельно вынесена работа с окном:
скрытие стандартного заголовка;
работа с рамками;
изменение поведения окна Windows.
Эти вещи теперь делаются на уровне FMX.Platform.Win, где им и место, а не через внешние обходные решения.
Также расширен BASS-модуль:
воспроизведение отдельных файлов;
загрузка папок с музыкой;
смена папки во время работы;
playlist;
callback прогресса;
управление воспроизведением.
Исправлено поведение служебных окон сообщений:
окна больше не появляются в AeroPeek.
Небольшое обновление
Добавлен новый компонент FPicShow - слайдшоу с поддержкой анимированных переходов между изображениями.
Основные возможности:
Настройка времени показа каждого слайда.
Настройка длительности анимации перехода.
Поддержка выбора конкретного эффекта перехода.
Режим случайного выбора эффектов.
Настраиваемая рамка (цвет и толщина).
Реализован на базе FireMonkey Canvas.
Управление:
AddImage
Clear
Start
Stop
SetEffect
SetRandom
SetDuration
SetDelay
SetBorder
Эффекты:
Доступны различные эффекты переходов:
Fade
Build up from...
Quarters...
Bars in...
Uneven shred from...
Criss Cross reveal from...
Starburst...
Speckle appear...
Diagonal sweep
Reveal from...
Random squares...
Blind...
Dissolve
Список эффектов можно получить программно, что позволяет заполнить FComboBox или FComboEdit без ручного перечисления.
Вместо таймера используется
что позволило добиться плавных переходов.code_language.pascal:property AnimationValue: Single read FAnimationValue write FAnimationValue;
Пример - Example_PicShow.iss
Все идеи эффектов были бессовестно взяты отсюда Delphi Area/PicShow
Небольшое обновление:
Добавлен компонент FPageControl.
Новая реализация страниц по принципу TabControl:
FPageControl - контейнер страниц.
FPageItem - отдельная страница.
Добавлена поддержка переключения страниц с анимацией:
pdNone - мгновенное переключение.
pdHorizontal - горизонтальная смена страниц.
pdVertical - вертикальная смена страниц.
pdFade - плавное изменение прозрачности.
Добавлены направления перехода:
pmNormal
pmReverse
Новые методы:
ActivePage(Index, Move)
NextPage(Move)
BackPage(Move)
FirstPage(Move)
LastPage(Move)
Добавлены настройки анимации:
Duration
Interpolation
Поддерживаемые типы интерполяции:
Все
Добавлено событие OnChange для отслеживания смены активной страницы.
code_language.pascal:PageControl.FCreate(FormLayer.Handle); PageControl.SetBounds(20, 75, 760, 310); PageControl.Direction(pdHorizontal); PageControl.Duration(0.8); PageControl.Interpolation(itBack); PageControl.OnChange(@PageChange); Page1.FCreate(PageControl.Handle); Page2.FCreate(PageControl.Handle); PageControl.NextPage(pmNormal);
Функции по запросу:
Добавлен универсальный callback обработки Drag & Drop.
В текущей версии поддерживается компонентами FDropTarget и FListBox.
FDropTarget - загрузка например StyleBook простым перетаскиванием файла:
DropTarget.Filter('Styles (*.fsf;*.style)|*.fsf;*.style');
SetFileDropCallback(@FileDropped);
FListBox - приём списка файлов с последующей обработкой каждого файла:
DropListBox.FileDropEnabled(True);
SetFileDropCallback(@FileDropped);
Исправлено:
OnMouseDown (и аналогичные события) у кастомных контролов теперь передают корректный Sender. Ранее вместо объекта контрола передавался Self, из-за чего обработчики с case Sender of ... могли работать некорректно.
(Self > Sender)
Примеры в архиве:
Example_Botva2-Like.iss
Example_ShapeControls.iss
Добавлены новые интерфейсы:
FShapeArc - круговой прогресс-бар с поддержкой stroke, font, value, opacity, rotation, events и базовых layout-параметров.
FShapeSwitch - переключатель (on/off) с настройкой цветов, толщины, слайдера, состояния и событий OnChange.
FShapeButton - кнопка с текстом, стилем, скруглением, цветами, шрифтом и обработкой мыши/клика.
FShapeGradientButton - кнопка с градиентной заливкой, кастомной позицией градиента и расширенными визуальными настройками.
FShapeProgressBar - прогресс-бар с поддержкой градиентов, анимации, stroke, corner, value/min/max и событий.
расширены возможности кастомных Shape-контролов для тех кому нужно быстро и без участия -подключения стилями минимально офорить UI.
все как обычно - добавлена единая событийная модель (click/mouse/enter/leave)
есть визуальные параметры (opacity, rotation, hit-test, clipping, layout)
не требует создания собственных стилей через StyleBook;
![]()
Добавлены новые компоненты к предыдущим обновлениям (FImageButton, FImageCheckbox):
FImageRadioButton - радиокнопка на основе спрайта с поддержкой группировки, кастомного текста, шрифтов, состояний hover/down и обработкой мыши. Реализована логика взаимоисключающих групп (GroupName) и событие изменения состояния.
FImageProgressBar - прогресс-бар на текстурах (back/fill) с поддержкой min/max/value и отрисовкой заполнения через спрайты.
унифицированы почти все базовые свойства управления (layout, input, events)
![]()
Добавлены новые компоненты:
FImageButton, FImageCheckbox. По сути это графическая кнопка со спрайтом состояний, рассчитанная на сценарии, где внешний вид кнопки полностью задаётся изображением.
Идея простая: пользователь указывает одно изображение, а компонент автоматически разбирает его на состояния кнопки.
Формат спрайта:
- Обычное состояние
- Наведение мыши
- Нажатие
- Enabled = False
Изображения располагаются вертикально друг под другом.
Например, если кнопка должна отображаться размером: 120 x 25
то компонент автоматически ожидает спрайт: 120 x 100 и самостоятельно разделяет его на 4-8 кадра без дополнительных настроек и расчётов со стороны Inno Setup.
Основные возможности:
code_language.pascal:function FCreate(FParent: NativeInt): NativeInt; procedure SetImage(const FImage: WideString); procedure Text(const AText: WideString); procedure FontSetting(const FontName: WideString; FontSize: Single; FontColor: Cardinal); procedure TextColor(FontColor: Cardinal); procedure OnClick(Event: TNotifyEvent); procedure OnChange(Event: TNotifyEvent); procedure OnMouseEnter(Event: TNotifyEvent); procedure OnMouseLeave(Event: TNotifyEvent);
Особенности:
автоматическое масштабирование изображения под размер кнопки;
поддержка текста поверх изображения;
настройка шрифта и цвета текста;
корректная обработка состояний Hover / Pressed / Disabled;
поддержка стандартного OnClick;
поддержка OnChange;
не требует style-файлов FMX;
не требует создания собственных стилей через StyleBook;
вся логика рендеринга находится внутри DLL.
Компонент создавался как более простой вариант для задач, где раньше обычно использовали botva.dll: подготовили изображение со всеми состояниями, загрузили его в кнопку и получили готовый элемент.
Добавлена новая функция:
Позволяет извлекать иконки напрямую из ресурсов Windows и сторонних DLL/EXE с сохранением в PNG.code_language.pascal:function ExtractIconFromResource( const ModuleFile, OutFile: WideString; ResourceIndex: Integer; IconSize: Integer ): Boolean;
Поддерживаемые размеры зависят от конкретного ресурса и обычно включают:
16x16
32x32
48x48
64x64
128x128
256x256
Пример получения нескольких системных иконок из imageres.dll.mun:
code_language.pascal:Module := 'C:\Windows\SystemResources\imageres.dll.mun'; ImageIdx[1] := 31; ImageIdx[2] := 27; ImageIdx[3] := 103; ImageIdx[4] := 105; ImageIdx[5] := 175; ImageIdx[6] := 107; for i := 1 to 6 do begin ImageFile[i] := ExpandConstant('{tmp}\') + IntToStr(i) + '.png'; if ExtractIconFromResource(Module, ImageFile[i], ImageIdx[i], 64) then Image[i].LoadPicture(ImageFile[i], iwOriginal); end;
Добавлена функция захвата мыши для FMX-контролов.
code_language.pascal:procedure TFForm.SetCaptured(FControl: NativeInt); begin if FControl = 0 then Exit; TControlAccess(Pointer(FControl)).Capture; end;
После начала перетаскивания элемент продолжает получать события мыши, даже если курсор вышел за его границы.
Это позволяет без проблем перемещать панели, формы и другие элементы интерфейса.
Например, теперь можно создавать внутри главного окна собственные перемещаемые псевдо-окна и свободно перетаскивать их мышью по рабочей области.
Пример тут = cpi-v7
Добавлена возможность полностью кастомизировать процесс деинсталляции и использовать FMX-компоненты в окне удаления приложения.
Для этого достаточно заменить стандартные объявления функций:
на версии для деинсталлятора:code_language.pascal:function InitLayoutHandle: FLayout; external 'InitLayoutHandle@files:FMXBridge.dll stdcall delayload';
code_language.pascal:function InitLayoutHandleUn: FLayout; external 'InitLayoutHandle@{tmp}\FMXBridge.dll uninstallonly stdcall delayload';
Аналогично и для остальных компонентов (Form, Label, ProgressBar, Timer и т.д.).
Это позволяет сделать свое окно деинсталляции с любыми элементами FMX: надписями, прогресс-барами, индикаторами и другим оформлением.
Добавлен новый интерфейс FTile для работы с плитками.
Поддерживаются:
создание и удаление плиток;
позиционирование и выравнивание;
настройка размеров и отступов;
фоновые изображения;
цвет, рамка и скругление углов;
текст и параметры шрифта;
прозрачность и поворот;
обработка событий мыши;
работа с тегами и подсказками.
code_language.pascal:type FTile = interface(IUnknown) '{0669FD3A-DBAB-4AA9-890A-BC1BFD47EE09}' function FCreate(FParent: NativeInt): NativeInt; procedure Cursor(FCursor: TCursor); procedure Left(FLeft: Single); procedure Top(FTop: Single); procedure Height(FHeight: Single); procedure Width(FWidth: Single); procedure SetBounds(FLeft, FTop, FWidth, FHeight: Single); procedure Position(X, Y: Single); procedure Align(Al: TAlignLayout); procedure Margins(FLeft, FTop, FRight, FBottom: Single); procedure Padding(FLeft, FTop, FRight, FBottom: Single); procedure SetHint(const FText: WideString); procedure SetClipParent(FValue: Boolean); procedure SetClipChildren(FValue: Boolean); procedure BringToFront; procedure SendToBack; procedure SetTag(FTag: Integer); procedure TileColor(FColor: TAlphaColor); procedure TilePicture(const FImage: WideString; WrapMode: TWrapMode); procedure TileStrokeColor(FColor: TAlphaColor); procedure TileThickness(FThickness: Single); procedure TileCurve(XRadi, YRadi: Single); procedure Text(const FText: WideString); procedure FontSetting(const FontName: WideString; FontSize: Single; FontColor: TAlphaColor); procedure TextSetting(FHorzAlign, FVertAlign: TTextAlign); procedure TextBackColor(FColor: TAlphaColor); procedure TextColor(FontColor: TAlphaColor); procedure Opacity(FOpacity: Single); procedure RotationAngle(FValue: Single); procedure RotationCenter(X, Y: Single); procedure Enabled(FEnabled: Boolean); procedure Visible(FVisible: Boolean); procedure HitTest(FEnabled: Boolean); function IsVisible: Boolean; function GetText: WideString; function GetTag: Integer; function GetLeft: Single; function GetTop: Single; function GetHeight: Single; function GetWidth: Single; function GetObject: NativeInt; procedure OnClick(Event: TNotifyEvent); procedure OnMouseDown(Event: TMouseEventF); procedure OnMouseEnter(Event: TNotifyEvent); procedure OnMouseLeave(Event: TNotifyEvent); procedure OnMouseUp(Event: TMouseEventF); function Handle: NativeInt; end;
Интерфейс был запрошен пользователями (заморскими) достаточно давно, но до реализации руки дошли только сейчас.
![]()
Исправлено отображение миниатюры окна в панели задач на Windows 11 - ранее изображение могло выглядеть "размытым"/"сжатым" из-за некорректного расчёта клиентской области. Добавлена корректировка обработки с учётом системных границ окна, что устраняет искажения и обеспечивает более чёткий превью.
code_language.pascal:WM_NCCALCSIZE
Отключено применение акцентного цвета к заголовку окна в Windows 11. Ранее верхняя полоса автоматически окрашивалась в системный цвет. Теперь заголовок остаётся нейтральным.
code_language.pascal:DwmSetWindowAttribute(DWMWA_CAPTION_COLOR)
Улучшена загрузка и отображение иконки в FTitleBar. Ранее при использовании иконок большого размера они могли выглядеть "сжатыми" и пиксельными.
Теперь выбирается наиболее подходящий размер фрейма из .ico с учётом DPI, что в большинстве случаев даёт чёткое и корректное отображение без искажений.
code_language.pascal:Factory: IWICImagingFactory; Decoder: IWICBitmapDecoder; Frame: IWICBitmapFrameDecode; Converter: IWICFormatConverter;