FMXBridge для Inno Setup (внутренний проект)

DLL FMXBridge для Inno Setup (внутренний проект) 13.03

Нет прав для скачивания
В DLL добавлена поддержка Skia - современной 2D графической библиотеки. Она используется для качественного рендеринга текста, изображений и анимаций. Теперь часть возможностей Skia можно использовать прямо из Inno Setup через FMX-форму.

Добавлен компонент SkLabel. Это текстовый элемент, который позволяет выводить текст с разными стилями внутри одной строки. Можно менять шрифт, размер, цвет, толщину, наклон, добавлять подчеркивание и другие эффекты для отдельных слов. Поддерживаются emoji и пользовательские шрифты. На отдельные слова можно назначать события, например обработчик клика.

Добавлена функция установки пользовательских шрифтов через InstallSkiaFonts, поэтому можно использовать шрифты, которые не установлены в системе.

Появились графические компоненты SkAnimatedImage и SkAnimatedPaintBox. Первый используется для воспроизведения анимированных изображений с управлением циклом, скоростью и режимом масштабирования. Второй предназначен для отрисовки анимированной графики и шейдерных эффектов.

Также добавлен компонент SkSvg для отображения SVG-графики. Поддерживается масштабирование, разные режимы размещения, перекрашивание SVG и режим grayscale.

Обновлены существующие примеры и добавлены новые примеры использования Skia-компонентов.
code_language.pascal:
function sk4d_codec_make_from_file(const file_name: PAnsiChar): THandle;
  external 'sk4d_codec_make_from_file@files:sk4d.dll cdecl';

function InitSkLabelFontStyle: FSkLabelFontStyle;
  external 'InitSkLabelFontStyle@files:FMXBridge.dll stdcall delayload';

function InitSkLabel: FSkLabel;
  external 'InitSkLabel@files:FMXBridge.dll stdcall delayload';

function InitSkAnimatedPaintBox: FSkAnimatedPaintBox;
  external 'InitSkAnimatedPaintBox@files:FMXBridge.dll stdcall delayload';

function InitSkAnimatedImage: FSkAnimatedImage;
  external 'InitSkAnimatedImage@files:FMXBridge.dll stdcall delayload';

function InitSkSvg: FSkSvg;
  external 'InitSkSvg@files:FMXBridge.dll stdcall delayload';

procedure InstallSkiaFonts(FontFile: WideString);
  external 'InstallSkiaFonts@files:FMXBridge.dll stdcall delayload';


1.png

2.png

3.png

4.png

5.png
1. Копирование, перемещение файлов (функция по запросу)
При отмене или удалении вернуть всё в зад одной строкой. По маске.
code_language.pascal:
function CopyFiles(const SourceDir, DestDir, Masks: WideString; Overwrite: Boolean): Integer;
  external 'CopyFiles@files:FMXBridge.dll stdcall delayload';

function MoveFiles(const SourceDir, DestDir, Masks: WideString; Overwrite: Boolean): Integer;
  external 'MoveFiles@files:FMXBridge.dll stdcall delayload';

2. Добавлено FCreateSplashForm (изображение, звук, длительность), Border/BorderSetting, Show и Handle.
code_language.pascal:
type
  FSplashForm = interface(IUnknown)
    '{DC82CE70-46BF-44F7-8137-2C1D6D45444F}'
    function FCreateSplashForm(const FImageFile, FSoundFile: WideString; FDuration: Single): HWND;
    procedure Border(FValue: Boolean);
    procedure BorderSetting(FRound: Boolean; FColor: TAlphaColor);
    procedure Show;
    function Handle: NativeInt;
  end;

3. Добавлено FMarquee (бугущая строка): методы создания и управления бегущей строкой (позиция, размеры, выравнивание, отступы, подсказка, текст, шрифт, цвет, скорость, направление, видимость, прозрачность, вращение, включение/выключение, порядок на форме, тег, события мыши), а также метод Handle.

Все примеры прилагаются.

  • Like
