PDA

View Full Version : FMXInno - Windows Fluent Design Installer UI for Inno


Pages : 1 2 [3]

BLACKFIRE69
07-01-2024, 16:12
StatusLB.Text(GoogleTranslate('WelcomeToInstallati on', 'en', 'en'));


yes it seems like it's working without spaces, (hey Google, what the f*ck? :p),


but we cannot use it that way. i just updated the Google API, and now it works.


.

BLACKFIRE69
07-01-2024, 17:00
Then one more counter question. how do I get the correct geocode from the system from where the installer is launched consisting of only two letters, that is, the language code, these functions, in my opinion, do not cause it, but only the full name of the country? = ISO-639
function GetUILanguage: Integer;
function wGetUserCountryName: WideString;
external 'wGetUserCountryName@files:FMXInno.dll stdcall delayload';


function wGetUserUILanguageISO639: WideString;

BLACKFIRE69
10-01-2024, 05:37
@Tihiy_Don,

- Updated FToggleCheckBox.FontColor method.

Tihiy_Don
10-01-2024, 10:15
@Tihiy_Don,

- Updated FToggleCheckBox.FontColor method.

Thanks, everything is working as it should now.

BLACKFIRE69
12-01-2024, 00:36
The FMXInno Dev is getting new features daily. guys, i need your thoughts on the following specific features, as some of them are extra features and may not be necessary for every user in our FMXInno community. if you want these features in the final release, let me know.


1. Desktop Widgets:
* Similar to MacOS Sonoma, these widgets will be positioned on the active desktop,
not on the installer interface.

-- Includes CPU / RAM / DISK / Network / Battery usage.
-- Temperature.

-- (The weather widget is currently in the development stage, not fully finished)

-- Clock (available in both Digital and Analog).
-- Image gallery slideshow.
-- Installation status: Remaining / Elapsed time, Installing speed, etc.
-- Users can create custom widgets as desired.
-- Fully customizable.



2. Co-Pilot sidebar Panel:
* Similar to Windows Co-pilot, Co-pilot sidebar will be shown in an extended space of
the installer on the left or right. meaning, the installer will automatically be
resized (expanded/collapsed) when the Co-pilot side-bar is activated/deactivated.

-- Powered by GPT-3.5 Turbo (paid users can use GPT-4 +).
-- DALL-E is not yet available (even for paid users).

-- Ability to define custom error codes or grammar queries for the corresponding
installer. so, the Co-pilot will describe these errors or specific statuses and
recommend suggestions when the user asks about them.

-- By default, an animated image/button (like Apple's Siri) will indicate the
Co-pilot on the installer until the user changes it.

-- Fully customizable.


.

Masquerade
12-01-2024, 01:42
@Blackfire69
They look AWESOME. Such modern style features.

Behnam2018
18-01-2024, 05:15
Hi audiofeel Thank you very much for your 👌

BLACKFIRE69
22-01-2024, 02:10
FMXInno - Installer template


-- A common question that the FMXInno community always asks is whether there's a tutorial or guidance to create their own installer from scratch using FMXInno. however, there's currently no such tutorial because there're many areas to cover for beginners, making it a challenging task.

-- A possible and effective solution, i believe, is to provide a common template. this way, people can use it as a base and make changes on top of it until they gain enough experience to build their own installer.

-- Take the following provided script as the template; i've tried to keep everything simple and included average features to match modern styles. also, study the examples included in the attachment to the first post for more information.

-- If you've any questions or if anything is unclear, feel free to ask me or the FMXInno community. we'd be happy to help you.


Features:

* Splash: Static png
* Music: Equalizer
* Taskbar: Preview / Progress
* Buttons: Botva2-Like
* ProgressBar: DotGauge / Botva2-Like / ThinProgressBar

* Installer: Background image
* Browse Dir: Fluent UI
* Uninstaller: Background image

* Shortcut: Desktop / StartMenu
* ISArcEx: Srep+lolz



.

BLACKFIRE69
23-01-2024, 09:17
i've added two new functions to retrieve the build date of the FMXInno library. i hope they'll be helpful in some cases.

function wGetFMXInnoBuildDate: Integer;
procedure wGetFMXInnoBuildDateEx(var YearW, MonthW, DayW: Word);


1. Method - 01

function FMXInnoBuildDate_1: String;
var
YearW, MonthW, DayW: Word;
begin
wGetFMXInnoBuildDateEx(YearW, MonthW, DayW);

Result := Format('Build Date: %d-%d-%d', [YearW, MonthW, DayW]);
end;


2. Method - 02

function FMXInnoBuildDate_2: String;
var
YearW, MonthW, DayW: Word;
EncodedDate: Integer;
begin
EncodedDate := wGetFMXInnoBuildDate;

YearW := EncodedDate shr 9;
MonthW := (EncodedDate shr 5) and $0F;
DayW := EncodedDate and $1F;

Result := Format('Build Date: %d-%d-%d', [YearW, MonthW, DayW]);
end;


.

hitman797
24-01-2024, 13:53
@BLACKFIRE69, can you add these two events to the form object.
FForm:

procedure OnActivate(Event: TNotifyEvent);
procedure OnDeactivate(Event: TNotifyEvent);

BLACKFIRE69
24-01-2024, 19:11
@BLACKFIRE69, can you add these two events to the form object.
FForm:

procedure OnActivate(Event: TNotifyEvent);
procedure OnDeactivate(Event: TNotifyEvent);




these two events don't get triggered for 'FForm', so nothing will change with these two events, and they'll never get triggered.

BLACKFIRE69
26-01-2024, 23:11
Modern FitGirl Installer for Windows 11+


How would it look if FitGirl's installer is created in 2024 and specifically targeted Windows 11+?

Let's give a modern look to a classic interface and compare it with modern styles.

What's new:

* Nothing new; i just gave a retouch to the classic interface.

Notes:

* This is just a concept, not for general use. if you need the complete script with all the features, let me know.
* Remember to change 'Opacity' as you prefer in your case.


; Setup: Theme
#define Opacity "0.0" /* Opacity Level: <0.0> to <1.0> */



.

BLACKFIRE69
01-02-2024, 12:20
FMXInno Final Release: [2024-Jan-31]




New update uploaded to first post, check it out.



What's new:

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.


1. FMXInno WebView2:

1. Support for the latest Windows 10 and Windows 11 only.

-- This requires the WebView2 Runtime package.
-- Alternatively, download it manually: Microsoft Edge WebView2 (https://developer.microsoft.com/en-us/microsoft-edge/webview2/?form=MA13LH#download-section)

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.


https://i.ibb.co/FsGLSKk/0r.pnghttps://i.ibb.co/h8q26Ry/00r2.png







2. Installer Template Generator:

1. A simple tool to generate installer templates.

- The script will include all the fundamental functions that the installer requires.



.

Tihiy_Don
07-02-2024, 08:43
Maybe it will be useful to someone.
Automatically set the unpacking parameters depending on the amount of RAM:

function GetRamMemory: Integer;
var i: Integer;
s: String;
begin
s:=MbOrTb(RamInfo.TotalRam, 0);
for i:=length(s) downto 1 do
if not (s[i] in ['0','1','2','3','4','5','6','7','8','9']) then delete(s,i,1);

Result:=StrToInt(s);
end;

procedure CurStepChanged(CurStep: TSetupStep);
var
XValue, LRamValue, LCpuValue, SValue: String;
begin
case GetRamMemory of
0..2:
begin
XValue:= 't4';
SValue:= '512mb';
LRamValue:= '512mb';
LCpuValue:= '4';
end;
3..4:
begin
XValue:= 't4';
SValue:= '768mb';
LRamValue:= '768mb';
LCpuValue:= '4';
end;
5..6:
begin
XValue:= 't45p';
SValue:= '1024mb';
LRamValue:= '1024mb';
LCpuValue:= '4';
end;
7..8:
begin
XValue:= 't65p';
SValue:= '1536mb';
LRamValue:= '1536mb';
LCpuValue:= '4';
end;
9..12:
begin
XValue:= 't75p';
SValue:= '2064mb';
LRamValue:= '2064mb';
LCpuValue:= '4';
end;
13..16:
begin
XValue:= 't85p';
SValue:= '20%';
LRamValue:= '50%';
LCpuValue:= '6';
end;
17..32:
begin
XValue:= 't85p';
SValue:= '40%';
LRamValue:= '40%';
LCpuValue:= '6';
end;
33..150:
begin
XValue:= 't85p';
SValue:= '40%';
LRamValue:= '40%';
LCpuValue:= '6';
end;
end;

if CurStep = ssInstall then
begin
ISArcExCancel:= 0;
ISArcExDiskCount:= 0;
ISArcDiskAddingSuccess:= False;
ISArcExError:= True;

ExtractTemporaryFile('Russian.ini');
ExtractTemporaryFile('unarc.dll');
ExtractTemporaryFile('arc.ini');
ExtractTemporaryFile('cls.ini');
ExtractTemporaryFile('Facompress.dll');

#ifdef xtool_zlib
ExtractTemporaryFile('zlibwapi.dll');
ExtractTemporaryFile('xtool.exe');
if IsWin64 then
begin
SetIniString('External compressor:xtool', 'unpackcmd', ' "xtool" d:precomp:' + XValue + ' - - <stdin> <stdout>', ExpandConstant('{tmp}\arc.ini'));
end else
begin
SetIniString('External compressor:xtool', 'unpackcmd', ' "xtool" d:precomp:' + XValue + ' - - <stdin> <stdout>', ExpandConstant('{tmp}\arc.ini'));
end;
#endif

#ifdef srep
ExtractTemporaryFile('cls-srep.dll');
if IsWin64 then
begin
ExtractTemporaryFile('cls-srep_x64.exe');
SetIniString('Srep', 'Memory', SValue, ExpandConstant('{tmp}\cls.ini'));
end else
begin
ExtractTemporaryFile('cls-srep_x86.exe');
SetIniString('Srep', 'Memory', SValue, ExpandConstant('{tmp}\cls.ini'));
end;
#endif

#ifdef lolz
ExtractTemporaryFile('cls-lolz.dll');
if IsWin64 then
begin
ExtractTemporaryFile('cls-lolz_x64.exe');
SetIniString('lolz', 'MaxThreadsUsage', '4', ExpandConstant('{tmp}\cls.ini'));
SetIniString('lolz', 'MaxMemoryUsage', LRamValue, ExpandConstant('{tmp}\cls.ini'));
end else
begin
ExtractTemporaryFile('cls-lolz_x86.exe');
SetIniString('lolz', 'MaxThreadsUsage', '4', ExpandConstant('{tmp}\cls.ini'));
SetIniString('lolz', 'MaxMemoryUsage', LRamValue, ExpandConstant('{tmp}\cls.ini'));
end;
#endif
....

BLACKFIRE69
08-02-2024, 00:11
Maybe it will be useful to someone.
Automatically set the unpacking parameters depending on the amount of RAM:


function GetRamMemory: Integer;
var i: Integer;
s: String;
begin
s:=MbOrTb(RamInfo.TotalRam, 0);
for i:=length(s) downto 1 do
if not (s[i] in ['0','1','2','3','4','5','6','7','8','9']) then delete(s,i,1);

Result:=StrToInt(s);
end;

procedure CurStepChanged(CurStep: TSetupStep);
var
XValue, LRamValue, LCpuValue, SValue: String;
begin
case GetRamMemory of
0..2:
begin
XValue:= 't4';
SValue:= '512mb';
LRamValue:= '512mb';
LCpuValue:= '4';
end;
3..4:
begin
XValue:= 't4';
SValue:= '768mb';
LRamValue:= '768mb';
LCpuValue:= '4';
end;

// ....
end;



how about this way? i think it's more convenient.


procedure _GetMeRAMInGB;
var
MyRamInGB: Integer;
begin
// Note: ARamUsage.TotalRam --> Total RAM in MB.

MyRamInGB := Round(ARamUsage.TotalRam / 1024); // 0, 1, 2, 3, ....

case MyRamInGB of
0..2:
begin
MsgBox('RAM: 0..2 GB', mbInformation, MB_OK);
end;

3..4:
begin
MsgBox('RAM: 3..4 GB', mbInformation, MB_OK);
end;

// ....

else
begin
MsgBox('Are you sure you really have RAM installed? ;)', mbError, MB_OK);
end;
end;
end;

Tihiy_Don
08-02-2024, 01:58
how about this way? i think it's more convenient.


procedure _GetMeRAMInGB;
var
MyRamInGB: Integer;
begin
// Note: ARamUsage.TotalRam --> Total RAM in MB.

MyRamInGB := Round(ARamUsage.TotalRam / 1024); // 0, 1, 2, 3, ....

case MyRamInGB of
0..2:
begin
MsgBox('RAM: 0..2 GB', mbInformation, MB_OK);
end;

3..4:
begin
MsgBox('RAM: 3..4 GB', mbInformation, MB_OK);
end;

// ....

else
begin
MsgBox('Are you sure you really have RAM installed? ;)', mbError, MB_OK);
end;
end;
end;
It's more convenient, yes. I did this because I thought that it could only be done through the MbOrTb function and asked about it in the FMX Q&A topic, but I never got an answer, so I did and already released a repack on the torrent tracker, the main thing is that it works.

I was not afraid to make it on FMX and release it, I even worked on supporting 32-bit machines.

Tihiy_Don
08-02-2024, 01:59
If it comes to that, then you can do the same with the number of processor cores and with its frequency (where necessary).
Can also implement a comparison of free disk space and, based on the results, place a temporary folder there for unpacking. ;)

I know what can be done with kernels in mind, but it doesn't make sense for my repack.

BLACKFIRE69
12-02-2024, 11:13
FMXInno - documentation



* A documentation for FMXInno may arrive someday, but not in the near future. what are your thoughts on this? ;)




