diff --git a/Components/NewTabSet.pas b/Components/NewTabSet.pas index 6f06ba2d7..793f3e080 100644 --- a/Components/NewTabSet.pas +++ b/Components/NewTabSet.pas @@ -198,7 +198,9 @@ procedure TNewTabSet.CreateWnd; destructor TNewTabSet.Destroy; begin UpdateThemeData(False); + FHints.Free; FTabs.Free; + FCloseButtons.Free; inherited; end; diff --git a/ISHelp/isxfunc.xml b/ISHelp/isxfunc.xml index e8172cbb2..f2caf2138 100644 --- a/ISHelp/isxfunc.xml +++ b/ISHelp/isxfunc.xml @@ -1849,7 +1849,7 @@ end;

The archive must not be encrypted.

Set OnExtractionProgress to a function to be informed of progress, or nil otherwise.

TOnExtractionProgress is defined as:

-

TOnExtractionProgress = function(const ArchiveName, FileName: string; const Progress, ProgressMax: Int64): Boolean;

+

TOnExtractionProgress = function(const ArchiveName, FileName: String; const Progress, ProgressMax: Int64): Boolean;

Return True to allow the extraction to continue, False otherwise.

Extract7ZipArchive uses an embedded version of the "7z ANSI-C Decoder" from the LZMA SDK by Igor Pavlov, as-is, except that Unicode support and error messages were improved and that it outputs memory requirements.

All output of the decoder is logged if logging is enabled, including error messages but excluding empty lines.

diff --git a/Projects/Src/Compiler.ScriptFunc.pas b/Projects/Src/Compiler.ScriptFunc.pas index 332e02a8d..9e8ca50b0 100644 --- a/Projects/Src/Compiler.ScriptFunc.pas +++ b/Projects/Src/Compiler.ScriptFunc.pas @@ -140,8 +140,8 @@ procedure ScriptFuncLibraryRegister_C(ScriptCompiler: TPSPascalCompiler; ' SuiteMask: Word;' + 'end'); - RegisterType('TOnDownloadProgress', 'function(const Url, FileName: string; const Progress, ProgressMax: Int64): Boolean;'); - RegisterType('TOnExtractionProgress', 'function(const ArchiveName, FileName: string; const Progress, ProgressMax: Int64): Boolean;'); + RegisterType('TOnDownloadProgress', 'function(const Url, FileName: String; const Progress, ProgressMax: Int64): Boolean;'); + RegisterType('TOnExtractionProgress', 'function(const ArchiveName, FileName: String; const Progress, ProgressMax: Int64): Boolean;'); RegisterType('TOnLog', 'procedure(const S: String; const Error, FirstLine: Boolean);'); for var ScriptFuncTable in ScriptFuncTables do diff --git a/Projects/Src/IDE.MainForm.pas b/Projects/Src/IDE.MainForm.pas index 2f3357534..d1755cca6 100644 --- a/Projects/Src/IDE.MainForm.pas +++ b/Projects/Src/IDE.MainForm.pas @@ -473,6 +473,7 @@ TMainForm = class(TUIStateForm) FBuildAnimationFrame: Cardinal; FLastAnimationTick: DWORD; FProgress, FProgressMax: Cardinal; + FTaskbarProgressValue: Cardinal; FProgressThemeData: HTHEME; FMenuThemeData: HTHEME; FToolbarThemeData: HTHEME; @@ -2312,6 +2313,7 @@ procedure TMainForm.CompileFile(AFilename: String; const ReadFromFile: Boolean); FBuildAnimationFrame := 0; FProgress := 0; FProgressMax := 0; + FTaskbarProgressValue := 0; FActiveMemo.CancelAutoCompleteAndCallTip; FActiveMemo.Cursor := crAppStart; @@ -7108,16 +7110,15 @@ procedure TMainForm.InvalidateStatusPanel(const Index: Integer); procedure TMainForm.UpdateCompileStatusPanels(const AProgress, AProgressMax: Cardinal; const ASecondsRemaining: Integer; const ABytesCompressedPerSecond: Cardinal); -var - T: DWORD; begin - { Icon panel } - T := GetTickCount; - if Cardinal(T - FLastAnimationTick) >= Cardinal(500) then begin - FLastAnimationTick := T; + var CurTick := GetTickCount; + var LastTick := FLastAnimationTick; + FLastAnimationTick := CurTick; + + { Icon and text panels - updated every 500ms } + if CurTick div 500 <> LastTick div 500 then begin InvalidateStatusPanel(spCompileIcon); FBuildAnimationFrame := (FBuildAnimationFrame + 1) mod 4; - { Also update the status text twice a second } if ASecondsRemaining >= 0 then StatusBar.Panels[spExtraStatus].Text := Format( ' Estimated time remaining: %.2d%s%.2d%s%.2d Average KB/sec: %.0n', @@ -7128,13 +7129,29 @@ procedure TMainForm.UpdateCompileStatusPanels(const AProgress, StatusBar.Panels[spExtraStatus].Text := ''; end; - { Progress panel and taskbar progress bar } - if (FProgress <> AProgress) or - (FProgressMax <> AProgressMax) then begin + { Progress panel and taskbar progress bar - updated every 100ms } + if (CurTick div 100 <> LastTick div 100) and + ((FProgress <> AProgress) or (FProgressMax <> AProgressMax)) then begin FProgress := AProgress; FProgressMax := AProgressMax; InvalidateStatusPanel(spCompileProgress); - SetAppTaskbarProgressValue(AProgress, AProgressMax); + + { The taskbar progress updates are slow (on Windows 11). Limiting the + range to 64 instead of 1024 improved compression KB/sec by about 4% + (9000 to 9400) when the rate limit above is disabled. } + var NewValue: Cardinal := 1; { must be at least 1 for progress bar to show } + if AProgressMax > 0 then begin + { Not using MulDiv here to avoid rounding up } + NewValue := (AProgress * 64) div AProgressMax; + if NewValue = 0 then + NewValue := 1; + end; + { Don't call the function if the value hasn't changed, just in case there's + a performance penalty. (There doesn't appear to be on Windows 11.) } + if FTaskbarProgressValue <> NewValue then begin + FTaskbarProgressValue := NewValue; + SetAppTaskbarProgressValue(NewValue, 64); + end; end; end;