Quote:
Originally Posted by Cesar82
The IsDone callback function (ProgressCallback) does not display the names of all files.
This function is called 4 times per second and only the current filename is shown in the output.
If you use a native installation of Inno Setup (No UnArc/ISDone) it will only remove the installed files.
But for you to continue using your script you can create a list using FindFirst and FindNext of all the files that are in the game folder right after the ISDoneInit function.
After the ISDoneStop function you do a new check using FindFirst and FindNext and compare the names with the previous list using:
if oldfileslist.IndexOf(<fullfilename>) < 0 then ins_log.Append(<fullfilename>);
|
Here is my ProgressCallback code
Code:
procedure DeinitializeSetup;
begin
BASS_Free;
ForceCloseApp(ExpandConstant('{tmp}'));
end;
function ProgressCallback(OveralPct,CurrentPct: integer;CurrentFile,TimeStr1,TimeStr2,TimeStr3:PAnsiChar): longword;
var
s : AnsiString;
FCurrentFile : String;
begin
if OveralPct<=1000 then ProgressBar.Value(OveralPct);
WizardForm.ProgressGauge.Position:=OveralPct;
FinishLabl5.Text(ExpandConstant('{cm:TIME_TAKEN} ')+TimeStr2);
InsPageLabl4.Text(ExpandConstant('Осталось около: ')+TimeStr1);
InsPageLabl5.Text(ExpandConstant('Прошло около: ')+TimeStr2);
InsPageLabl6.Text(IntToStr(Round(OveralPct div 10))+'% ИЗВЛЕЧЕНО ФАЙЛОВ');
s := ExpandConstant('{cm:Extracting} ') + CurrentFile;
If InsLogBox.LineStrings(InsLogBox.LineCount - 1) <> s Then
begin
FCurrentFile := MinimizePathName(ExpandConstant('{cm:Extracting} ') +CurrentFile, WizardForm.ReadyMemo.Font, 500 - ScaleX(50))
InsLogBox.AddLine(FCurrentFile);
end;
Result := ISDoneCancel;
end;
procedure CurStepChanged(CurStep: TSetupStep);
var
ResultCode:Integer;
begin
if CurStep = ssPostInstall then
begin
ISDoneError:=true;
if ISDoneInit(ExpandConstant('{tmp}\records.inf'), 5555, 0,0,0, MainForm.Handle, 512, @ProgressCallback) then begin
repeat
ChangeLanguage('english');
SetIniString('srep','temp',ExpandConstant('{app}'),ExpandConstant('{tmp}\cls.ini'));
Installing:=true;
#ifdef Data1
if not ISArcExtract ( 0, {#D1[61]}, ExpandConstant('{src}\{#D1[60]}'), ExpandConstant('{app}'), '', false,('{#Dat1}'), ExpandConstant('{tmp}\arc.ini'), ExpandConstant('{app}\temp'), false) then break;
#ifdef Data2
if not ISArcExtract ( 0, {#D2[61]}, ExpandConstant('{src}\{#D2[60]}'), ExpandConstant('{app}'), '', false,('{#Dat2}'), ExpandConstant('{tmp}\arc.ini'), ExpandConstant('{app}\temp'), false) then break;
#ifdef Data3
if not ISArcExtract ( 0, {#D3[61]}, ExpandConstant('{src}\{#D3[60]}'), ExpandConstant('{app}'), '', false,('{#Dat3}'), ExpandConstant('{tmp}\arc.ini'), ExpandConstant('{app}\temp'), false) then break;
#ifdef Data4
if not ISArcExtract ( 0, {#D4[61]}, ExpandConstant('{src}\{#D4[60]}'), ExpandConstant('{app}'), '', false,('{#Dat4}'), ExpandConstant('{tmp}\arc.ini'), ExpandConstant('{app}\temp'), false) then break;
#ifdef Data5
if not ISArcExtract ( 0, {#D5[61]}, ExpandConstant('{src}\{#D5[60]}'), ExpandConstant('{app}'), '', false,('{#Dat5}'), ExpandConstant('{tmp}\arc.ini'), ExpandConstant('{app}\temp'), false) then break;
#ifdef Data6
if not ISArcExtract ( 0, {#D6[61]}, ExpandConstant('{src}\{#D6[60]}'), ExpandConstant('{app}'), '', false,('{#Dat6}'), ExpandConstant('{tmp}\arc.ini'), ExpandConstant('{app}\temp'), false) then break;
#endif
#endif
#endif
#endif
#endif
#endif
ISDoneError:=false;
until true;
ISDoneStop;
end;
end;
If you can, please attach an example that I can lean on - it will be easier for me to understand and change my code.
And perhaps an IsDone can be substituted?
UPD/
I have information displayed in FMemo (InsLogBox : FMemo

, can it also be saved to a file?
Code:
s := ExpandConstant('{cm:Extracting} ') + CurrentFile;
If InsLogBox.LineStrings(InsLogBox.LineCount - 1) <> s Then
begin
FCurrentFile := MinimizePathName(ExpandConstant('{cm:Extracting} ') +CurrentFile, WizardForm.ReadyMemo.Font, 500 - ScaleX(50))
InsLogBox.AddLine(FCurrentFile);