Реакции: Giperson
1. Получить путь/имя текущего рабочего фона рабочего стола
code_language.pascal:
function GetDesktopImg: WideString;
  external 'GetDesktopImg@files:FMXBridge.dll stdcall delayload';

2. Получить "средний" цвет из изображения (FMX)
code_language.pascal:
function GetImgColor(const AImage: UnicodeString): TAlphaColor;
  external 'GetImgColor@files:FMXBridge.dll stdcall delayload';

3. Диалог выбора папок
code_language.pascal:
function BrowseDialog(Owner: HWND; const Caption: WideString; var InDir: WideString; var OutDir: WideString): Boolean;
  external 'BrowseDialog@files:FMXBridge.dll stdcall delayload';

4. Диалог открытия файла
code_language.pascal:
function OpenDialog(Owner: HWND; const Caption, DefExt, Filter, InitialDir: WideString; var FileName: WideString): Boolean;
  external 'OpenDialog@files:FMXBridge.dll stdcall delayload';

5. Диалог сохранения файла
code_language.pascal:
function SaveDialog(Owner: HWND; const Caption, DefExt, Filter, InitialDir: WideString; var FileName: WideString): Boolean;
  external 'SaveDialog@files:FMXBridge.dll stdcall delayload';

6. Чтение текста из файла
code_language.pascal:
function ReadAllText(const FileName: WideString; out FText: WideString): Boolean;
  external 'ReadAllText@files:FMXBridge.dll stdcall delayload';

7. Запись текста в файл (перезапись)
code_language.pascal:
function WriteAllText(const FileName, FText: WideString): Boolean;
  external 'WriteAllText@files:FMXBridge.dll stdcall delayload';

8. Добавление текста в конец файла
code_language.pascal:
function AppendAllText(const FileName, FText: WideString): Boolean;
  external 'AppendAllText@files:FMXBridge.dll stdcall delayload';

Добавлено:
# FireMonkey FMX: Property Animations and Triggers (Full List)

Примеры:

