1. Updated `FNewINI` class and `MINI.exe`
- Now reads and saves INI files in UTF-8 without BOM.
2. Updated `FCheckboxTree` class
- Added new properties; you may need to adjust your current scripts.
3. Compatibility with the Latest Windows Version
- Optimized for Windows 11 24H2.
- Compiled in RadStudio 12.2 (latest update).
4. Font Functions for Windows 11 24H2
* The following functions are incompatible with 24H2:
- `InstallFMXFont`
- `InvalidateFMXFont`
- `DeleteFMXFont`
* Use these alternative functions:
- `AddFontResource2`
- `RemoveFontResource2`
5. New Color Picker App Added
6. General Improvements and Bug Fixes.
For Members:
1. Source Code Reorganization
- Now uses unit scope names.
- Various units have been renamed for clarity.
2. The latest source code will be available in the coming days for members.
Added Custom Blueprints:
- FAdvancedMemo
- FAdvancedShape
- FAdvancedNotification
Deprecated:
- 'pWinNotification' has been removed.
- The example 'Example_WinNotifications.iss' has been removed.
Enhancements:
- Auto-Dark Mode: Added support for auto-dark mode in 'FCustomFluentWindow'.
- Updated Components:
- Updated all classes and custom blueprints.
- Updated gradient color settings.
- Updated 'MInI'.
- Updated 'xBass' plugin to the latest version.
- Updated 'WebView2' to the latest version.
- Error Handling: Improved error handling and messages.
- FMXInnoShutdown Function: Enhanced for a smoother exit.
- FMXInnoShutDownUn: Now defined by default in 'FMXInnoHandle.iss'.
- You need to remove it from your scripts.
Fixes:
- Fixed null pointer access errors.
- Fixed runtime errors reported by users and discovered during debugging.
- Fixed memory deallocation issues at exit.
Future Updates:
- Advanced 3D objects and 3D animations are planned for future releases.
Miscellaneous:
- Various other improvements and bug fixes.
Advanced Notification:
Refer to the attached examples for guidance on creating notifications with items, interacting with them, and updating them in real-time.
The code snippet is provided below:
code_language.pascal:procedure CsNotifyOnActivated(Sender: INotification; nArguments: WideString; nUserInput: INotificationUserInput); begin MemLog.Clear; if Sender = csNotification1.Handle then begin case nArguments of 'send' : MemLog.AddLine('* Send button clicked!'#13#10); 'ok' : MemLog.AddLine('* Ok button clicked!'#13#10); 'cancel' : MemLog.AddLine('* Cancel button clicked!'#13#10); '' : MemLog.AddLine('* Clicked on the content!'#13#10); else MemLog.AddLine('Args:'#9 + nArguments + #13#10); end; // Textbox input if csNotifyBuilder1.IsUserInputValueExist(nUserInput, 'txtbx_id1') then MemLog.AddLine('> Input Text:'#9#9'[' + csNotifyBuilder1.GetUserInputValueStr(nUserInput, 'txtbx_id1') + ']'); // Selectbox input if csNotifyBuilder1.IsUserInputValueExist(nUserInput, 'selbx_id1') then MemLog.AddLine('> Shutdown Timer:'#9'[' + csNotifyBuilder1.GetUserInputValueStr(nUserInput, 'selbx_id1') + ' Minutes]'); end; end;
Advanced Shapes:code_language.pascal:// Content csNotifyContent1.FCreate; //csNotifyContent1.Scenario(nsIncomingCall); csNotifyContent1.UseButtonStyle(True); // For Ok, Cancel button style. csNotifyContent1.Duration(ndLong); // Duration: [Short == 2 sec | Default == 5 sec | Long == 25 sec] csNotifyContent1.AddInputTextBox(csContentTextBox1.Handle); // Textbox csNotifyContent1.AddSelectionBox(csContentSelectBox1.Handle); // Selectbox csNotifyContent1.AddButton(csContentBtnSend.Handle); // Send Button csNotifyContent1.AddButton(csContentBtnCancel.Handle); // Cancel Button csNotifyContent1.AddButton(csContentBtnOk.Handle); // Ok Button csNotifyContent1.AddImage(csContentHeaderImage.Handle); // Header Image csNotifyContent1.AddImage(csContentAppImage.Handle); // App Image csNotifyContent1.AddText(csContentCaption1.Handle); // Caption csNotifyContent1.AddText(csContentDesc1.Handle); // Description csNotifyContent1.AddAudio(csContentAudio.Handle); // Audio // Notification csNotification1.FCreate(csNotifyContent1.Handle, csNotifyBuilder1.Handle); if not csNotification1.ParamIsValueExists('my_desc') then csNotification1.ParamSetValue('my_desc', sDesc); csNotification1.OnActivated(@CsNotifyOnActivated); // OnActivate csNotification1.OnDismissed(@CsNotifyOnDismissed); // OnDismissed csNotification1.OnFailed(@CsNotifyOnFailed); // OnFailed // Show Notification csNotifyBuilder1.ShowNotification(csNotification1.Handle);
- To create advanced graphic shapes, you'll need the corresponding SVG data for the shapes you wish to design. There're various methods to obtain SVG data, but i won't go into detail on that here.
- Ensure that you adjust and resize the SVG data to match your intended dimensions, as advanced shapes do not automatically handle this for you.
- You can use the simple tool 'TxtToDelphiStr.exe' to easily convert SVG data into Delphi/Inno strings.
For more information on SVG data, refer to the following links:
Below is a code snippet:
Screenshots:code_language.pascal:{ AdvancedShape } csShapeData := 'M 249.2615 123.1455' +#13#10+ 'c 18.9705 -33.9615 -4.257 -74.7495 -42.94 -78.602 l -14.116 -1.4065' +#13#10+ 'c -10.295 -1.0265 -19.491 -5.487 -27.1315 -14.064' +#13#10+ 'c -26.5925 -29.8475 -76.1095 -22.477 -92.41 13.382' +#13#10+ 'c -3.97 8.733 -11.149 15.719 -20.214 19.672 l -19.8865 8.67' +#13#10+ 'c -31.6995 13.82 -42.447 52.167 -22.424 79.5915 l 12.618 17.2815' +#13#10+ 'c 2.7405 3.754 4.741 7.9035 5.9465 12.333 l 6.266 23.0365' +#13#10+ 'c 8.5835 31.5575 44.3775 48.61 75.6205 35.3465 l 2.675 -1.1355' +#13#10+ 'c 7.9505 -3.3755 16.996 -4.1935 25.466 -2.308 l 41.024 9.1345' +#13#10+ 'c 39.9665 8.899 75.195 -25.787 66.27 -63.9125 l -5.192 -22.1755' +#13#10+ 'c -2.1015 -8.9765 -0.762 -18.39 3.772 -26.506 l 4.656 -8.3375 z'; csShape.FCreate(FMXForm.Handle); csShape.SetBounds(65, 80, 265, 260); csShape.Data_Str(csShapeData); csShape.Data_WrapMode(spwmOriginal); csShape.FillGradient($FF69EACB, $FF6654F1, gsLinear);
- Improvements in the code.
- Cleaned up the code a bit and removed duplications.
- More stable.
- This build could be more efficient than the previous one.
- Ensured compatibility with Windows 11 24H2.
- Added a new class to deal with INI files.
- Now you can handle even complex INI files more easily.
- Check the example in the attachment.
- Added a new class for All-in-One array.
- Now you can have multiple data types in one array.
- Supports 11+ data types by default.
- More data types will be added upon request.
- Easy to manipulate.
- Check the example in the attachment.
- Updated FLogicalDrives class.
- Added a new property called 'Disk Name'.
- Check out the 'Example_LogicalDrives.iss'.
- Updated FXStream.
- FXPckr can hold InnoSetup's encrypted password.
- Updated encryption.
- Fixed minor bugs related to FCreateFXStream.
- This version doesn't support previous versions.
- Updated FCheckboxTree class.
- Now, the OnChange events of checkboxes are handled automatically by the FMXInno internally.
- To override it and have manual OnChange events, you have to call 'OverrideDefaultOnChangeEvent'. eg: Pg4ChkbxTree.OverrideDefaultOnChangeEvent;
- Updated WebView2 class.
- Updated license agreement.
FMXInno hangs on Taskbar
Now we've evidence that the main cause of this issue is the custom font. Generally, I use the following three functions to install custom fonts into the installer:
1. InstallFMXFont
2. DeleteFMXFont
3. InvalidateFMXFont
Instead of using these three functions, try the following functions for custom fonts for now:
1. AddFontResource2
2. RemoveFontResource2
I've updated the examples, so you can check them out to see how to use these functions.
Thanks to @tihiy_don for conducting some tests on this.
Added the FColorComboBox class.
Prevented forms from being resized.
Added the following new functions:
IsLightFMXColor:code_language.pascal:function IsValidVCLColor(const AColor: TColor): Boolean; function IsValidFMXColor(const AColor: TAlphaColor): Boolean; function IsLightFMXColor(const AColor: TAlphaColor): Boolean; function IsLightVCLColor(const AColor: TColor): Boolean;
in some cases, 'IsLightFMXColor' is useful for determining the font colors based on the background color or background image color. here's how it can be used:code_language.pascal:procedure ClrBxOnChange(Sender: TObject); var CtrlClr: TAlphaColor; begin CtrlClr := AClrBx.GetColor; if IsLightFMXColor(CtrlClr) then AText.Color(ALBlack) else AText.Color(ALWhite); ARect.FillColor(CtrlClr); end;
code_language.pascal:function DesktopImgExist: Boolean; function GetDesktopImgColorFMX: TAlphaColor; function GetDesktopSolidColorFMX: TAlphaColor; function GetImgColorFMX(const Image: UnicodeString): TAlphaColor; function GetImgPartColorFMX(const Image: UnicodeString; const PixelX, PixelY, PixelW, PixelH: Single): TAlphaColor;
UWP Tile Selection:
- Added two methods to the UWP class that select a specific UWP tile.
- Now supports FluentBlendedColor option in other forms as well (CustomForm, Dir/Start Form).
- Added missing method 'SetApplicationIconFromFXStream' to the 'FWinTitleBar' class.
Example:code_language.pascal:procedure TileSelect(ATile: LongInt); procedure TileSelectEx(ATile: LongInt; MouseOverColor: TAlphaColor);
How to update:code_language.pascal:UWPTiles.TileSelect(Tile[5]); UWPTiles.TileSelectEx(Tile[5], ALRed);
1. Download the latest update from the first post.
2. Replace the 'FMXInno.dll' and 'FMXInnoHandle.iss' with the provided ones.
* This update will extend from FMXInno Dev [2023-Mar-15].
- Make sure to refer to the last previous changelog to check out the new changes.
Hola everyone,
This is the FMXInno official development library, encompassing all features. my intention with this update is to address known issues so far. therefore, i need your assistance in testing it, especially in this development build. i intend to ensure the correct behavior of forms, including proper scaling and positioning.
1. Note: This is in the development stage and not recommended for use in production.
2. Don't forget to share your feedback and feel free to report any bugs you discover.
Information:
1. Rewrote some core/fundamental code, including forms, etc.:
-- Ensures correct scaling and positioning of forms and FMX objects.
-- All forms will now be centered on the screen.
-- Disabled file size reduction tricks and temporary memory management.
-- Replaced all animations with TAnimator for better performance.
-- Some features (e.g., MinimizeWindowCustomAnimated) have been deprecated due to issues; they can still be called but will have no effect.
-- NewScaller is no longer part of FMXInno, so make sure to remove all related functions (NS, NSS, etc.) from your scripts.
-- The new FForm will be slightly shorter in width/height as the extra frame width is not added to it.
-- When testing with higher DPI values and using .style files, ensure the .style file is HigherDPI-Aware.
-- Some features may not function properly on older systems like Windows 7. Since many developers, including Microsoft, have ceased support for outdated systems, my priority is to ensure compatibility with currently active systems such as Windows 10 and Windows 11.
-- Additionally, there's no guarantee that any issues encountered through virtual machines (VMware, etc.) will be resolved.
-- For 'FCustomPage', use 'Page#.Visible(False)' in 'FMXDesigning' to avoid visibility of all pages at setup startup.
Example:
2. Rewrote some fluent effects code:code_language.pascal:procedure FMXDesigning; begin {...} Page1.FCreate(FMXForm.Handle); Page1.Visible(False); {...} Page2.FCreate(FMXForm.Handle); Page2.Visible(False); {...} end;
-- Ensures FluentForms react only to system color mode (light/dark) changes.
-- 'SetActiveThemeModeAwareness' will be ignored if the form is minimized.
3. Download the attachment below and perform tests under the following conditions:
OS:
- Windows 11
- Windows 10
- Windows 8 / 8.1 ( Optional )
- Windows 7 ( Optional )
DPI:
- 100%
- 125%
- 150%, etc.
4. Also, test with your own scripts:
-- Replace your current 'FMXInno.dll' and 'FMXInnoHandle.iss' with the provided ones.
5. Some users have reported that it takes a bit of time to compile their scripts. this is because it takes time to read the default 'FMXInnoHandle.iss', which contains declarations of all features. if you have enough experience to deal with it, you can remove unused code from it for your specific script, which may help.
FMXInno Form Types:
1. Normal Form:
-- This is just an FMX layer; you can create any FMX object over it.
-- You can still see through and access every InnoSetup object as this is a layer.
2. Blank Form:
-- A standard FMX form filled with a solid color or an image by default.
3. Fluent Form / Fluent Color Form / Fluent Null (no-color) Form:
-- FMX forms that have enabled Windows Fluent (or Acrylic/Aero) effects by default.
4. Gradient Form:
-- A standard FMX form filled with a gradient color by default.
5. Image Form:
-- An FMX form based on an image (form has the same shape as the image).
6. Background image scrolling Form:
-- An FMX form that has a scrolling image background according to mouse movements.
Scaling:
1. Note that there's no guarantee for any custom scaling value for correct scaling (see first screenshot).
2. Make sure to use only the values supported by your display (see second screenshot).
- This is also a standard Fluent Form, but this new form will blend with the Windows colors (Accent or Desktop Image) along with standard Fluent colors.
- Added a new Fluent Form (FluentBlendedColor).
- The reason for this new form is for Fluent forms to have a more realistic and modern look.
- Supports both Dark/Light modes and custom color mode.
- Also supports some possible customizations.
- Check out the screenshots to see the differences between standard Fluent forms at standard opacity level (Opacity = 0.56).
- Rendering engine: Image32
- Added built-in SVG image support.
- Custom Application Icon instead of the default one.
- Windows title bar is now more customizable.
- Titlebar Color.
- Button Colors.
- Titlebar Background Effects, and so on.
- SKIA and Blend2D are now optional.
- SKIA and Blend2D are optional from now on because they require external dependencies (sk4d.dll, blend2d_win32.dll).
- You can still have them, but you have to download them manually.
- Image32 will take the place of SKIA and Blend2d from now on, especially because it does not require external dependencies and has average performance compared to SKIA and Direct2D.
- Added Image32 - 2D Graphic Library.
- Image32 is not enabled by default for public use; for now, it's for my personal use only (because i'm pretty sure no one will use it directly in their projects. )
- More info about Image32: Image32 is a 2D graphics library
- Removed unwanted plugins from the directory.
- Added new properties for classes.
- More bug fixes and improvements.
- Plugin folder has been cleaned up.
- Re-compiled all the plugins to make sure everything is up to date.
- Now the default compression will be 'lzma2/ultra64'.
- All the examples have been revised.
- Also, added new examples.
- Extended support for Windows 11 24H2.
code_language.pascal:function FCreateFluentBlendedColor(WParent: HWND; DarkTheme, NoBorder: Boolean; Opacity: Single; BrightnessPct: Byte; BlendColorMode: TBlendColorMode): HWND; function FCreateFluentBlendedColorEx(WParent: HWND; DarkTheme, NoBorder: Boolean; Opacity: Single; BrightnessPct: Byte; BlendColorMode: TBlendColorMode; BlendColorLvl: Integer): HWND; function FCreateFluentBlendedColorEx2(WParent: HWND; VCLColor: TColor; DarkTheme, NoBorder: Boolean; Opacity: Single; BrightnessPct: Byte; BlendColorLvl: Integer): HWND;
- Merged FMXInno Dev into this.
- Updated ISArcEx to the latest version.
- Made some improvements and bug fixes.
- This update addresses most of the previous issues.
- Added Radiant Shapes.
- Introduced new properties to classes.
- WinTitleBar will now display the application icon by default.
- Not compressed by default.
- No Exe compressor or file reduction tricks were used.
- Implemented new functions.
1. Integrated all updates up to this point.
2. Removed FMXInno's memory (RAM) truncation.
3. Fixed issues with invalid handles and owners.
4. Resolved some memory leaks.
5. Addressed previously encountered issues.
6. Implemented various improvements.
7. Updated all examples to Inno Setup 6.2.2.
8. Compiled with RadStudio 12 Athens + Patch 01.
9. This build is free from false positive trojans.
What's new:
1. FMXInno WebView2:1. Added FMXInno WebView2 custom class.
2. Updated HTML text (updated _HTML-Syntax.txt).
3. Updated ISArcExCleanUp.
4. Added a simple tool (Installer Template Generator).
5. Addressed known issues.
6. Quality fixes and improvements.
2. Installer Template Generator:1. Support for the latest Windows 10 and Windows 11 only.
-- This requires the WebView2 Runtime package.
-- Alternatively, download it manually: Microsoft Edge WebView2
2. Support for HTML 5.
3. FWebview is always on top of all other controls, just like the FVideoPlayer.
Therefore, it's better to create this on an FCustomFluentWindow in real use.
1. A simple tool to generate installer templates.
- The script will include all the fundamental functions that the installer requires.
* Added new functions:
-- function wGetRecycleBinInfo(ARootPath: WideString; var TotalSizeMB: Extended; var FileCount: Integer): Boolean;
-- function wCopyToClipboard(const AStr: WideString): Boolean;
-- function wPasteFromClipboard: WideString;
* Updated FForm class.
* Updated FluentApi (Internal + External).
-- Make sure to update your current scripts as follows:
function EnableFluent(const WinHandle: HWND; DarkTheme, NoBorders, NoTitleBar: Boolean; Opacity: Single; BrightnessPct: Byte): Integer;
external 'EnableFluent@{tmp}\FluentApi.dll stdcall uninstallonly delayload';
to
function EnableFluent(const WinHandle: HWND; DarkTheme, NoBorders, NoTitleBar: Boolean; Opacity: Single; BrightnessPct: Byte): Integer;
external 'faC1222296@{tmp}\FluentApi.dll stdcall uninstallonly delayload';
* Updated ISArcEx (Internal + External).
-- Added a new method:
> ISArcExIsSuspended.
-- The following methods have been renamed and updated:
> Suspend/Resume Proc, ChangeLanguage.
* Updated Botva2-like classes:
-- FPictureButton2, FPictureVisiblePart, FPictureProgressBar, and FPictureTrackBar.
* Some improvements and bug fixes.