.

Ponasss
22-02-2024, 06:18
Why does it show so many Trojans?

(че столько троянов показывает?)

Joe Forster/STA
23-02-2024, 06:01
Why does it show so many Trojans?

(This is an English-only forum.) Your virus scanner may be overreacting. I suggest that you upload suspicious files to https://www.virustotal.com, an online multi-engine virus scanner.

BLACKFIRE69
24-02-2024, 05:40
* FMXInno - Updates [2024-Feb-24]


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.



The first post has been updated; check it out.



.

BLACKFIRE69
26-02-2024, 06:44
FMXInno - Final Release: Hotfix_01


* The FMXInno final build includes three main types of FMXInno libs. (yes, i should have mentioned these facts earlier; i really forgot, sorry.)


1. FMXInno Standard:
- Contains all FMXInno features.
- Path1: .\Files\FMXInno.dll
- Path2: .\FMXInno+FXPacker\Files\FMXInno.dll

2. FMXInno Standard + SKIA:
- Includes all Standard features and SKIA features.
- Path: .\SKIA\FMXInno.dll
- Requires 'sk4d.dll' to be next to 'FMXInno.dll'.

3. FMXInno Standard + Blend2D:
- Combines Standard features with Blend2D features.
- Path: .\_Blend2D\Files\FMXInno.dll
- Requires 'blend2d_win32.dll' to be next to 'FMXInno.dll'.



================================================== =========

* in the latest final release (FMXInno + SKIA + Blend2D - Final Release [2024-Feb-24]), i also forgot the following:

1. For SKIA:
a. To replace Firemonkey canvas with SKIA canvas.
b. To enable GPU Acceleration.

>> Resulting in the lowest FPS rate and the experience of slow animations and lags.

2. For XBass_F:
a. To adjust to be compatible with new changes.

>> Resulting in unexpected behavior and crashes when closing the 'setup.exe'.

3. Additionally, i slightly sped up the Dark-Light mode transition.



thanks to @audiofeel for reporting these bugs.



================================================== =========

* to apply Hotfix_01:

1. Just replace the old files with the new ones.




.

BLACKFIRE69
27-02-2024, 17:30
FMXInno - News


1. just uploaded the FMXInno project to GitHub, but it's not published yet. it'll be available for everyone someday (, or perhaps never). ;)





.

hitman797
01-03-2024, 02:29
HI, @BLACKFIRE69, :o can you add Radiant Shapes to the FMXInno. ;)

Radiant Parallelogram.
Radiant Hexagon.

Fak Eid
05-03-2024, 11:21
Code for Edit Box
Page2Edit.FCreate(Page2.Handle);
Page2Edit.SetBounds(NSSX(100), NSSY(190), NSSX(520), NSSY(35));
Page2Edit.FontSetting('{#FontName}', VCLFontSizeToFMX2(13), ALGainsBoro);
Page2Edit.CanFocus(True);
Page2Edit.Enabled(True);
Page2Edit.Text(MinimizePathName(WizardForm.DirEdit .Text, WizardForm.DirEdit.Font, WizardForm.DirEdit.Width));
Page2Edit.OnTyping(@BrowseEditOnChange);


Logic for procedure
procedure BrowseEditOnChange(Sender: TObject);
var
PrevDrive, CurrentDrive: String;
begin
PrevDrive := ExtractFileDrive(WizardForm.DirEdit.Text);
CurrentDrive := ExtractFileDrive(Page2Edit.GetText);

// Set the installation path to the edited text value
WizardForm.DirEdit.Text := Page2Edit.GetText;

if PrevDrive <> CurrentDrive then
DirUpdateProc(nil);
end;