code_language.pascal:
    TObject(TESTEdit.GetSearchBtnObject):
    begin
      if OpenDialog(FMXForm.HandleHWND, 'Выберите том', 'bin', 'BIN файлы|*.bin', 'C:\', FileName) then
      begin
        MsgBox('Выбран том: ' + FileName, mbInformation, MB_OK);
      end;
    end;

    TObject(TESTButton.GetObject):
    begin
      OldDir:= ExpandConstant('{sd}');

      if BrowseDialog(FMXForm.HandleHWND, 'Выбор папки установки', OldDir, NewDir) then
      begin
        WizardForm.DirEdit.Text:= NewDir;
        TESTEdit.Text(WizardForm.DirEdit.Text);
      end;
    end;

    TObject(TESTPressedButton.GetObject):
    begin
      TextToSave := 'Пример текста для сохранения';

      if SaveDialog(FMXForm.HandleHWND, 'Сохранить текстовый документ', 'txt', 'Текстовые документы|*.txt', 'C:\', FileName) then
      begin
        if WriteAllText(FileName, TextToSave) then
          MsgBox('Файл успешно сохранён в: ' + FileName, mbInformation, MB_OK)
        else
          MsgBox('Не удалось сохранить файл: ' + FileName, mbError, MB_OK);
      end;
    end;
1. В обновлении исправлена проблема, из-за которой окно могло некорректно восстанавливаться после сворачивания в Windows 10.
Причиной оказалось служебное message-окно FMX (ApplicationHWND), которое перехватывало управление состояниями окна. Теперь используется
code_language.pascal:
SetParent(ApplicationHWND, HWND_MESSAGE)
что убирает влияние на сворачивание и разворачивание.

2. Добавлен альтернативный режим создания формы для Windows 10.
Теперь при создании окна может использоваться эффект размытия фона
code_language.pascal:
(Accent.AccentState := ACCENT_ENABLE_BLURBEHIND)
Это улучшает внешний вид и повышает совместимость в системах, где эффекты Mica, Tabbed и Acrylic не поддерживаются или не работают.

3. Добавлено обновление для установки цвета рамки окна через
code_language.pascal:
DwmSetWindowAttribute (DWMWA_BORDER_COLOR)
На Windows 10 этот параметр игнорируется.

76.png

43.jpg
  • Like
Реакции: MarsBar
Исправлена проблема с фокусом: форма больше не теряет его в пользу Inno Setup при запуске.
Восстановлена стандартная системная анимация сворачивания.

1. В новой версии убраны все псевдотипы (TFMXObject, IForm и т.п.).
Теперь используется только один универсальный тип — NativeInt.
22.jpg
Не нужно объявлять десятки фиктивных типов в Inno Setup.
2. Исправлено - FShadowText
3. Запросы - (Обратная связь) Теперь при попытке открыть медиафайл, который не поддерживается, вместо пустого Exception появляется сообщение:
54.png

4. Форма теперь независимая от Inno Setup; кнопка "Свернуть" минимизирует напрямую через HWND.
code_language.pascal:
    TObject(TitleBar.GetObjectMinBtn):
    begin
      MinimizeWindow(FMXForm.HandleHWND);
//      MinimizeWindow(WizardForm.Handle);
    end;
1. Изменил возвращаемый тип функций с LongInt на HWND, потому что так правильно с точки зрения Delphi.
code_language.pascal:
type
  FForm = interface(IUnknown)
    '{C1EF3F26-12BF-421C-9AAC-4FFB9E9D72A1}'
    function FCreateMicaForm(WParent: HWND; FDark, Round: Boolean): HWND;
    function FCreateTabbedForm(WParent: HWND; FDark, Round: Boolean): HWND;
    function FCreateAcrylicForm(WParent: HWND; FDark, Round: Boolean): HWND;
    function FCreateBlankForm(WParent: HWND; FColor: TAlphaColor; const FImage: WideString; Round: Boolean): HWND;
    function FCreateImageForm(WParent: HWND; FColor: TAlphaColor; const FImage: WideString; Opacity: Boolean): HWND;
    function FCreateGradientForm(WParent: HWND; FColor1, FColor2: TAlphaColor; FStyle: TGradientStyle; Round: Boolean): HWND;
2. Теперь окно поддерживает обновление миниатюры в панели задач в реальном времени.
Ранее миниатюра была пустой, теперь отображается текущее содержимое окна.
3. Восстановлена анимация сворачивания в панель задач.

45.jpg
Тестирование ещё требуется
Добавлено - загрузка файлов

Позволяет скачивать файлы с отображением прогресса и скорости, с возможностью остановки через колбэк или глобально через AbortAllDownloads. Поддерживает последовательную загрузку нескольких файлов, обновление интерфейса через TDownloadCallback и сохраняет данные напрямую в файл через THTTPClient.

Пример
code_language.pascal:
var
  Url, FileName: WideString;
begin
  Url := 'https://example.com/file.zip';
  FileName := 'C:\Downloads\file.zip';

  DownloadFile(Url, FileName,
    function(const Url, LocalFileName: WideString;
             const ProgressCurrent, ProgressMax, SpeedKBps: Int64): Boolean
    begin
      // Обновляем прогрессбар и текст
      ProgressBar.Value := ProgressCurrent;
      ProgressText.Text := Format('%d%% (%d KB/s)', [ProgressCurrent * 100 div ProgressMax, SpeedKBps]);
      Result := False; // вернуть True, чтобы остановить загрузку
    end);
end;

Вложения

  • 3.png
    3.png
    84.5 KB · Просмотры: 13
Добавлено:
  • Для FCheckBoxTree — двустороннее управление чекбоксами секции (главный ↔ дочерние, включая радиокнопки).
  • Для FSpeedButton — процедура Pressed(FValue: Boolean), гарантирует, что кнопка визуально выглядит нажатой при старте.
Назад
Сверху