Logic for Directory Update Procedure:
procedure DirUpdateProc(Sender: TObject);
begin
DiskUsage.SetDir(WizardForm.DirEdit.Text);
SelectDirLabel[3].Text('Total Space - ' + MbOrTb(DiskUsage.TotalSpace, 1) + #13 +
'Available Space - '+ MbOrTb(DiskUsage.FreeSpace, 1) + #13 +
'Repack Size - ' + MbOrTb({#RepackSize}, 1));
if Round(DiskUsage.FreeSpace) > StrToInt('{#RequiredSpace}') then
begin
WizardBtn[4].Enabled(True); //Install Button enabled if there is space
end else
begin
WizardBtn[4].Enabled(False); //Install Button disabled if no space
ShowMessage('Not Enough Space', 'Selected Directory does not have required space. Please select a different directory location.');
end;
end;

Fak Eid
05-03-2024, 11:34
Declare a global variable DiskSkip in the top
var
DiskSkip: Boolean;

Updated changes here:
procedure CurStepChanged(CurStep: TSetupStep);
var
i: Integer;
begin
DiskSkip:= False;
if CurStep = ssInstall then begin
ISArcExCancel := 0;
ISArcExDiskCount := 0;
ISArcDiskAddingSuccess := False;
ISArcExError := True;

#include "Game/UnpackTools_Init.iss"
{ - ADDING DISKS: BEGIN -}
repeat
{< Main Archives >}
#ifdef Data1
VerifyFileExist('Data-01.bin');
if DiskSkip then break;
#endif
#ifdef Data2
VerifyFileExist('Data-02.bin');
if DiskSkip then break;
#endif

{< Components >}
#ifdef Component1
if Checkbox[8].ISChecked then
VerifyFileExist('selective-english.bin');
#endif
#ifdef Component2
if Checkbox[9].ISChecked then
VerifyFileExist('selective-bonus.bin');
#endif
until true;
{ - ADDING DISKS: END -}

ISArcExStop;
if ISArcExError then
ShowMessage('Installation was interrupted', 'Either the installation has been cancelled by the user,' +#13+ 'or the files are corrupted.');
end else if not (ISArcDiskAddingSuccess) and (DiskSkip) then
ShowMessage('Installation is corrupted', 'Required disks could not be located.');



Common procedure to handle all Data files
procedure VerifyFileExist(FilePath: WideString);
var
sPath, sFile: WideString;
sExt: String;
begin
sPAth := AddBackslash(ExpandConstant('{src}'));
if FileExists(sPAth + FilePath) then begin
ISArcDiskAddingSuccess:= ISArcExAddDisks(sPAth + FilePath, '{#DiskPassword}', ExpandConstant('{app}'));
if not ISArcDiskAddingSuccess then begin
DiskSkip:= True;
Exit;
end;
ISArcExDiskCount := ISArcExDiskCount + 1;
end else
begin
ShowMessage('Setup Needs the Next Disk', 'Please browse Disk: [ ' + FilePath + ' ] after closing this prompt'#13#10'If this disk can be found in another folder, browse to the correct path.');
sExt:= ExtractFileExt(FilePath); StringChange(sExt, '.', '');
if OpenFileModern(FMXForm.HandleHWND, sExt, FilePath, sPAth, 'Please specify the location of the next disk', sFile) then
begin
sPAth := ExtractFilePath(sFile);
ISArcDiskAddingSuccess:= ISArcExAddDisks(sPAth + FilePath, '{#DiskPassword}', ExpandConstant('{app}'));
if not ISArcDiskAddingSuccess then begin
DiskSkip:= True;
Exit;
end;
ISArcExDiskCount := ISArcExDiskCount + 1;
end else begin
ISArcDiskAddingSuccess := False;
DiskSkip:= True;
Exit;
end;
end;
end;

Fak Eid
08-03-2024, 03:09
Hi @BlackFire,

I have identified that in 1080p the Form doesn't pop-up at the center of the screen, it is slightly to the left. This is not happening with everyone.

Another issue with FCustomFluentWindow is if once triggered it keeps on popping-up repeatedly and cannot be closed.

MessageForm.FCreate(FMXForm.HandleHWND, True, False, 0.56, 0);

Temporary fix where it doesn't happen
MessageForm.FCreateBlankForm(FMXForm.HandleHWND, ALBlack, '');

This is also happening for few people. I'm using a gaming mouse but macro is not enabled. Can you please take a look or let me know the reason or fix?

I've created two videos associated to this. Copy-paste the link after 'youtube.com/' as I'm unable to post the link because they get automatically parsed.
watch?v=lKhINB7hyBY&ab_channel=FaKEid


Issue notified at 00:40 - 1:30
watch?v=xopBfI90T-g&ab_channel=FaKEid

Edit : Added GIF to display the issue

Fak Eid
08-03-2024, 06:48
Yes the issue is the resolution scale. In 100%, it comes completely in the center of the screen, but in 125%, it is slightly to the left.

I'm not using any custom theme file here. No code changes here, just the default template shared by @Blackfire for WPI Corepack and the issue is happening for FCustomFluentWindow for me.

BLACKFIRE69
12-03-2024, 03:52
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:

procedure FMXDesigning;
begin
{...}
Page1.FCreate(FMXForm.Handle);
Page1.Visible(False);

{...}

Page2.FCreate(FMXForm.Handle);
Page2.Visible(False);
{...}
end;


2. Rewrote some fluent effects code:

-- 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).




.

Fak Eid
15-03-2024, 00:32
Can someone help me in animating this section down on the click of 'i' (info button) ? Check the gif:
Page[1]: FCustomPage;
PageContent[1]: FRectangle;


Page[1].FCreate(ShadowImg.Handle);
Page[1].Visible(False);

PageContent[1].FCreate(Page[1].Handle);
PageContent[1].FillColor(HTMLColorStrToFMXColor('#1f2227'));
PageContent[1].SetBounds(20, 70, 780, 150);
PageContent[1].Opacity(0.85);
PageContent[1].CornerStyle(2, 2, [tcTopLeft, tcTopRight, tcBottomLeft, tcBottomRight], ctRound);

Fak Eid
15-03-2024, 12:39
Hi @Blackfire

The earlier issue with FCreateBlankForm, where it loads with a blank image before load, has resurfaced. When running for the first time it is for more time, it subsequently gets faster (depending upon SSD/HDD, I suppose). Can you please look into it?

I'm not sure if there is already a fix for it, as I lost track of some recent changes in FMXInno. If there is a fix, let me know.

Image and gif added for review.

hitman797
15-03-2024, 14:18
Hi @Blackfire

The earlier issue with FCreateBlankForm, where it loads with a blank image before load, has resurfaced. When running for the first time it is for more time, it subsequently gets faster (depending upon SSD/HDD, I suppose). Can you please look into it?

I'm not sure if there is already a fix for it, as I lost track of some recent changes in FMXInno. If there is a fix, let me know.

Image and gif added for review.

add this to the code.
procedure InitializeWizard();
begin
FMXForm.Show;
end;

BLACKFIRE69
15-03-2024, 22:45
FMXInno: Cumulative Update - [2024-Mar-15]


What's New:

* 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.

- function MbOrTbEx(Float: Extended; Decimal: Integer; sMb, sGb, sTb: WideString): WideString;
- function MHzOrGHzEx(Float: Extended; Decimal: Integer; sMz, sGz, sTz: WideString): WideString;

etc.



.

BLACKFIRE69
19-03-2024, 20:48
FMXInno: Cumulative Update - [2024-Mar-15]


What's New:

* 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.




FMXInno - Final Release [2024-Mar-20]


What's new:

* 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.

* Added a new Fluent Form (FluentBlendedColor).

- 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.
- 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).

* Added built-in SVG image support.

- Rendering engine: Image32

* Windows title bar is now more customizable.

- Custom Application Icon instead of the default one.
- 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.

* Added Image32 - 2D Graphic Library.

- 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.
- 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 (https://angusj.com/image32/Docs/Overview.htm)

* Added new properties for classes.

* More bug fixes and improvements.

* Plugin folder has been cleaned up.

- Removed unwanted plugins from the directory.
- Re-compiled all the plugins to make sure everything is up to date.

* All the examples have been revised.

- Now the default compression will be 'lzma2/ultra64'.

* Also, added new examples.

* Extended support for Windows 11 24H2.


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;


Note: The first post has been updated; check it out.



.

BLACKFIRE69
20-03-2024, 08:43
FMXInno: Minor Update for [Mar-20]


* 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.


UWP Tile Selection:
procedure TileSelect(ATile: LongInt);
procedure TileSelectEx(ATile: LongInt; MouseOverColor: TAlphaColor);

Example:

UWPTiles.TileSelect(Tile[5]);
UWPTiles.TileSelectEx(Tile[5], ALRed);


How to update:
1. Download the latest update from the first post.
2. Replace the 'FMXInno.dll' and 'FMXInnoHandle.iss' with the provided ones.



.

BLACKFIRE69
27-03-2024, 06:48
FMXInno: Minor Update - [2024-Mar-27]


* Added the FColorComboBox class.
* Prevented forms from being resized.
* Added the following new functions:

function IsValidVCLColor(const AColor: TColor): Boolean;
function IsValidFMXColor(const AColor: TAlphaColor): Boolean;

function IsLightFMXColor(const AColor: TAlphaColor): Boolean;
function IsLightVCLColor(const AColor: TColor): Boolean;


IsLightFMXColor:
> 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:
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;

Extra:

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;


How to update:
1. Download the latest update from the first post.
2. Replace the 'FMXInno.dll' and 'FMXInnoHandle.iss' with the provided ones.



.

BLACKFIRE69
28-03-2024, 11:40
FMXInno - Windows 8



even though i'm not a fan of Windows 8 like many others, i do like the background color transition during its installation. what are your thoughts?






.

Jahan1373
28-04-2024, 01:12
Hi audiofeel,

Well, please refer the files. To reproduce the issue:
1. The required files in the Output are obviously missing. So, start the installer normally and navigate to Installation tab. It will show you some error like: Required Files Missing.

2. Try to close it and quit the installer. It doesn't happen. Hard close using Task Manager.

3. Now, open the installer again and try to quit at any point of time. It doesn't close.

Let me know if you're able to refer this link:
https://www.mediafire.com/file/ohrzl0fsg5zu6fd/Redshank_Updated.zip/file

I know there can be some issue with my code. But, if you can help me, I'll learn from you
Link dwnlad

BLACKFIRE69
29-04-2024, 07:02
FMXInno - Final Release [2024-Apr-29]


* What's New:

* This update focuses on quality improvements, stability enhancements, and minimizing memory leaks.

-- Features like FMXInno Copilot, Widgets, and certain modern features have been postponed to avoid adding bloatware to FMXInno.
-- However, you can test them out on FMXInno-Dev, and I'll provide updates on their availability in the future.

* Introduced a new Error Handling Mechanism.

-- Previous versions of FMXInno lacked proper error handling because I prioritized adding new features and improvements over it.
-- With this update, I've enhanced the stability of FMXInno,
-- Ensuring that the new error handling significantly benefits you by preventing installer crashes and access violation errors.

* Compiled with the latest version of RadStudio (RadStudio Athens 12.1 - 04/Apr/2024).

-- This ensures that everything is up-to-date.
-- Providing high-quality performance and rendering.
-- High-DPI support.
-- Complete compatibility with Windows 11.
-- Increased Windows API availability.
-- And improved coding efficiency.

* Fixed HTMLText and added support for opacity.

-- Previously, HTMLText had issues with opacity, which have now been resolved.

* Fixed WebView2 to ensure proper setup closure.

-- Updated WebView2 to the latest version and made necessary improvements.
Example:

procedure DeinitializeSetup();
begin
AWebView.Stop;
AWebView.Shutdown;
FMXInnoShutDown;
end;

* Improved SKIA for high performance.

-- SKIA relies on the GPU and minimally affects the CPU, making it suitable for use in your installer.

* Although SKIA and Blend2D are kept separate from the standard FMXInno for now, both versions are provided in the attachment.

-- In the future, they will need to be downloaded separately.

* The Image32 Engine remains unavailable for public use.

-- As many FMXInno users may not be familiar with it.

* Various improvements and bug fixes.

-- No software is without issues, so we continue to address them with each update.

* Updated the '_InstallerGenerator' app.

-- Now includes a built-in Inno Script Editor + Compiler.

* Ready to use with the upcoming InnoSetup v6.3.0.

* Added a new example for setup language selection.



Note: The first post has been updated; check it out.



.

Tihiy_Don
29-04-2024, 10:29
Good afternoon! Some users, on any systems, have a problem when the installer process hangs in the processes and the form does not open. It occurs extremely rarely, in about 5-10 percent of users. I hope this issue has been fixed in this version. I tried to change different types of forms, the result is the same.

BLACKFIRE69
30-04-2024, 11:15
Good afternoon! Some users, on any systems, have a problem when the installer process hangs in the processes and the form does not open. It occurs extremely rarely, in about 5-10 percent of users. I hope this issue has been fixed in this version. I tried to change different types of forms, the result is the same.



users sometimes report this issue, but until now, i couldn't come up with a better solution.

let's dive a little deeper into this. in FMXInno, all the forms (FluentForm, BlankForm, ImageForm, etc.) are based on a single form called 'TFMXFluentF', which is a modified Firemonkey TForm specifically used for FMXInno. i think this could be the main reason for all of this. So, that's how i came up with this new idea.

i've introduced a new form called 'ClassicForm' into FMXInno. so, what is the 'ClassicForm'? Is it another blank form or something else? actually not, it's an original Firemonkey TForm which is exactly the same as the one Mr. Jiva Newstone used in 'ISFMXFW'.

First of all, let's check out the key differences between FMXInno's TFMXFluentF and ISFMXFW's TForm:

- FMXInno's TFMXFluentF:
1. This replaces the WizardForm when creating.
2. It has more control over this.
3. It can have Fluent effects on this.

- ISFMXFW's TForm:
1. This is parented to the WizardForm, nothing is replaced.
2. It has limited controls.
3. Fluent effects cannot be used on this.


so, how is the 'Classic' form gonna fix this issue? my idea is to have two modes for the same installer as a backup using 'Classic' forms. to do so, we can use command-line parameters in case the setup is unable to run with the 'TFMXFluentF'. we can easily do that using a batch file, and the following simple example will show you how to do that.


var
IsClassicMode: Boolean;

function InitializeSetup(): Boolean;
begin
IsClassicMode := CmdLineParamExist('/Classic');

FMXInnoInit;
Result := True;
end;

procedure InitializeWizard();
begin
EmptyWizardForm(True, 640, 480);

// Music ...

FMXDesigning;
FMXForm.Show;

if IsClassicMode then
pTaskbarPreview(True) // or pTaskbarPreviewEx(WizardForm.Handle, True);
else
pTaskbarPreviewEx(FMXForm.HandleHWND, True);
end;

procedure FMXDesigning;
begin
{ FMX Form }
if IsClassicMode then
FMXForm.FCreateClassicForm(WizardForm.Handle, ALMoneyGreen, '')
else
FMXForm.FCreateFluent(WizardForm.Handle, False, False, 0.56, 0);

FMXForm.SetCursor(ExtractAndLoad('Dark.cur'));
...
end;

Bat File:

@echo off
cd /d "%~dp0"

start "" "_Setup1.exe" /Classic


in this way, you can try the classic mode if the installer is unable to run with modern forms. (because of the classic form, FMXInno may support old OS like Windows 7. i'm not sure because i don't have any virtual machine or bare metal right now to test it out.)

there're some facts you should notice when using the classic forms:

1. EmptyWizardForm - the 'Buttons' parameter should always be 'True'.
eg: EmptyWizardForm(True, 640, 480);

2. pTaskbarPreviewEx - the 'hwnd' parameter should always be 'WizardForm.Handle'.
eg: pTaskbarPreviewEx(WizardForm.Handle, True);


in the attachment, i've included two examples: a simple example and the Modern FitGirl Installer example with both Normal and Classic modes. run the batch files to see the differences. the following screenshot will show you the Modern FitGirl installer in both normal and classic mode. (remember, classic forms are always borderless rectangle forms, and we cannot control the border style.)

also, the first post has been updated with the new update.


.

Tihiy_Don
01-05-2024, 08:11
Thank you - this is exactly what I need, I will try to implement the installer on it and test it on users. Unfortunately, I also could not identify any consistency with this problem, it sometimes occurs on windows 11, 10 and 7. Someone solved this problem by rebooting the operating system, but others did not. I also sent you a message on krinkels related to unpacking the archives, please read it as you have free time.

Fak Eid
10-05-2024, 09:28
Hi @Blackfire69,

Can you please help me with following additions/workaround to FMX Libraries as I require them on a Project I'm working in:

1. Can we fetch the drive's name (Picture 1)?

2. Functionality to have sharp corners on FCustomFluentWindow?
Edit: Audiofeel helped with this. Thank you
InstallPage.FCreateBlankForm(FMXForm.HandleHWND, HTMLColorStrToFMXColor('#25282f'), '');

InstallPage.Show;
SetWin11FormCorners(InstallPage.ParentHandleHWND, ctw11Sharp);

3. Functionality to have FImgSlideShow or FFormImgSlide inside FRectangle (not HWND)

4. A variable on ProgressCallback to fetch the total disk size extracted in case of multiple disks. I tried doing (Installation % * Size) div 100 but it is just workaround. (Picture 2 & 3 for reference)

5. In some cases, the CpuUsage.Name gives value seperated by Tabs. Any way to remove that? Like:
Processor: { Tab Space } AMD Ryzen 9

6. How to right align a FLabel/FText? It is not working or an example please.
Edit: Audiofeel helped with this. Thank you
ALabel.FCreate(PageContent[3].Handle, '57.2 GB');
ALabel.SetBounds(500, 165, 70, 20);
ALabel.FontSetting('{#FontName}', 11, {#SelectedFontColor});
ALabel.FontStyle([fsBold]);
ALabel.TextSetting(False, txTrailing, txCenter);

7. FCombineText: if have 0 Tab space must get the width of Text 1 and Text 2 should start after some space

With the new FMXInno, so many error messages keep popping up. Can you please have a toggle to turn them off or bypass?

BLACKFIRE69
11-05-2024, 09:01
FMXInno Cumulative Update - [2024 May 11]

* 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.



The first post has been updated.



.

ScOOt3r
12-05-2024, 12:30
Thanks @Blackfire69 this fixes my issue of the same thing to.. works Great!

ScOOt3r

BLACKFIRE69
13-05-2024, 00:36
With the new FMXInno, so many error messages keep popping up. Can you please have a toggle to turn them off or bypass?

I think it's better for us to catch errors than for users not to ?




The new error handler is a little bit tougher because effective error management is key to reducing runtime errors, especially. This approach forces you to explicitly handle errors and null values, making your code clearer and safer.


The new error handler provides more informative error messages tailored to specific situations, making it very convenient to deal with.


Why didn't previous versions display these error messages? Because they lacked an error handler altogether, thus allowing any errors to go unnoticed and potentially causing issues.



The error handler will remain active; I won't permit bypassing it. ;)



.

Fak Eid
13-05-2024, 07:52
The error handler will remain active; I won't permit bypassing it. ;)
.

No issues. Completely understandable. I'll just rewrite my code again. Can you please implement 4, 5 and 7 (optional, if possible).

BLACKFIRE69
14-05-2024, 03:50
No issues. Completely understandable. I'll just rewrite my code again. Can you please implement 4, 5 and 7 (optional, if possible).



Hi @Blackfire69,

3. Functionality to have FImgSlideShow or FFormImgSlide inside FRectangle (not HWND)

1. 'FImgSlideshow' requires its parent as 'HWND' because it's originally based on a VCL component.
2. You can create a 'FFormImgSlide' on an 'FRectangle' because its parent's type requires 'TFMXObject'.





4. A variable on ProgressCallback to fetch the total disk size extracted in case of multiple disks. I tried doing (Installation % * Size) div 100 but it is just workaround. (Picture 2 & 3 for reference)

the callback function already has too many parameters, so i'll add two new functions instead.

function ISArcExGetTotalSizeMBOfAllDisks: Integer;
--> Uncompressed (Original) size of all the disks (in MB).

function ISArcExGetExtractedSizeMBOfAllDisks: Integer;
--> Currently extracted size of all the disks (in MB).

Example:

function ProgressCallback(...): longword;
var
S: WideString;
begin
...

// Extra: Titlebar Caption
S := 'Total Extraction: ' + IntToStr(ISArcExGetExtractedSizeMBOfAllDisks) +
' MB / ' + IntToStr(ISArcExGetTotalSizeMBOfAllDisks) + ' MB';

WizardForm.Caption := S;

Result := ISArcExCancel;
end;

Stats:

data1.bf == 914 MB
data2.bf == 764 MB
data3.bf == 613 MB

Total == 2,291 MB





5. In some cases, the CpuUsage.Name gives value seperated by Tabs. Any way to remove that? Like:
Processor: { Tab Space } AMD Ryzen 9


Something := Trim(CpuUsage.Name);





7. FCombineText: if have 0 Tab space must get the width of Text 1 and Text 2 should start after some space

To use spaces instead of tab spaces, use a 'Negative' value for 'Tabs'.


Positive values for Tabs:

1 = One Tab
2 = Two Tabs
3 = Three Tabs
etc.



Negative values for Tabs:

-1 = One Space
-2 = Two Spaces
-3 = Three Spaces
etc.




{ ACombineText }
ACombineText.FCreate(FMXForm.Handle, 50, 80, 'The Module Name:', 'FMXInno.dll', -3, False);

ACombineText.Text1Setting('Segoe UI SemiBold', 16, ALBlack, False);
ACombineText.Text2Setting('Segoe UI', 16, ALRed, False);
ACombineText.Text1ShadowSetting(ALBlack, 0.2, 0.2);
ACombineText.Text2ShadowSetting(ALRed, 0.1, 0.6);



.

Fak Eid
16-05-2024, 08:29
Thank you for the enhancements. But there seems to be a bug.
When trying to open this FCustomFluentWindow for the first time, I'm able to see a header on top of it which goes away after dragging.

It is only happening for the first time and for this FCustomFluentWindow. For other it is working as expected. Can you let me know what could be the issue here?

BLACKFIRE69
16-05-2024, 09:00
Thank you for the enhancements. But there seems to be a bug.
When trying to open this FCustomFluentWindow for the first time, I'm able to see a header on top of it which goes away after dragging.

It is only happening for the first time and for this FCustomFluentWindow. For other it is working as expected. Can you let me know what could be the issue here?



SetWin11FormCorners(CusForm.ParentHandleHWND, ctw11Sharp);

this could be the cause of that.

R6S
17-05-2024, 01:21
Hello upon testing this, it doesn't seem to work. I am still have the same issue.

link can downloud the best existing compression tool that works with WPI_CorePack

Fak Eid
17-05-2024, 01:24
SetWin11FormCorners(CusForm.ParentHandleHWND, ctw11Sharp);

this could be the cause of that.

Commented that line of code. Now the form comes in round corners, but it is still happening. Any other fix?

Fak Eid
17-05-2024, 02:16
is the newest version of the dll from May 11th in use? and do you use a style file in your work? if so, then give it up and try again.

I use the 14th May version from the link Blackfire shared above, with my enhancements. Yes, I do use a style file for FMemo, FEdit, FCheckbox and in future for FSwitch. I tested without style.bin file but still the issue persists.

The fact that it is only happening for InstallPage: FCustomFluentWindow only for the first time and not again, and not happening for ExitPage and SettingsPage confuses me.

BLACKFIRE69
17-05-2024, 04:14
I use the 14th May version from the link Blackfire shared above, with my enhancements. Yes, I do use a style file for FMemo, FEdit, FCheckbox and in future for FSwitch. I tested without style.bin file but still the issue persists.

The fact that it is only happening for InstallPage: FCustomFluentWindow only for the first time and not again, and not happening for ExitPage and SettingsPage confuses me.


i can't easily explain why this is happening, and i can't recreate the situation to test it. but anyway,

FMXInno - [2024-May-17].rar (https://app.box.com/s/hfixnb1zgi1qw4hy65ko3lu4akk519pm)

Fak Eid
18-05-2024, 03:00
i can't easily explain why this is happening, and i can't recreate the situation to test it. but anyway,


17th May version has some more issues.
But I figured, in 14th May version. This anomaly is only happening in InstallPage @1080p 125% resolution only which is FCustomFluentWindow with both FCreateBlankForm only(not any other FCreate functions).

For the rest other resolutions, it is working fine. Sharing you files to look and please let me know if I'm doing something wrong as well. I'll try correcting it from next time as well. [This is just dummy code set]

Required Files in 'Game' folder.
FMX files in Files/Modules
Section to review: Search by keyword 'InstallPage'

PS: Please also add GetSelectedDiskName (to get the name of the selected drive) on FDiskList.

Gummy Bear
18-05-2024, 07:20
Modern FitGirl Installer for Windows 11+












.
Looks very cool, is there a script with working functionality?

ScOOt3r
18-05-2024, 08:12
@GummyBear yes there is a script that works just fine, its on the first page, it has several installers in it so choose the one you like. if you still want the fitgirl installer then look for the fitgirl script. this is currently my favourite script.

ScOOt3r

Gummy Bear
19-05-2024, 00:35
@GummyBear yes there is a script that works just fine, its on the first page, it has several installers in it so choose the one you like. if you still want the fitgirl installer then look for the fitgirl script. this is currently my favourite script.

ScOOt3r

Thank you, is there a translation into Russian?

BLACKFIRE69
19-05-2024, 05:10
guys, if you recall, in a previous build of FMXInno, even though 'SetActiveThemeModeAwareness' is enabled, if the installer is minimized, i ignore the installer’s color mode change. this means that for 'SetActiveThemeModeAwareness' to take effect, the installer shouldn't be minimized.

someone asked me if this is an issue with FMXInno. No, FMXInno is just fine, but there's an issue that comes from Windows itself. i'm not a Windows developer, so i can't fix it. therefore, FMXInno ignores 'SetActiveThemeModeAwareness' if the installer is minimized.

check the screenshot below:



.

BLACKFIRE69
19-05-2024, 10:24
17th May version has some more issues.
But I figured, in 14th May version. This anomaly is only happening in InstallPage @1080p 125% resolution only which is FCustomFluentWindow with both FCreateBlankForm only(not any other FCreate functions).

For the rest other resolutions, it is working fine. Sharing you files to look and please let me know if I'm doing something wrong as well. I'll try correcting it from next time as well. [This is just dummy code set]

Required Files in 'Game' folder.
FMX files in Files/Modules
Section to review: Search by keyword 'InstallPage'

PS: Please also add GetSelectedDiskName (to get the name of the selected drive) on FDiskList.




adding compatibility for higher DPI is a headache, but anyway, we've to deal with it.

this update will fix the issue that shows the titlebar at higher DPI settings (>= 125%).

feel free to report back if there are other issues.


(Tested at 125% scale)

Fak Eid
20-05-2024, 12:09
adding compatibility for higher DPI is a headache, but anyway, we've to deal with it.

this update will fix the issue that shows the titlebar at higher DPI settings (>= 125%).

feel free to report back if there are other issues.


(Tested at 125% scale)

I have actually figured out the reason why the header was displayed. Maybe, it can help you debug better. It was due to the content overflow (leak) out the FCustomFluentWindow at different scales.

The Piece of code which I tested in the video @1080p 125%:
{ Exit Form }
ExitForm.FCreateBlankForm(FMXForm.HandleHWND, $FF161616, ExtractAndLoad('exit.jpg'));
ExitForm.Height(160); //If you make this 165, the form will display fine
ExitForm.Width(420);
ExitForm.DisableFluentEffects;

ExitShadowLayer.FCreate(ExitForm.Handle);
ExitShadowLayer.Align(Client);
ExitShadowLayer.FillColor(ALBlack);
ExitShadowLayer.Opacity(0.5);
ExitShadowLayer.HitTest(False);

ExitLbl[2].FCreate(ExitForm.Handle);
ExitLbl[2].Text('Quit Installer');
ExitLbl[2].TextSetting(False, txLeading, txLeading);
ExitLbl[2].FontSetting('Segoe UI SemiLight', VCLFontSizeToFMX(15), {#TextColor});
ExitLbl[2].AutoSize(True);
ExitLbl[2].Position(20, 10);
ExitLbl[2].HitTest(False);

ExitLbl[3].FCreate(ExitForm.Handle);
ExitLbl[3].Text('Setup is not complete. If you exit now, the progam will not be installed.' + #13 + 'Exit now?');
ExitLbl[3].TextSetting(True, txLeading, txLeading);
ExitLbl[3].FontSetting('Segoe UI', VCLFontSizeToFMX(9), ALWhite);
ExitLbl[3].AutoSize(False);
ExitLbl[3].SetBounds(20, 55, 420, 115);
ExitLbl[3].HitTest(False);
// Yes
ExitBtnLbl[1].FCreate(ExitForm.Handle);
ExitBtnLbl[1].Text('Yes');
ExitBtnLbl[1].AutoSize(True);
ExitBtnLbl[1].FontSetting('Segoe UI', VCLFontSizeToFMX(9), ALWhite);
ExitBtnLbl[1].TextSetting(False, txLeading, txLeading);
ExitBtnLbl[1].Position(220, 115);

ExitBtn[1].FCreate(ExitForm.Handle);
ExitBtn[1].SetBounds(180, 110, 100, 25);
ExitBtn[1].Opacity(0.2);
ExitBtn[1].CornerStyle(3, 3, [tcTopLeft, tcTopRight, tcBottomLeft, tcBottomRight], ctRound);
ExitBtn[1].OnClick(@CommonOnClick);
ExitBtn[1].OnMouseEnter(@CommonButtonEnter);
ExitBtn[1].OnMouseLeave(@CommonButtonLeave);
// No
ExitBtnLbl[2].FCreate(ExitForm.Handle);
ExitBtnLbl[2].Text('No');
ExitBtnLbl[2].AutoSize(True);
ExitBtnLbl[2].FontSetting('Segoe UI', VCLFontSizeToFMX(9), ALWhite);
ExitBtnLbl[2].TextSetting(False, txLeading, txLeading);
ExitBtnLbl[2].Position(340, 115);

ExitBtn[2].FCreate(ExitForm.Handle);
ExitBtn[2].SetBounds(300, 110, 100, 25);
ExitBtn[2].Opacity(0.2);
ExitBtn[2].CornerStyle(3, 3, [tcTopLeft, tcTopRight, tcBottomLeft, tcBottomRight], ctRound);
ExitBtn[2].OnClick(@CommonOnClick);
ExitBtn[2].OnMouseEnter(@CommonButtonEnter);
ExitBtn[2].OnMouseLeave(@CommonButtonLeave);
end;

Fak Eid
20-05-2024, 12:35
A false screen pops-up for a few second and disappears every time the Setup.exe file is run. This was not happening in the 14th May or older version.

BLACKFIRE69
21-05-2024, 03:27
Just forget about the previous builds (May 19, etc.) because they had some issues. 'FMXForm.Show' didn't work properly, 'Translucent' objects didn't function, and 'BeginHaltProc' was broken, etc.

This update addresses those issues.




FMXInno - Final Release [2024-May-21]


* Integrated all the updates so far.
* Made some improvements and fixed bugs.
* Added new properties to classes.
* Updated Fluent API.

* Improved 'SetActiveThemeModeAwareness':
-- It now supports all the forms except 'NormalForm' and 'ClassicForm'.

> Fluent: ChangeFluentTheme (Dark/Light)
> FluentColor: ChangeFluentColor
> FluentBlendedColor: ChangeBlendedColor
> BlankForm: ChangeBlankFormColor

* Optimized for higher DPI.
* Ensured FMXForm and MsgForms are shown in the desktop center.

* The package now includes InnoSetup v6.0.5 + ResTools IDE instead of InnoSetup v5.6.1:
-- Make sure to use 'EmptyWizardForm' to resize the setup, especially for InnoSetup 6+.

* All basic tests were done with InnoSetup v6.3.0 Dev:
-- To ensure FMXInno works with the latest updates of InnoSetup.

* Compiled in RadStudio 12.1 + Patch 01.



PS: Please also add GetSelectedDiskName (to get the name of the selected drive) on FDiskList.

A new property, 'GetSelectedDiskName', is available under 'FDiskList'.


The first post has been updated.


.

Tihiy_Don
21-05-2024, 04:23
Please add the Cursor method for the FColorButton component.

Fak Eid
23-05-2024, 12:29
A false screen pops-up for a few second and disappears every time the Setup.exe file is run. This was not happening in the 14th May or older version.

This issue is still happening in FMXInno [21-May] for all types of forms, at all resolutions and in both Inno Setup version, that is, 6.3.0 and 5.6.0

Tihiy_Don
24-05-2024, 03:40
I also have this problem, a white square appears briefly on blankform. There is no such problem with imageform.

BLACKFIRE69
26-05-2024, 10:19
This issue is still happening in FMXInno [21-May] for all types of forms, at all resolutions and in both Inno Setup version, that is, 6.3.0 and 5.6.0


Windows gets new updates regularly, and i've upgraded to the newest version of RadStudio, so anything could be affect this. this is the best optimization that i can do on my part. if it doesn't work, then i can't do anything about it.

check the attachment.



Please add the Cursor method for the FColorButton component.


Added the 'cursor' property for custom blueprints.



InnoSetup 6.3.0 Dev:

* Compiled with the latest source code (2024-May-26).

* Added missing help files.

* Corrected custom syntax highlighting.
-- In the previous build, i might have done something wrong. this build will fix it.

Fak Eid
27-05-2024, 01:54
I still need help with this
Earlier to read AppName from .ini file we used to:
#define AppName ReadIni(SourcePath + "Game\Installer.ini", "Installer", "Name", "")

[Setup]
AppName={#AppName}

Is it possible to do it using the new FNewINI command like:
[Setup]
AppName=ANewInI.ReadString('Installer', 'Name', '')

BLACKFIRE69
28-05-2024, 13:29
I still need help with this
Earlier to read AppName from .ini file we used to:
#define AppName ReadIni(SourcePath + "Game\Installer.ini", "Installer", "Name", "")

[Setup]
AppName={#AppName}

Is it possible to do it using the new FNewINI command like:
[Setup]
AppName=ANewInI.ReadString('Installer', 'Name', '')



this tool is the CLI version of 'FNewINI' and can be used for preprocessing and automating everything at compile-time.

in the attachment, you'll find a simple example of how to read and configure the setup with the following INI file.



.

Fak Eid
28-05-2024, 22:44
Hi @Blackfire,

It is good that we now have a preprocessor for Read INI, but personally I think that we only need that to pass {#AppName} and {#DirName} at the compile time during the setup creation process. Rest everything can be handled without preprocessor. The FNewINI is written well enough. Please consider an example I shared above for Icons creation. It is easy to read, has a common procedure for all AppExe, less code, has ability to add more parameters in future and doesn't use preprocessor. You can definitely enhance and add to FMXInno (if you feel)

If I have to use the preprocessor only, I'd rather use the older reliable method. But, thank you so much for the enhancements.

I'd be posting more on Redist installation handling and Data extraction handling. I'm coding and testing on them.

Fak Eid
29-05-2024, 10:48
the proposed version of @blackfire69 is good because an ordinary user no longer needs to manually create a checkbox and set the text and its coordinates to it, just make changes to the ini file and the checkbox will appear and the necessary archive will be searched for unpacking.

I've an almost complete version of code where the user doesn't need to write any code at all for creating selective components. It's in my 'Random_Gamertags' Repack.

I've almost completed changes and currently testing this with new FNewINI

Fak Eid
04-06-2024, 09:19
Hi @Blackfire,

Not sure if you remember I asked how can I have just 1 character space instead of Tab Space for FCombineText, and you mentioned it can be done using 0 or -1, -2, etc. The problem is, it is not working for Smaller Font Size like 12-15. The two texts are not on same height and the gap is unusual. On Larger Font Size, like 16, it is working as expected. Can you help?

SectionText[1].FCreate(SectionContent[1].Handle, 500, 15, 'Developers :', INI_DEVELOPERS, -1, False);
SectionText[1].Text1Setting('{#FontName}', 12, {#FontColor}, False);
SectionText[1].Text2Setting('{#FontName}', 12, {#SelectedFontColor}, False);

SectionText[2].FCreate(SectionContent[1].Handle, 500, 35, 'Genre :', INI_GENRE, -1, False);
SectionText[2].Text1Setting('{#FontName}', 12, {#FontColor}, False);
SectionText[2].Text2Setting('{#FontName}', 12, {#SelectedFontColor}, False);

hitman797
04-06-2024, 11:31
Hi @Blackfire,

Not sure if you remember I asked how can I have just 1 character space instead of Tab Space for FCombineText, and you mentioned it can be done using 0 or -1, -2, etc. The problem is, it is not working for Smaller Font Size like 12-15. The two texts are not on same height and the gap is unusual. On Larger Font Size, like 16, it is working as expected. Can you help?

SectionText[1].FCreate(SectionContent[1].Handle, 500, 15, 'Developers :', INI_DEVELOPERS, -1, False);
SectionText[1].Text1Setting('{#FontName}', 12, {#FontColor}, False);
SectionText[1].Text2Setting('{#FontName}', 12, {#SelectedFontColor}, False);

SectionText[2].FCreate(SectionContent[1].Handle, 500, 35, 'Genre :', INI_GENRE, -1, False);
SectionText[2].Text1Setting('{#FontName}', 12, {#FontColor}, False);
SectionText[2].Text2Setting('{#FontName}', 12, {#SelectedFontColor}, False);


TTextAlign = (txCenter, txLeading, txTrailing);
procedure Text1HorzAlign(HAlign: TTextAlign);
procedure Text2HorzAlign(HAlign: TTextAlign);

Fak Eid
04-06-2024, 23:50
TTextAlign = (txCenter, txLeading, txTrailing);
procedure Text1HorzAlign(HAlign: TTextAlign);
procedure Text2HorzAlign(HAlign: TTextAlign);


Hi @hitman @Blackfire

Thank you. I tried and have to manually align the text for this. However, in Smaller Font Size (like 12-15), the two text still doesn't seem to be aligned height-wise. Any fix for it?

SectionText[1].FCreate(SectionContent[1].Handle, 500, 15, 'Developers :', INI_DEVELOPERS, -1, False);
SectionText[1].Text1Setting('{#FontName}', 12, {#FontColor}, False);
SectionText[1].Text2Setting('{#FontName}', 12, {#SelectedFontColor}, False);
SectionText[1].Text1HorzAlign(txTrailing);
SectionText[1].Text2HorzAlign(txTrailing);

SectionText[2].FCreate(SectionContent[1].Handle, 505, 35, 'Genre :', INI_GENRE, -1, False);
SectionText[2].Text1Setting('{#FontName}', 12, {#FontColor}, False);
SectionText[2].Text2Setting('{#FontName}', 12, {#SelectedFontColor}, False);
SectionText[2].Text1HorzAlign(txTrailing);
SectionText[2].Text2HorzAlign(txTrailing);

SectionText[3].FCreate(SectionContent[1].Handle, 500, 55, 'Release Date :', INI_RELEASE_DATE, -1, False);
SectionText[3].Text1Setting('{#FontName}', 12, {#FontColor}, False);
SectionText[3].Text2Setting('{#FontName}', 12, {#SelectedFontColor}, False);
SectionText[3].Text1HorzAlign(txTrailing);
SectionText[3].Text2HorzAlign(txTrailing);


Another issue: InstallFMXFont sometimes hangs the launch of Setup.exe during Runtime.

Tihiy_Don
05-06-2024, 04:09
Another issue: InstallFMXFont sometimes hangs the launch of Setup.exe during Runtime.

HI. Use new method:
function InitializeSetup: Boolean;
begin
AddFontResource2(ExtractAndLoad('{#MyFont1}'));
FMXInnoInit;
Result:= True;
end;

procedure DeinitializeSetup();
begin
RemoveFontResource2(ExpandConstant('{tmp}\{#MyFont 1}'));
ISArcExCleanUp;
FMXInnoShutDown;
end;


Now you do not need to specify InstallFMXFont in the FMXDesigning procedure

Fak Eid
08-06-2024, 15:21
Now you do not need to specify InstallFMXFont in the FMXDesigning procedure

I knew about AddFontResource2. I thought 'InstallFMXFont' was the newest thing. Sorry, I can't keep track of updates.

in my opinion, we lack this..

procedure Text1VertAlign(VAlign: TTextAlign);
procedure Text2VertAlign(VAlign: TTextAlign);
:o

Yes, i believe or whatever fixes this issue on smaller fonts. One of my FMX Installer is completely dependent on the use of it and I've to wait longer just to get this fixed. Although, it is working for larger font size like 16+.

BLACKFIRE69
10-06-2024, 12:26
FMXInno - Final Release [2024-June-10]


What's new:

* Merged Runtime-Scripts into this build.

* 'FNewINI' updated.

- Now you can create a 'FNewINI' from a string.
InIStr := '[SecM]' +#13#10+
'Key1=Val01' +#13#10+
'Key2=Val02' +#13#10+
'' +#13#10+
'[SecM\SecA]' +#13#10+
'KeyA=ValA' +#13#10+
'KeyB=ValB';

ANewINI.FcreateFromString(InIStr);

* Minor bug fixes and improvements.
* And it's recommended to use the latest version of InnoSetup v6.3.0.


The first post has been updated.


If you expect the following features, let me know:
1. PDF Viewer (*.pdf).
2. Markdown Viewer (*.md).
3. HTML Viewer (*.html).


---------------------------------------------------------------------------------------------------------------------

@Fak Eid,

* FCombineText/vertical mismatch:

- You have to use the Offset Y value to fix the vertical mismatch. (FCombineText.OffsetYText2(DY))
- Also, I removed the properties 'Text1HorzAlign' and 'Text2HorzAlign' from 'FCombineText'.

Example:

const
c_max0 = 14;
Pttrn = 4; // 1, 2, 3 or 4.

procedure FMXDesigning;
var i, j, k, c_max: Integer;
begin
...
if (c_max0 mod 2) = 0 then c_max := c_max0 else c_max := c_max0 - 1;

{ ACombineText }
for i := 1 to c_max do begin
if i <= (c_max div 2) then begin
case Pttrn of
1: j:=-1*(i-1);
2: j:=-1*((c_max div 2)-i);
3: j:=-1*Round(Abs((((c_max div 2) div 2)+1)-i));
4: if i<=(((c_max div 2) div 2)+1) then j:=-1*(i-1) else j:=-1*((c_max div 2)-i);
else j:=-1*(i-1);
end;
k:=0;
end else begin
case Pttrn of
1: j:=(i-((c_max div 2)+1));
2: j:=(c_max-i);
3: j:=Round(Abs(((c_max+(c_max div 2)+1) div 2)-i));
4: if i<=((c_max+(c_max div 2)+1) div 2) then j:=(i-((c_max div 2)+1)) else j:=(c_max-i);
else j:=(i-((c_max div 2)+1));
end;
k:=20;
end;
ACombineText[i].FCreate(FMXForm.Handle,60,120+((i-1)*15)+k,'The Module Name:','FMXInno.dll',j,False);
ACombineText[i].Text1Setting('Segoe UI', 10, ALBlack, False);
ACombineText[i].Text2Setting('Segoe UI', 13, ALRed, False);
ACombineText[i].Text1ShadowSetting(ALBlack, 0.2, 0.2);
ACombineText[i].Text2ShadowSetting(ALRed, 0.1, 0.6);
ACombineText[i].OffsetYText2(-1.5);
end;
...
end;

https://i.ibb.co/1f7HkRR/1.png


---------------------------------------------------------------------------------------------------------------------

@audiofeel,

* 'DrawFrame' has been updated for FFluentStartBrowse and FFluentDirBrowse.

* Setup-exiting issue for 'FOSInfo' with Windows 11 24H2 insider builds.

- In insider builds, Microsoft is pushing hard and has disabled (not deprecated) some useful features by default. This may be the reason for that.
- Once 24H2 is released, I'll update everything to be compatible with the new release.
- I don't release any fixes for beta versions, but for now, I made some modifications in this build which, if detected, may make 'FOSInfo' work with 24H2.

(I deleted the virtual machine with Win11 24H2 installed, so I couldn't test it.)

* MInI updated.

- Previous code examples may not work with the new MInI.exe.
- Now it will accept parameters in any of the following formats:

1. /Sec=Player || --Sec=Player || /s=Player || -s=Player
2. /Sec="Player" || --Sec="Player" || /s="Player" || -s="Player"
3. /Sec='Player' || --Sec='Player' || /s='Player' || -s='Player'

4. /Sec:Player || --Sec:Player || /s:Player || -s:Player
5. /Sec:"Player" || --Sec:"Player" || /s:"Player" || -s:"Player"
6. /Sec:'Player' || --Sec:'Player' || /s:'Player' || -s:'Player'

7. /Sec Player || --Sec Player || /s Player || -s Player
8. /Sec "Player" || --Sec "Player" || /s "Player" || -s "Player"
9. /Sec 'Player' || --Sec 'Player' || /s 'Player' || -s 'Player'

- Added a new function called 'CalcTotalDiskSizeByte' which calculates the total size of disks in bytes.

For that, the INI file should look like this:

[Datas]

[Datas\Data1]
File={src}\data1.bf
Size=1245

[Datas\Data2]
File={src}\data2.bf
Size=2356

[Datas\Data3]
File={src}\data3.bf
Size=4578

USAGE: MInI.exe CalcTotalDiskSizeByte /MainSec=Datas /Key=Size

[Setup]
...
ExtraDiskSpaceRequired={#ReadMInI('CalcTotalDiskSi zeByte', '/MainSec=Datas /Key=Size')}
...


- Updated Example.iss file to retrieve disk sizes and component-disk sizes at compile time.

Now everything is automated, so there's nothing to do manually.




.

Tihiy_Don
10-06-2024, 22:05
Will there be a fix for the FFormImgSlide component?

Fak Eid
11-06-2024, 01:47
Will there be a fix for the FFormImgSlide component?

What is the issue with FFormImgSlide?

@Fak Eid,

* FCombineText/vertical mismatch:


Thank you that fixed all the issues with FCombineText. It is really a very important and necessary feature.

@Blackfire

I'd really like to have a 'HTML Viewer' example where I can integrate a youtube video to my installer which buffers based on internet connection instead of importing during setup.exe creation.

This is not a necessity and completely dependent if it can be implemented.
Link: https://www.skidrowreloaded.com/horizon-forbidden-west-complete-edition-update-v1-0-43-p2p/

<div class="html5-video-container" data-layer="0">
<video tabindex="-1" class="video-stream html5-main-video" webkit-playsinline="" playsinline="" controlslist="nodownload" style="width: 560px; height: 315px; left: 0px; top: 0px;"
src="blob:https://www.youtube.com/2ef7c9b2-0611-4dfd-b49b-4aa461f19f96" __idm_id__="2465793">
</video>
</div>

Fak Eid
12-06-2024, 13:32
Right now in order to create the image I have to do an alternate like:
SettingsBtn: array[1..4] of FRectangle;
SettingsBtnIcon: array[1..4] of FText;
SettingsBtnLabel: array[1..4] of FText;

SettingsBtn[1].FCreate(SettingsRect[1].Handle);
SettingsBtn[1].FillColor(HTMLColorStrToFMXColor('#3d434f'));
SettingsBtn[1].SetBounds(0, 120, 190, 40);
SettingsBtn[1].Opacity(0.8);
SettingsBtn[1].OnMouseEnter(@CommonMouseEnter);
SettingsBtn[1].OnMouseLeave(@CommonMouseLeave);
SettingsBtn[1].OnClick(@CommonClick);

SettingsBtnIcon[1].FCreate(SettingsBtn[1].Handle);
SettingsBtnIcon[1].Text(#57793);
SettingsBtnIcon[1].SetBounds(0, 0, 80, 40);
SettingsBtnIcon[1].FontSetting('Segoe UI Symbol', 18, {#SelectedFontColor});
SettingsBtnIcon[1].HitTest(False);

SettingsBtnLabel[2].FCreate(SettingsBtn[1].Handle);
SettingsBtnLabel[2].Text('Directory');
SettingsBtnLabel[2].SetBounds(60, 0, 190, 40);
SettingsBtnLabel[2].FontSetting('{#FontName}', 16, {#SelectedFontColor});
SettingsBtnLabel[2].TextSetting(false, txLeading, txCenter);
SettingsBtnLabel[2].HitTest(False);

I even did an alternative using a combo of FColorButton and FCombineText, but it is not working as FCombineText doesn't have HitTest method.

Can someone suggest me any other alternative to achieve this with simple and less code. Does anyone think it is a good feature to implement? If not, I'll continue with the same code combo I was using.
procedure SetLB1Position(const X, Y: Single);
procedure SetLB2Position(const X, Y: Single);

Issue with FLabel: No Event Listeners of FLabel is responding. Edit: Fixed with HitTest(True); Thanks to audiofeel
Issue with FCombineText: No Event Listeners (getObject1, getObject2) are responding.
Enhancement on FVideoPlayer: Support for .mp4 file extension
Enhancement on FDiskList: I'd still like to see the Blue Covering Box, when set BackVisible(False). In this scenario, I'm unable to see the selected Disk. Edit : Also add, GetLB1Text. If user makes directory update to FEdit, I need to select the disk, the user has input as text. Also, display Disk Name if it exist. If not, show 'Logical Disk'

longpv818
12-06-2024, 20:09
thank you so much. It's my looking.

---------------------------------------------------
Đến với TEM NHĂN CÔNG NGHIỆP THỊNH PHÁT là đến với niềm tin, đến với sự cam kết lâu dài cùng phát triển.
Với nhiều dịch vụ như làm tem inox ăn ṃn (https://temnhanthinhphat.com/san-xuat-tem-nhan-inox-an-mon-gia-re/) - name plate inox (https://temnhanthinhphat.com/san-xuat-tem-inox-an-mon-name-plate-name-tag-inox-gia-re/) chuyên nghiệp trực tiếp tại xưởng. Toàn thể nhân viên luôn cam kết dịch vụ name plate inox (https://temnhanthinhphat.com/san-xuat-inox-name-plate-cho-may-moc-dong-co-cong-nghiep/), chất lượng cũng như giá thành tốt nhất cho tất cả khách hàng có nhu cầu làm biển hiệu công ty (https://temnhanthinhphat.com/lam-bien-bang-hieu-cong-ty-bang-inox-an-mon-dep/) hoặc làm tem nhăn động cơ (https://temnhanthinhphat.com/tem-nhan-mac-may-moc-dong-co-motor-bang-inox-an-mon-tp-hcm/)
Với một công ty th́ Tem nhăn động cơ (https://temnhanthinhphat.com/name-plate-motor-tem-nhan-dong-co-inox-aluminium-stainless-stel/) là sản phẩm không thể thiếu để khách hàng thấy sự chuyện nghiệp cũng như văn hóa tốt đẹp của công ty.

Tem nhăn Thịnh Phát là đơn vị cung cấp biển inox ăn ṃn hcm (https://temnhanthinhphat.com/bien-bang-inox-an-mon-tai-xuong-gia-re-tp-hcm/), tem inox ăn ṃn (https://temnhanthinhphat.com/tem-nhan-mac-inox-name-plate-name-tag-inox-an-mon-gia-re/) cho máy móc - công tŕnh công nghiệp dân dụng ... và tem nhôm (https://temnhanthinhphat.com/tem-nhom-an-mon-in-tem-nhom-tag-nhom-gia-re/) trên toàn quốc.
Những sản phẩm như biển inox ăn ṃn (https://temnhanthinhphat.com/tem-nhan-inox-bien-inox-an-mon-gia-re-tp-hcm/) hoặc là biển pḥng ban (https://temnhanthinhphat.com/bien-bang-ten-phong-ban-cong-ty-dep-bang-inox-an-mon/) th́ chúng tôi sẽ thiết kế và báo giá hoàn toàn miễn phí trước khi kư hợp đồng và sản xuất sản phẩm.
Bên cạnh đó với nhiều ưu điểm vượt trội th́ tem inox (https://temnhanthinhphat.com/san-xuat-tem-inox-tem-nhan-inox-an-mon-gia-re/) là sản phẩm được sử dụng rất phổ biến từ các máy móc gia đ́nh hằng ngày đến các công tŕnh công cộng hay các dự án công nghiệp lớn.
Để vinh danh cho nhân viên hoặc tổ chức cá nhân có thành tích hoặc thâm niên cống hiến th́ tem nhăn động cơ (https://temnhanthinhphat.com/lam-tem-nhan-dong-co-nhan-mac-may-moc-bang-inox-an-mon/) là một sản phẩm không thể thiếu.
Sau khi làm bảng hiệu alu (http://www.thanhthinhphat.com/lam-bien-bang-hieu-alu-mica-chu-noi-gia-re.htm) hoặc làm bảng hiệu (http://www.thanhthinhphat.com/) th́ các doanh nghiệp nên đặt các quà tặng doanh nghiệp (https://temnhanthinhphat.com/gia-cong-qua-tang/) để gửi tặng khách hàng đối tác để gắn kết hai công ty.
Biển bảng chỉ dẫn hay bảng hướng dẫn văn pḥng – ṭa nhà bằng kim loại vừa đảm bảo độ bền lại có tính thẩm mỹ cao đang được nhiều đơn vị lựa chọn.Tem Nhăn Thịnh Phát chuyên sản xuất trực tiếp tem inox ăn ṃn (http://www.thanhthinhphat.com/tem-inox-an-mon-gia-re.htm) các bảng biển chỉ dẫn bằng inox ăn ṃn (https://temnhanthinhphat.com/san-xuat-tem-nhan-inox-an-mon-gia-re/) , đồng ăn ṃn, biển hiệu công ty (https://temnhanthinhphat.com/gia-cong-an-mon-bien-bang/) , tem inox ăn ṃn (https://www.thanhthinhphat.net/tem-nhan-inox-an-mon/) giá rẻ với nhiều thiết kế đẹp và sang trọng cũng như gia công sản xuất theo thiết kế riêng theo yêu cầu,.

<img src="https://temnhanthinhphat.com/wp-content/uploads/2024/03/banner03-800x270.jpg" ]
biển chỉ dẫn inox ăn ṃn (https://temnhanthinhphat.com/san-xuat-gia-cong-bien-chi-dan-toa-nha-so-do-toa-nha-building/)

<img src="https://temnhanthinhphat.com/wp-content/uploads/2024/03/IMG_1039-533x400.jpg" ]
biển chỉ dẫn inox ăn ṃn

<img src="https://temnhanthinhphat.com/wp-content/uploads/2024/03/img-0745-533x400.jpg" ]
biển chỉ dẫn inox ăn ṃn

<img src="https://temnhanthinhphat.com/wp-content/uploads/2024/03/img-0748-533x400.jpg" ]
biển chỉ dẫn inox ăn ṃn

<img src="https://temnhanthinhphat.com/wp-content/uploads/2024/03/img-2697-600x800.jpg" ]
biển chỉ dẫn inox ăn ṃn

<img src="https://temnhanthinhphat.com/wp-content/uploads/2020/08/engraved-stainless-steel-floor-level-signs_01.jpg" ]
Tem inox ăn ṃn giá rẻ

<img src="https://temnhanthinhphat.com/wp-content/uploads/2020/08/skinnydip-london-marine-grade-brushed-stainless-steel-engraved-etched-sign-01.jpg" ]
Bảng hướng dẫn ṭa nhà bằng inox ăn ṃn


Với kinh nghiệm nhiều năm làm tem inox (https://temnhanthinhphat.com/lam-tem-nhan-inox-trang-xuoc-an-mon-gia-re/) bảng pḥng bằng inox (https://www.thanhthinhphat.net/bang-ten-phong-ban-inox-lam-bang-ten-phong-thanh-thinh-phat/) và đội ngũ kỹ thuật, thiết kế nhiệt t́nh – nhiều kinh nghiệm chắc chắn sẽ mang lại cho Quư khách hàng sự hài ḷng và thỏa măn nhất từ thiết kế đến chất liệu và giá cả khi quư khách có nhu cầu làm bảng hiệu (https://www.thanhthinhphat.net/xu-huong-lam-bang-hieu-quang-cao/).
Đặc biệt chúng tôi khảo sát và thiết kế miễn phí trên toàn miền Nam.
Về bảng hiệu chúng tôi nhận thi công tất cả các loại biển pḥng bằng inox (https://temnhanthinhphat.com/lam-bien-bang-inox-an-mon-gia-re-tp-hcm-inox-304-416/) như :
– Bảng hiệu Alu chữ nổi
– biển pḥng bằng inox (https://temnhanthinhphat.com/bien-bang-ten-phong-ban-cong-ty-dep-bang-inox-an-mon/) , Chữ nổi Mica, Chữ nổi Alu, có đèn Led hoặc không.
– Bảng Hiệu đá granite, bảng hiệu đá hoa cương (http://www.thanhthinhphat.com/mau-bang-hieu-da-hoa-cuong-granite-dep-gia-re.htm) có gắn chữ inox hoặc mica.
– Bảng hiệu sau quầy tiếp tân …
– Và các loại tem inox ăn ṃn (https://maps.app.goo.gl/xJAnBMUcmW2jHRTr6) khác,

Quảng Cáo Thanh Thịnh Phát với đội ngũ kiến trúc sư, thiết kế bảng hiệu đẹp (https://www.thanhthinhphat.net/muon-co-bang-hieu-dep-don-gian-thi-lam-the-nao/) giàu kinh nghiệm, đội ngũ thợ thi công chuyên nghiệp,… chuyên thiết kế và thi công lắp đặt đa dạng các loại biển chỉ dẫn hồ bơi (https://temnhanthinhphat.com/bien-bang-canh-bao-chi-dan-ho-boi-bang-inox-an-mon/), biển báo hồ bơi (https://temnhanthinhphat.com/bien-canh-bao-do-sau-be-boi-ho-boi-bang-inox-dong-an-mon/) làm bảng hiệu (http://www.thanhthinhphat.com/lam-bien-bang-hieu-alu-mica-chu-noi-gia-re.htm) , biển quảng cáo đẹp như biển công ty, biển tóc, chữ nổi quảng cáo, biển đèn Led, bảng hiệu đẹp (http://www.thanhthinhphat.com/nhung-mau-bang-hieu-shop-dep-nhat.htm) , biển quảng cáo điện tử, biển trivision, biển tấm lớn, bảng hiệu công ty (https://www.thanhthinhphat.net/mot-so-mau-bang-hieu-cong-ty-xay-dung-dep-2021/) hay bảng số nhà inox vàng xước (https://temnhanthinhphat.com/bien-bang-so-nha-dep-bang-inox-vang-xuoc-an-mon/) .…

Không chỉ đa dạng các loại Logo inox ăn ṃn (https://temnhanthinhphat.com/lam-logo-cong-ty-bang-inox-an-mon-gia-re-tp-hcm/) , chúng tôi c̣n làm bảng hiệu (http://www.thanhthinhphat.com/dich-vu-hcm/lam-bang-hieu-gia-re-hcm) trên nhiều chất liệu khác nhau như mica, đồng ăn ṃn, bạt, Aluminum Composite, Innox, … đạt yêu cầu, chất lượng, có tính thẩm mỹ cao đáp ứng được yêu cầu của đông đảo khách hàng làm bảng hiệu công ty (http://www.thanhthinhphat.com/nhung-mau-bang-hieu-cong-ty-dep-nhat.htm)

CrownRepack
13-06-2024, 01:16
Hi, can anyone help me with this error im getting, its just a simple picture i want to add to the language select startup box,

i have the necessary paths in my script but still get this error.

i already included in files section
[Files]
Source: "Files\spl.png"; DestDir: {tmp}; Flags: dontcopy

with all handles and in FMXDesigning i already
state

LangGameSplash.FCreate(LangForm.Handle);
LangGameSplash.SetBounds(5, 5, 266, 89);
LangGameSplash.FillPicture(ExpandConstant('{tmp}\s pl.png'), wmTileStretch);
LangGameSplash.HitTest(False);

but why i get this error that its not exist?

CrownRepack
13-06-2024, 02:05
Nevermind guys, sorry, the problem is i put "ExpandConstant" instead of "ExtractandLoad"
ughhh

Fak Eid
13-06-2024, 08:04
Can someone help me in creating these using style file?

Fak Eid
15-06-2024, 10:45
Does anyone have any idea how can this be implemented?
I have SettingsForm: FCustomFluentWindow, and I just want to display this section on the form, without having another pop-up. How can this be implemented?

Like we have FStartMenuFolderTreeView, but it can only be on HWND handler, like FMXForm.HandleHWND. I'd want it inside an FCustomPage.Handle

Fak Eid
17-06-2024, 00:18
Is this solution not suitable for you?

This is for the directory. If this can somehow display menu folders, it can work. I thought if this feature was already present (like FStartMenuFolderTreeView) and if there exist a standard way by which we can do it.

BLACKFIRE69
17-06-2024, 09:10
App: FXSignVerifier, A Signature Verifier For FMXInno
Date: 2024-June-16
Compiler: Zig v0.12.1


From now on, every FMXInno update attachment will be signed with a digital signature to verify that the update comes from a trusted source (in this case, me) and has not been tampered with.

So, what's the actual big deal with digital signing over checksum? Is a checksum not enough?


Checksum:

1. No, a checksum is not enough. A checksum is used to verify the integrity of a file. It ensures that the file has not been corrupted or altered during transmission or storage.

2. Checksums are not secure against intentional tampering because if someone alters the file, they can also recompute the checksum.

3. Additionally, a checksum doesn't ensure that the file is coming from the original author (a trusted source).

Digital Signature:

1. That's why digital signing comes in handy. A digital signature provides both integrity and authenticity. It ensures that the file has not been corrupted or altered and verifies the identity of the author.

2. Digital signatures are much more secure. They provide strong guarantees against tampering and forgery because the private key is known only to the signer (author).

3. They ensure the origin of the file (authenticity) and protect against modifications/corruptions (integrity).


Usage:
FXSignVerifier.exe [-s sig_file] <-k pubkey> <-i file>


* You'll find the signature file and the public key for the latest version of FMXInno (2024-June-10) (.rar).
* The signature file will look like this:


-----BEGIN SIGNATURE-----
Signature: signature from private key
RUTMYX9YetwBhHoWjuISrHpxLpFyXg2XiG02ff4cknKQU/6CAGlDsEIzuptvOLwACYfwEZhxNU9BRs4Kk78+obqIjcAPLkXU uQI=
Trusted: timestamp:1718633776, file:FMXInno + SKIA + Blend2D - Final Release [2024-June-10].rar, prehashed
3k+phFDdOLHstaec5OdCDUgQ2mEtZj1x4wpLkRPxGadrhSLovK 7TCBvb8Utsxj4JcYyxHkAjP0BbTBAVFRNzBA==
------END SIGNATURE------




.

hitman797
17-06-2024, 10:53
This is for the directory. If this can somehow display menu folders, it can work. I thought if this feature was already present (like FStartMenuFolderTreeView) and if there exist a standard way by which we can do it.
use this procedure.

procedure SetPaths(const AUserPrograms, ACommonPrograms, AUserStartup, ACommonStartup: String);

Fak Eid
19-06-2024, 13:24
@Blackfire69, Any idea how to import [Files] conditionally using FNewINI? No with pre-processor.

Any update on these?
FStartmenuFolderTreeView (https://fileforums.com/showpost.php?p=504808&postcount=828)
HTMLViewer to play YT video (https://fileforums.com/showpost.php?p=504783&postcount=819)
FDiskList enhancement and .mp4 support for FVideoPlayer (https://fileforums.com/showpost.php?p=504790&postcount=820)

I tried this with HTML Viewer with WebView, but the huge logos of YT headbar takes the whole screen. My dimension for showing this is small. Anyways, if this can be done, will be a huge help for my Steam Limitless, as then the user won't have to import and include the video file in Setup.

Fak Eid
24-06-2024, 04:12
This can read all single values of your Installer.ini without any use of plugin. Check example here (https://fileforums.com/showpost.php?p=504819&postcount=66) or here (https://fileforums.com/showpost.php?p=503761&postcount=28)

#define ReadInstaller(Section, Key, Default) ReadIni(SourcePath + "Game\Installer.ini", Section, Key, Default)

[Setup]
AllowNoIcons=yes
AllowRootDirectory=true
AppId={{F9787790-D97B-457E-80DA-F69C91F862A8}
AppName={#ReadInstaller("Installer", "Name", "")}
AppVersion=1.0
AppCopyright=Random_Gamertags
DefaultDirName=C:\{#ReadInstaller("Installer", "DirName", "")}

CrownRepack
28-06-2024, 11:29
Hi, I'm trying to add a function in my installer similar to CODEX or FLT installer where there's a checkbox that is "Copy Crack from directory" or "Apply Crack" ,

I want to repack the game in its original uncracked state and do multiple selections for a crack, so what I want is someone to help me write a code, or there is a template to basically just copy the crack from a specific folder

For example I have a game Cuphead, and in the main directory folder of the game I have a folder called "Crack" and in there I have the cracks

So what's the code to basically just copy the contents of the Crack folder to the game after installing if the user checks the checkbox... thank you

Fak Eid
28-06-2024, 12:25
You should rather put your "Crack" folder in source than in application installation location. I prefer that.

[Files]
Source: "{src}\Crack\*"; DestDir: "{app}"; Check: ApplyCrack

function ApplyCrack: Boolean;
begin
Result := Checkbox[1].IsChecked;
end;

Fak Eid
29-06-2024, 02:12
I wouldn't do that for several reasons. The antivirus scan block this executable file. It can be replaced by an administrator or a moderator of an internet resource (or someone else when they post this repack on their site). We need to check whether the real file was actually copied from that folder, or if it was replaced (We need to check the file size or its hash value.). Only then "Result:=True". In general, you're trying to complicate things and invent a new wheel, even though it's already been invented for a long time. It would be much clearer if you had the executable file in a single archive.:o

Alternate to that, if you really want to do so, you can compress 'Crack' folder like crack.bin and extract it just like additional component based on checkbox click. you can verify that crack.bin in your installer itself, then.

ErinMonroe
02-07-2024, 05:15
Is there a way to add a serial key page using this style? I am new to this!

Fak Eid
02-07-2024, 05:39
Is there a way to add a serial key page using this style? I am new to this!

You can refer Example_QuickMsg_3.iss from the main post

ErinMonroe
04-07-2024, 06:00
How do I activate the lock screen on this as in the example the lock screen does not appear to work.

Fak Eid
11-07-2024, 13:05
I have a CustomForm: FCustomFluentWindow on which I have a 'browse' button for Directory change. When I click on it, I have DirBrowseDlg: FFLuentDirBrowse, which keeps flickering. The reason it is flickering is because the CustomForm is still open. If I close that CustomForm, the flickering stop.

@Blackfire, please acknowledge this issue to either fix it, or as a workaround I'm closing the CustomForm when 'Browse' button is clicked, but want Custom.Show after the user clicks on 'Ok'/'Cancel' on DirBrowseDlg. Can anybody help me with code snippet?

I might need
procedure ButtonOnMouseClick(ButtonIndex: Integer; Event: TNotifyEvent);

Fak Eid
12-07-2024, 05:39
Even with this solution, we would still require an event listener like:
procedure ButtonOnMouseClick(ButtonIndex: Integer; Event: TNotifyEvent);

or else how will it enter @CommonOnClick code block, without creating custom buttons for ok and cancel.

BLACKFIRE69
14-07-2024, 12:36
FMXInno Custom Shapes:


Is it boring to use regular shapes every time? if so, you can start creating your own shapes to use in FMXInno.


.

BLACKFIRE69
16-07-2024, 04:03
hmm...
cool :p

.

BLACKFIRE69
27-07-2024, 03:46
-- Frequent Requests from the FMXInno Community --


* Users frequently ask how to play videos (locally/web) through WebView2.
* it's not a big deal; it can be done using a simple HTML file and/or just HTML content.


- So, i decided to give you some examples. in the attachment, you'll find 6 examples related to this.

- Here, i've used inline-CSS for styles and ease of use. but you don't have to do it this way; you can have a separate CSS file (Style.css) for this purpose.

- As i mentioned before, you can achieve this in two ways: either by generating an HTML file at runtime or by using HTML content instead of a file. however, there're some limitations with HTML content. with this approach, you may not have the auto-run feature, and you need to do folder mapping for resources. so, i personally prefer generating an HTML file at runtime; it's much easier.

- It's possible to control video playback (pause, resume, stop, etc.) through WebView2 by injecting JavaScript into the HTML file loaded in the WebView2 control. you can call these JavaScript functions from FMXInno code using the ExecuteScript method of WebView2.

- Also, you'll find a simple tool (_TxtToDelphiStr.exe) in the attachment that converts an HTML file to a Delphi/Inno string, saving you time.

- The HTML content in the examples is not exactly the same as the output of '_TxtToDelphiStr.exe' because i've made some necessary changes to make everything work. so, don't get things mixed up.

- I've updated the WebView2 to the latest version in the FMXInno DLL.

- These examples are only for Windows 10 and Windows 11 as WebView2 requires the 'WebView2 Runtime' to be installed on the system.

- Alternatively, download the WebView2 Runtime manually for unsupported systems. Download Microsoft WebView2
(https://developer.microsoft.com/en-us/microsoft-edge/webview2/consumer/?form=MA13LH)



.

Fak Eid
29-07-2024, 13:24
What are the chances that Epic Games updated their UI few days after I created an installer that looks like it. Draining all my efforts :(

Tihiy_Don
29-07-2024, 21:00
What are the chances that Epic Games updated their UI few days after I created an installer that looks like it. Draining all my efforts :(

They specifically looked at your installer to change the design. Gabe told me himself.

Fak Eid
30-07-2024, 15:06
Any idea how can I bring this section to the front in case of using WebView? When using FImage, on the click of Downloads button I'm doing DownloadInfo.BringToFront; which doesn't seem to be working in case of FWebView.

As an alternate, I'm hiding the FWebView when the Download Info section is opened, but it looks clumsy and not good. If we can display this over it, would be really good.

Fak Eid
05-08-2024, 02:41
Hi @Blackfire,

I personally believe that WebView has too much of unexplored potential just like FNewINI and there are numerous amount of possibility with it.
- Can we have SetBounds and IsVisible parameters on FWebView2Obj?
- Can we make it dependent on FRectangle handles completely instead of FMXForm.Handle?

I might be asking for more features on it.
Including these parameters will help me to add WebView in my Steam Limitless installer.

Fak Eid
05-08-2024, 07:17
Real life examples are in Epic Games Installer (https://fileforums.com/showpost.php?p=505135&postcount=98)

Generic WebView Example
You can reuse the attached WebView.html like this:


[Files]
Source: "Files\Web\WebView.html"; DestDir: "{tmp}"; Flags: dontcopy;

procedure LoadHtmlContent(Width, Height: Integer; SrcURL: WideString);
var
sHtml, VideoId: Widestring;
sTemplate: AnsiString;
Sl: TStringList;
begin
VideoId := Copy(SrcURL, Pos('v=', SrcURL) + 2, 11);
LoadStringFromFile(ExtractAndLoad('WebView.html'), sTemplate);
sHtml := Format(sTemplate, [Width, Height, VideoId]);

Sl := TStringList.Create;
try
Sl.Text := sHtml;
Sl.SaveToFile(ExpandConstant('{tmp}\WebView.html') );
finally
Sl.Free;
end;
end;

LoadHtmlContent(680, 384, 'https://www.youtube.com/ watch?v=hS7ZY7oLCS4&ab_channel=RANDOMGAMERTAGS');

TrailerRect.FCreate(FMXForm.Handle);
TrailerRect.SetBounds(250, 145, 680, 383);
TrailerRect.Opacity(0);
TrailerRect.HitTest(False);

TrailerWebView.FCreate(FMXForm.Handle, TrailerRect.Handle, ExpandConstant('{tmp}\WebView.html'));
TrailerWebView.Start;

Custom Image Slideshow
The need for this was because both type of Image Slideshow were dependent on FMXForm and couldn't be overlayed with a different component. Hence, I had to go with creating my own.

j: Integer;
GameImage: FImage;
SlideShowTimer: FTimer;

GameImage.FCreate(FMXForm.Handle);
GameImage.SetBounds(250, 145, 680, 383);
GameImage.LoadPicture(ExtractAndLoad('Image0.jpg') , iwStretch);
GameImage.Opacity(1);

SlideShowTimer.FCreate(GameImage.Handle, True);
SlideShowTimer.Interval(100);
SlideShowTimer.OnTimer(@ChangeSlide);

procedure ChangeSlide(Sender: TObject);
var
Time: Cardinal;
SlideOpacity: Single;
begin
if GameImage.GetOpacity = 1 then Slider := False
else if GameImage.GetOpacity = 0 then begin
GameImage.LoadPicture(ExtractAndLoad('Image' + IntToStr(j) +'.jpg'), iwStretch);
j := j+1;
Slider := True;
end;

if (Slider = False) and not (GameImage.GetOpacity = 0) then SlideOpacity := GameImage.GetOpacity - 0.05
else if (Slider = True) and not(GameImage.GetOpacity = 1) then SlideOpacity := GameImage.GetOpacity + 0.05;
GameImage.Opacity(SlideOpacity);

#ifdef NumberOfSlides
if j = {#NumberOfSlides} then j := 0;
#endif
end;

What is NumberOfSlides?
Settings.ini has a parameter as Number of Slides where you need to define the number of Image Files from the folder, to be included in the slideshow.

BLACKFIRE69
16-08-2024, 22:33
FMXInno - Updates


* Let me know if you would like to have the FCustomMemo in future updates. it's an advanced Memo component i used previously in the Avalon Installer (https://fileforums.com/showpost.php?p=504986&postcount=80), and it originally comes with FMXInno v1.0.0.3.


Features:
1. Fully customizable overall.

2. Ability to customize individual items/lines.

3. Each item/line can be either text or any object (Rectangle, Image, FMXInno Blueprint, etc.) you prefer.

4. Each line's height and width can be adjusted individually.

5. Supports navigation, scrollbars, and more.


.

Fak Eid
16-08-2024, 23:21
I wouldn't mind.. It is always more convenient to customize. I already have some ideas. My new work can wait to have it. Can you also include these (https://fileforums.com/showpost.php?p=505194&postcount=852) in the update too?

BLACKFIRE69
17-08-2024, 01:00
Can you also include these (https://fileforums.com/showpost.php?p=505194&postcount=852) in the update too?


FireMonkey is a different story.

while working with FireMonkey (FMX), especially when integrating with native components like WebView2, there're certain limitations due to how FMX and the underlying platform handle windows and rendering. FMX is designed to be cross-platform, with a focus on vector-based, hardware-accelerated graphics, while traditional controls like WebView2 rely on native Windows-specific window handles (HWND) to be embedded.

to embed WebView2 within a FireMonkey form, we use 'FMXForm.Handle', which provides the necessary window handle (HWND) for WebView2 to render its content. this works because a form in FMX has an associated native window, and we can retrieve its handle.

however, FMX objects like 'TRectangle', 'TPanel', and other 'TFMXObject' descendants don't have an underlying native window (HWND). they're drawn directly onto the GPU and managed by the FireMonkey rendering engine, which makes them platform-agnostic but without any native window handle. since WebView2 requires an actual window handle to render its content, it isn't possible to use a 'TFMXObject' like 'TRectangle' as the parent window for WebView2.

in essence, FireMonkey objects and native components like WebView2 operate in fundamentally different ways. while you can embed WebView2 inside a FireMonkey form by setting the parent window to the form handle, using a 'TFMXObject' as a parent isn't feasible due to the lack of a native window handle in FireMonkey controls.


not only the ones you mentioned, but i also want to add more. however, it isn’t possible due to compatibility limitations.


.

BLACKFIRE69
19-08-2024, 10:05
@BLACKFIRE69
Can you help me with ini? you need to install files directly from the installer and not from the archives

[Components]
Name: "program1"; Description: "Program 1"
Name: "program2"; Description: "Program 2"
Name: "program3"; Description: "Program 3"
Name: "program4"; Description: "Program 4"
Name: "program5"; Description: "Program 5"

[Files]
Source: "program1.exe"; DestDir: "{app}"; Components: program1
Source: "program2.exe"; DestDir: "{app}"; Components: program2
Source: "program3.exe"; DestDir: "{app}"; Components: program3
Source: "program4.exe"; DestDir: "{app}"; Components: program4
Source: "program5.exe"; DestDir: "{app}"; Components: program5


@audiofeel,

i've provided two examples below: one uses regular Checkboxes, and the other uses CheckboxTree. you can use them as a reference.


Note:

i discovered unexpected behavior in MInI. it's a generic issue, not an error on my part. however, i applied a hotfix for it. you can download MInI and FMXInno [June-10] below.


.

BLACKFIRE69
27-08-2024, 10:53
[ FMXInno Cumulative Update - 2024/Aug/28 ]


--- Changelog

* Added Custom Blueprints:
1. 'FAdvancedMemo'
2. 'FAdvancedShape'
3. '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:

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;
// 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(csContentSelectBo x1.Handle); // Selectbox
csNotifyContent1.AddButton(csContentBtnSend.Handle ); // Send Button
csNotifyContent1.AddButton(csContentBtnCancel.Hand le); // Cancel Button
csNotifyContent1.AddButton(csContentBtnOk.Handle); // Ok Button

csNotifyContent1.AddImage(csContentHeaderImage.Han dle); // 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);


Advanced Shapes:

* 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:

1. w3.org/SVG (https://www.w3.org/TR/SVG/paths.html)
2. css-tricks.com/SVG-Syntax (https://css-tricks.com/svg-path-syntax-illustrated-guide/)

* Below is a code snippet:
{ 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);



The first post has been updated—check it out!



.

Fak Eid
03-09-2024, 13:01
When trying to create an .ini file for setting config of my installer using:
INI_Maker: FNewINI;
INI_Maker.FCreate(ExpandConstant('{src}\Game\Insta ller.ini'));

it is creating the file in UTF-8 with BOM which is messing with Inno Compiler and not producing the desired result. How can I have FNewINI to create the file in UTF-8 format.

In case when the main section say [Execs] doesn't exists and we create the SubSection using FNewINI:
INI_Maker.WriteSubString('Execs', 'AppExe'+IntToStr(j), 'Name', ExeEdit[i].GetText);
INI_Maker.WriteSubString('Execs', 'AppExe'+IntToStr(j), 'Filepath', ExeEdit[i+1].GetText);
INI_Maker.WriteSubString('Execs', 'AppExe'+IntToStr(j), 'Parameters', ExeEdit[i+2].GetText);

It does not create the main section.
Desired output should be:
[Execs]
[Execs\AppExe1]
Name=Horizon Forbidden West
Filepath=HorizonForbiddenWest.exe
Parameters=--fullscreen

It is like this instead:
[Execs\AppExe1]
Name=Horizon Forbidden West
Filepath=HorizonForbiddenWest.exe
Parameters=--fullscreen

FCombineText
No Mouse Actions like: OnMouseEnter, OnMouseLeave, OnClick are working

Tihiy_Don
03-09-2024, 23:03
- 'pWinNotification' has been removed.

Very sorry. I've just used Windows-style notifications in my latest releases.

Tihiy_Don
10-09-2024, 21:02
Please add methods:
onMouseEnter(Event: TNotifyEvent); procedure onMouseLeave(Event: TNotifyEvent);

For the checkboxtree component (checkbox, radiobutton).

Qirashi
12-09-2024, 01:38
There is a problem with the RemoveObject2 method for FCombobox. It does not work properly and does not delete the specified element.

Dario06
16-09-2024, 12:06
Hi everyone
hi BLACKFIRE69, I want to remove all the button mods and leave them original anthem, browse, back, next, cancel and pause, can we do that?

BLACKFIRE69
27-10-2024, 06:19
FMXInno Quality Update - [October 27, 2024]


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.


.

Qirashi
18-11-2024, 13:20
https://cdn.discordapp.com/attachments/673561048338661386/1308178340221423626/image.png?ex=673cff85&is=673bae05&hm=4799d62ca63a34185912484dceb9a12379616347cd38dee 83cc872c08508db81&

I had a question and a suggestion on "FCheckboxTree". I hope the difficulties of translation allow me to get my point across.

When using FCheckboxTree, the logic of the Checkbox is slightly different than in the original inno setup. In the original, when selecting 1 of the components in the Checkbox tree, all those that are somehow related to the selected one are selected. I hope you understand me. In FMX, this is implemented a little differently. They are not always marked, which looks strange from the 1st side. It would be cool to see similar logic to the original inno setup.

Even in FCheckboxTree, you cannot select and remove Radiobutton, they are in FCheckboxTree, but it is problematic to combine them with regular Checkboxes.

Tihiy_Don
23-01-2025, 21:38
In Inno Setup version 6.4.0, there are issues with FMX, specifically with the procedure:
pTaskbarPreviewEx(FMXForm.HandleHWND, True);

After launching the main form, the following message appears:
"Taskbar cannot find window handles"

And shortly after that:
"Failed to initialize the taskbar. TaskbarPreviewEx failed"

Budakgamers9849
28-05-2025, 06:34
https://imgur.com/IL2I8fR

Can you help me? What compressor is supported with this setup, I've searched but couldn't find it.

Masquerade
11-06-2025, 11:48
Hi BLACKFIRE69,

It seems that installers built with FMXInno do not load correctly when running under Linux. I understand asking to support Linux is a huge ask, so I was wondering if you could add some form of bypass to FMXInno so that if the installer is detected to be running under Wine, it only loads the absolute bare minimum to result in no crashes?

Thanks!

XH75819116
30-06-2025, 03:53
Gods please teach a problem: when the background is gif files, why encounter older hard drives, such as ssd's hard drive to release the file is very slow and slow, innosetup code: TopLayer.FCreate(FMXForm.Handle);
TopLayer.SetBounds(FMXForm.GetLeft, FMXForm.GetTop, FMXForm.GetWidth, (50));

GifImg.FCreate(TopLayer.Handle, ExtractAndLoad('9.gif'), True);
//GifImg.Opacity(0.1);
GifImg.SetBounds(0, 0, {#BaseWidth}, {#BaseHeight});

XH75819116
30-06-2025, 05:24
My guess is that there are too many frames in your gif animation file or its size is large. my example uses a gif animation with a minimum framerate and a size of 1.35 MB. Yes, there is a delay, but it is minimal.

I'll test it. Thanks.

jojo670
11-10-2025, 21:32
Thank you very much for this very complete and high-quality package.

Saifuddin
03-01-2026, 00:55
https://s12.gifyu.com/images/bhv3s.png
1. How to fix: Selecting Drive other than C drive does'nt update free space
2. How to add command-line parameters to desktop shortcut

Saifuddin
06-01-2026, 22:23
[Execs]
; AppExe1=Tile Caption|Exec Directory|Exec File|Shortcut Name|Parameters|IconFilename|IconIndex
AppExe1=Red Dead Redemption 2||Launcher.exe|Red Dead Redemption 2 v1.0.1436|-fullscreen -skipintro|{app}\RDR2_icon.ico|0

[Icons]
#ifdef AppExe1
Name: {group}\{#E1[62]}; Filename: {app}\{#E1[60]}\{#E1[61]}; Parameters: {#E1[63]}; IconFilename: {#E1[64]}; IconIndex: {#E1[65]}; WorkingDir: {app}\{#E1[60]}; Check: CreateShortcuts1;
Name: {commondesktop}\{#E1[62]}; Filename: {app}\{#E1[60]}\{#E1[61]}; Parameters: {#E1[63]}; IconFilename: {#E1[64]}; IconIndex: {#E1[65]}; WorkingDir: {app}\{#E1[60]}; Check: CreateShortcuts1;
#endif
Thank you!

BLACKFIRE69
08-04-2026, 12:33
I’m really sorry it took me a long time to come up with something new for the FMXInno project.
There were several personal matters I had to go through,
and I didn’t have enough time to focus on the project I started.

Long story short,
I am a Full Stack Engineer, and my younger sister is a Software Engineer.
We both received new career opportunities far away from our hometown.
We decided to take those opportunities and moved away.

It took much longer than expected to settle down, and I am currently doing a few remote jobs,
so it hasn’t been easy to find free time.

I couldn’t finish the FMXInno December 2024 update (more than a year ago).
I will come back with an update, but please give me some time.

Thanks.