Inno Setup (создание инсталяционных пакетов)

Статус
В этой теме нельзя размещать новые ответы.

Mailchik

Старожил
Проверенный
vint56,
Код:
procedure(CurPageID: Integer; var Cancel, Confirm: Boolean);
Такое объявление только у события стандартной кнопки отмены. У нестандартных:
Код:
procedure(Sender: TObject);
Саня другое имел в виду. Не присваивайте кнопке отмены на этапе инсталляции никакого события. Просто вставьте в скрипт код, который дал LexBell.
[HR][/HR]

Shift85,
Код:
ProgressBar_BitmapImage.SetBounds( 0, 0, intOldCurrWidth, ProgressBar_ImageHeight );
3-й параметр - ширина, 4-й - высота.
 

vint56

Ветеран
Проверенный
Mailchik спасибо за разъяснения но дело в том что если поменять if CurStep = ssInstall then begin на Post кнопка не работает
 

Mailchik

Старожил
Проверенный
vint56, да, есть такое дело. Inno он такой... Тогда остаётся использовать своё событие для кнопки отмены.
 

Shift85

Старожил
Как задать сдесь ширину прогресс бара вставляю стандартные координаты не работают

Код:
CurrWidth := ( Position * Width ) / Max;
 

LexBell

Борода
Супер модератор
если поменять if CurStep = ssInstall then begin на Post кнопка не работает
можно взять булевый флаг и им это дело отрегулировать. это добавит 2 строчки кода и будет все равно более корректно, чем менять назначение стандартной кнопки насовсем.

[SOURCE="iss"]var
IsDoneUnpack : Boolean;

procedure CurStepChanged(CurStep: TSetupStep);
begin
IsDoneUnpack := False;
if CurStep = ssPostInstall then
begin
IsDoneUnpack := True; // это добавляем перед инициализацией IsDone
// тут вся работа IsDone
end;
end;


procedure CancelButtonClick(CurPageID: Integer; var Cancel, Confirm: Boolean);
begin
if ((CurPageID = wpInstalling) and IsDoneUnpack) then
begin
SuspendProc; // ставим распаковку, или чего там сейчас IsDone делает, на паузу
if ExitSetupMsgBox then ISDoneCancel:=1; // настоящая отмена происходит тут
Confirm := False; // убираем запрос подтверждения выхода
Cancel := False; // да и саму отмену тоже запрещаем, что-бы библиотека IsDone могла корректно отработать
ResumeProc; // продолжаем работу IsDone с учетом изменивхшихся или не изменившихся условий
end;
end;[/SOURCE]
 

vint56

Ветеран
Проверенный
LexBell сделал как ты сказал все ровно не работает
 

LexBell

Борода
Супер модератор
vint56, Логично-же, вроде, в основное условие добавить выход:
[SOURCE="iss"]procedure CancelButtonClick(CurPageID: Integer; var Cancel, Confirm: Boolean);
begin
if ((CurPageID = wpInstalling) and IsDoneUnpack) then
begin
SuspendProc; // ставим распаковку, или чего там сейчас IsDone делает, на паузу
if ExitSetupMsgBox then ISDoneCancel:=1; // настоящая отмена происходит тут
Confirm := False; // убираем запрос подтверждения выхода
Cancel := False; // да и саму отмену тоже запрещаем, что-бы библиотека IsDone могла корректно отработать
ResumeProc; // продолжаем работу IsDone с учетом изменивхшихся или не изменившихся условий
end else
begin
Confirm := True;
Cancel := ExitSetupMsgBox;
end;
end;[/SOURCE]
 

Mailchik

Старожил
Проверенный
можно взять булевый флаг и им это дело отрегулировать. это добавит 2 строчки кода и будет все равно более корректно, чем менять назначение стандартной кнопки насовсем.
LexBell написал(а):
Логично-же, вроде, в основное условие добавить выход:
И такое пробовал. На этапе ssPostInstall событию CancelButtonClick всё равно, вызываешь ты его или нет.. Твой код проверен на деле, Саня?
 
Последнее редактирование:

LexBell

Борода
Супер модератор
На этапе ssPostInstall событию CancelButtonClick всё равно
А там и должно быть все равно. на этапе распаковки IsDone родная отмена вообще не должна работать, там IsDone получает команду на отмену распаковки с последующим запуском деинсталлятора на том-же этапе, при флаге ISDoneCancel равном 1.
 

Mailchik

Старожил
Проверенный
IsDone получает команду на отмену распаковки с последующим запуском деинсталлятора на том-же этапе, при флаге ISDoneCancel равном 1.
Это понятно
на этапе распаковки IsDone родная отмена вообще не должна работать, там
Если этап распаковки будет происходить на ssInstall, то она сработает как ни в чем не бывало.
Но суть не в этом, я про твой приведенный выше код говорю.
На этапе ssPostInstall использовать нужно свое событие, как и предложил vint56..
 

sergey3695

Ветеран
Модератор
Ооо..сколько написано
Код:
procedure ISDoneBtnClick(Sender:TObject);
begin 
  SuspendProc;
  MyExitMessage;
if MyExit.ShowModal() = mrOk then
begin
  ISDoneCancel:=1;
  WizardForm.CancelButton.Enabled:= False;
end;
  ResumeProc;
end;
....
if CurStep = ssPostInstall then begin
  ...
  [B]WizardForm.CancelButton.OnClick:= @ISDoneBtnClick;[/B]

У меня так. Все правильно только свое событие. (и на странице установки у меня стоит WizardForm.CancelButton.Enabled:= False; а в коде проверочка
Код:
function FindWindow(lpClassName, lpWindowName: PAnsiChar): HWND; external 'FindWindowA@user32.dll stdcall';

function FindWindowByName(Text: PAnsiChar): HWND;
begin
  Result:= FindWindow('#32770', ExpandConstant(Text))
end;

function ProgressCallback(OveralPct,CurrentPct: integer;CurrentFile,TimeStr1,TimeStr2,TimeStr3:PAnsiChar): longword;
var 
  msgwnd: HWND; 
begin
  msgwnd:= FindWindowByName('ISDone.dll');
if msgwnd <> 0 then WizardForm.Enabled:= false else begin
  WizardForm.Enabled:=true;
  WizardForm.CancelButton.Enabled:= True;
end;
...
)
Можно как и LexBell, предложил... я правда просто меняю клик кнопки дабы не нагромождать код. :) (никакой кнопки доп. не нужно. все можно и так сделать)
После строк распаковки стоит WizardForm.CancelButton.Enabled:= False;
Как обьединить в одну страницу
Они и так на одной странице. (судя по скрину) (если это для примера скин, то смотри свойство parent у компонентов)
 
Последнее редактирование:

LexBell

Борода
Супер модератор
Mailchik, во первых, это мое решение, хоть и не самое верное, но более оптимальное, чем создание новой кнопки. Соственно, тут можно посмотреть, кто автор такого решения.
Во вторых, ни кто не мешает после отработки исдона на всех следующих этапах возвращать флаг отмены. это тоже вполне логично и совсем не сложно. Ни капли не сложнее, чем уничтожение дефолтного ивента кнопки отмены.
Вообще непонятно, почему именно у тебя не получается правильно организовать логику проверки необходимости работы дефолтной отмены. Вроде не новичек, и даже кой чего умеешь. Это-же вообще-то азы, построить логику правильно по моему даже у РиКилла неплохо получалось на базе простейших подсказок. Или может мне написать третий пример для Isdone, чтоб можно было тупо скопировать и вставить к себе, не задумываясь о том, как это должно работать?
P.S.
Еще более простой вариант - вместо того, что-бы на каждом шаге хода установки задавать состояние флага IsDoneUnpack, стоит сразу инициализировать его в начале работы инсталлятора, перенеся строчку IsDoneUnpack := False; из CurStepChanged в InitializeWizard, например. Хоть это в целом и не обязательно - булевы переменные при создании имеют значение False, и в Inno инициализация ее с этим флагом делается исключительно для очистки совести, не более. В этом случе будет достаточно там, где начинается работа IsDone задать ей значение True а по окончании работы IsDone как и в любом другом примере, отключить кнопку отмены, ибо там отмена уже вообще в любом случае отработает некорректно.
 
Последнее редактирование:

Mailchik

Старожил
Проверенный
LexBell, логику то я понимаю, но в этом случае инно пофиг на логику.
vint56 написал(а):
CancelButton будет отменять установку
LexBell написал(а):
тогда уж лучше использовать стандартную функцию CancelButtonClick, там очень удобно - для определенной страницы можно задать сокрытие окна запроса отмены и замену действия на отмену на свое. как-то так:
vint56 написал(а):
если поменять if CurStep = ssInstall then begin на Post кнопка не работает
Mailchik написал(а):
да, есть такое дело. Inno он такой... Тогда остаётся использовать своё событие для кнопки отмены.
LexBell написал(а):
можно взять булевый флаг и им это дело отрегулировать. это добавит 2 строчки кода и будет все равно более корректно, чем менять назначение стандартной кнопки насовсем.
vint56 написал(а):
сделал как ты сказал все ровно не работает
LexBell написал(а):
Логично-же, вроде, в основное условие добавить выход:
Mailchik написал(а):
И такое пробовал. На этапе ssPostInstall событию CancelButtonClick всё равно, вызываешь ты его или нет.. Твой код проверен на деле, Саня?
К чему столько писанины я не понял.
Я просто спросил, проверил ты свой код, Саня? Потому как у меня всё так же безрезультатно..
И не понятно, причем тут мои знания инно? Причем логические цепочки? Если на ssPostInstall результата нет? К чему ты это всё написал?
[MOD="LexBell"]А ты попробуй понять то, что я написал выше. увидишь, что все на самом деле все работает и писанины меньше всего получается :) И да, у инно все в порядке с логикой, именно поэтому и получается косяк, если брать и копировать мой пример не задумываясь[/MOD]
 
Последнее редактирование модератором:

vint56

Ветеран
Проверенный
LexBell
const
PCFonFLY=true;
notPCFonFLY=false;
var
LabelPct1,LabelCurrFileName,LabelTime1,LabelTime2,LabelTime3: TLabel;
ISDoneProgressBar1: TNewProgressBar;
#ifdef SecondProgressBar
LabelPct2: TLabel;
ISDoneProgressBar2:TNewProgressBar;
#endif
MyCancelButton: TButton;
ISDoneCancel:integer;
ISDoneError:boolean;
PCFVer:double;
PauseButton: TNewButton;
IsDoneUnpack : Boolean;

type
TCallback = function (OveralPct,CurrentPct: integer;CurrentFile,TimeStr1,TimeStr2,TimeStr3:pAnsiChar): longword;

function WrapCallback(callback:TCallback; paramcount:integer):longword;external 'wrapcallback@files:ISDone.dll stdcall delayload';

function ISArcExtract(CurComponent:Cardinal; PctOfTotal:double; InName, OutPath, ExtractedPath: AnsiString; DeleteInFile:boolean; Password, CfgFile, WorkPath: AnsiString; ExtractPCF: boolean ):boolean; external 'ISArcExtract@files:ISDone.dll stdcall delayload';
function IS7ZipExtract(CurComponent:Cardinal; PctOfTotal:double; InName, OutPath: AnsiString; DeleteInFile:boolean; Password: AnsiString):boolean; external 'IS7zipExtract@files:ISDone.dll stdcall delayload';
function ISRarExtract(CurComponent:Cardinal; PctOfTotal:double; InName, OutPath: AnsiString; DeleteInFile:boolean; Password: AnsiString):boolean; external 'ISRarExtract@files:ISDone.dll stdcall delayload';
function ISPrecompExtract(CurComponent:Cardinal; PctOfTotal:double; InName, OutFile: AnsiString; DeleteInFile:boolean):boolean; external 'ISPrecompExtract@files:ISDone.dll stdcall delayload';
function ISSRepExtract(CurComponent:Cardinal; PctOfTotal:double; InName, OutFile: AnsiString; DeleteInFile:boolean):boolean; external 'ISSrepExtract@files:ISDone.dll stdcall delayload';
function ISxDeltaExtract(CurComponent:Cardinal; PctOfTotal:double; minRAM,maxRAM:integer; InName, DiffFile, OutFile: AnsiString; DeleteInFile, DeleteDiffFile:boolean):boolean; external 'ISxDeltaExtract@files:ISDone.dll stdcall delayload';
function ISPackZIP(CurComponent:Cardinal; PctOfTotal:double; InName, OutFile: AnsiString;ComprLvl:integer; DeleteInFile:boolean):boolean; external 'ISPackZIP@files:ISDone.dll stdcall delayload';
function ShowChangeDiskWindow(Text, DefaultPath, SearchFile:AnsiString):boolean; external 'ShowChangeDiskWindow@files:ISDone.dll stdcall delayload';

function Exec2 (FileName, Param: PAnsiChar;Show:boolean):boolean; external 'Exec2@files:ISDone.dll stdcall delayload';
function ISFindFiles(CurComponent:Cardinal; FileMask:AnsiString; var ColFiles:integer):integer; external 'ISFindFiles@files:ISDone.dll stdcall delayload';
function ISPickFilename(FindHandle:integer; OutPath:AnsiString; var CurIndex:integer; DeleteInFile:boolean):boolean; external 'ISPickFilename@files:ISDone.dll stdcall delayload';
function ISGetName(TypeStr:integer):pAnsichar; external 'ISGetName@files:ISDone.dll stdcall delayload';
function ISFindFree(FindHandle:integer):boolean; external 'ISFindFree@files:ISDone.dll stdcall delayload';
function ISExec(CurComponent:Cardinal; PctOfTotal,SpecifiedProcessTime:double; ExeName,Parameters,TargetDir,OutputStr:AnsiString;Show:boolean):boolean; external 'ISExec@files:ISDone.dll stdcall delayload';

function SrepInit(TmpPath:pAnsiChar;VirtMem,MaxSave:Cardinal):boolean; external 'SrepInit@files:ISDone.dll stdcall delayload';
function PrecompInit(TmpPath:pAnsiChar;VirtMem:cardinal;PrecompVers:single):boolean; external 'PrecompInit@files:ISDone.dll stdcall delayload';
function FileSearchInit(RecursiveSubDir:boolean):boolean; external 'FileSearchInit@files:ISDone.dll stdcall delayload';
function ISDoneInit(RecordFileName:AnsiString; TimeType,Comp1,Comp2,Comp3:Cardinal; WinHandle, NeededMem:longint; callback:TCallback):boolean; external 'ISDoneInit@files:ISDone.dll stdcall';
function ISDoneStop:boolean; external 'ISDoneStop@files:ISDone.dll stdcall';
function ChangeLanguage(Language:AnsiString):boolean; external 'ChangeLanguage@files:ISDone.dll stdcall delayload';
function SuspendProc:boolean; external 'SuspendProc@files:ISDone.dll stdcall';
function ResumeProc:boolean; external 'ResumeProc@files:ISDone.dll stdcall';

function ProgressCallback(OveralPct,CurrentPct: integer;CurrentFile,TimeStr1,TimeStr2,TimeStr3:pAnsiChar): longword;
begin
if OveralPct<=1000 then ISDoneProgressBar1.Position := OveralPct;
LabelPct1.Caption := IntToStr(OveralPct div 10)+'.'+chr(48 + OveralPct mod 10)+'%';
LabelCurrFileName.Caption:=ExpandConstant('{cm:ExtractedFile} ')+MinimizePathName(CurrentFile, LabelCurrFileName.Font, LabelCurrFileName.Width-ScaleX(100));
LabelTime1.Caption:=ExpandConstant('{cm:ElapsedTime} ')+TimeStr2;
LabelTime2.Caption:=ExpandConstant('{cm:RemainingTime} ')+TimeStr1;
LabelTime3.Caption:=ExpandConstant('{cm:AllElapsedTime}')+TimeStr3;
Result := ISDoneCancel;
end;

procedure CancelButtonClick(CurPageID: Integer; var Cancel, Confirm: Boolean);
begin
if ((CurPageID = wpInstalling) and IsDoneUnpack) then
begin
SuspendProc; // ставим распаковку, или чего там сейчас IsDone делает, на паузу
if ExitSetupMsgBox then ISDoneCancel:=1; // настоящая отмена происходит тут
Confirm := False; // убираем запрос подтверждения выхода
Cancel := False; // да и саму отмену тоже запрещаем, что-бы библиотека IsDone могла корректно отработать
ResumeProc; // продолжаем работу IsDone с учетом изменивхшихся или не изменившихся условий
end else
begin
Confirm := True;
Cancel := ExitSetupMsgBox;
end;
end;

procedure HideControls;
begin
WizardForm.FileNamelabel.Hide;
ISDoneProgressBar1.Hide;
LabelPct1.Hide;
LabelCurrFileName.Hide;
LabelTime1.Hide;
LabelTime2.Hide;
end;

procedure CreateControls;
var PBTop:integer;
begin
PBTop:=ScaleY(50);
ISDoneProgressBar1 := TNewProgressBar.Create(WizardForm);
with ISDoneProgressBar1 do begin
Parent := WizardForm.InstallingPage;
Height := WizardForm.ProgressGauge.Height;
Left := ScaleX(0);
Top := PBTop;
Width := ScaleX(365);
Max := 1000;
end;
LabelPct1 := TLabel.Create(WizardForm);
with LabelPct1 do begin
Parent := WizardForm.InstallingPage;
AutoSize := False;
Left := ISDoneProgressBar1.Width+ScaleX(5);
Top := ISDoneProgressBar1.Top + ScaleY(2);
Width := ScaleX(80);
end;
LabelCurrFileName := TLabel.Create(WizardForm);
with LabelCurrFileName do begin
Parent := WizardForm.InstallingPage;
AutoSize := False;
Width := ISDoneProgressBar1.Width+ScaleX(30);
Left := ScaleX(0);
Top := ScaleY(30);
end;
LabelTime1 := TLabel.Create(WizardForm);
with LabelTime1 do begin
Parent := WizardForm.InstallingPage;
AutoSize := False;
Width := ISDoneProgressBar1.Width div 2;
Left := ScaleX(0);
Top := PBTop + ScaleY(35);
end;
LabelTime2 := TLabel.Create(WizardForm);
with LabelTime2 do begin
Parent := WizardForm.InstallingPage;
AutoSize := False;
Width := LabelTime1.Width+ScaleX(40);
Left := ISDoneProgressBar1.Width div 2;
Top := LabelTime1.Top;
end;
LabelTime3 := TLabel.Create(WizardForm);
with LabelTime3 do begin
Parent := WizardForm.FinishedPage;
AutoSize := False;
Width := 300;
Left := 180;
Top := 200;
end;
end;
Procedure CurPageChanged(CurPageID: Integer);
Begin
if (CurPageID = wpFinished) then
begin
PauseButton.Hide;
if (CurPageID = wpFinished) and ISDoneError then
begin
LabelTime3.Hide;
PauseButton.Hide;
WizardForm.Caption:= ExpandConstant('{cm:Error}');
WizardForm.FinishedLabel.Font.Color:= clRed;
WizardForm.FinishedLabel.Caption:= SetupMessage(msgSetupAborted) ;
end;
end;
end;

function CheckError:boolean;
begin
result:= not ISDoneError;
end;

procedure CurStepChanged(CurStep: TSetupStep);
var Comps1,Comps2,Comps3, TmpValue:cardinal;
FindHandle1,ColFiles1,CurIndex1,tmp:integer;
ExecError:boolean;
InFilePath,OutFilePath,OutFileName:pAnsiChar;
begin
if CurStep = ssPostInstall then begin //Если необходимо, можно поменять на ssPostInstall
IsDoneUnpack := True;
WizardForm.ProgressGauge.Hide;
WizardForm.CancelButton.Enabled:=True;
CreateControls;
WizardForm.StatusLabel.Caption:=ExpandConstant('{cm:Extracted}');
ISDoneCancel:=0;

// Распаковка всех необходимых файлов в папку {tmp}.

ExtractTemporaryFile('unarc.dll');

#ifdef PrecompInside
ExtractTemporaryFile('CLS-precomp.dll');
ExtractTemporaryFile('packjpg_dll.dll');
ExtractTemporaryFile('packjpg_dll1.dll');
ExtractTemporaryFile('precomp.exe');
ExtractTemporaryFile('zlib1.dll');
#endif
#ifdef SrepInside
ExtractTemporaryFile('CLS-srep.dll');
#endif
#ifdef MSCInside
ExtractTemporaryFile('CLS-MSC.dll');
#endif
#ifdef facompress
ExtractTemporaryFile('facompress.dll'); //ускоряет распаковку .arc архивов.
#endif
#ifdef records
ExtractTemporaryFile('records.inf');
#endif
#ifdef precomp
#if precomp == "0.38"
ExtractTemporaryFile('precomp038.exe');
#else
#if precomp == "0.4"
ExtractTemporaryFile('precomp040.exe');
#else
#if precomp == "0.41"
ExtractTemporaryFile('precomp041.exe');
#else
#if precomp == "0.42"
ExtractTemporaryFile('precomp042.exe');
#else
ExtractTemporaryFile('precomp038.exe');
ExtractTemporaryFile('precomp040.exe');
ExtractTemporaryFile('precomp041.exe');
ExtractTemporaryFile('precomp042.exe');
#endif
#endif
#endif
#endif
#endif
#ifdef unrar
ExtractTemporaryFile('Unrar.dll');
#endif
#ifdef XDelta
ExtractTemporaryFile('XDelta3.dll');
#endif
#ifdef PackZIP
ExtractTemporaryFile('7z.dll');
ExtractTemporaryFile('PackZIP.exe');
#endif

ExtractTemporaryFile('English.ini');

// Подготавливаем переменную, содержащую всю информацию о выделенных компонентах для ISDone.dll
// максимум 96 компонентов.
Comps1:=0; Comps2:=0; Comps3:=0;
#ifdef Components
TmpValue:=1;
if IsComponentSelected('text\rus') then Comps1:=Comps1+TmpValue; //компонент 1
TmpValue:=TmpValue*2;
if IsComponentSelected('text\eng') then Comps1:=Comps1+TmpValue; //компонент 2
TmpValue:=TmpValue*2;
if IsComponentSelected('voice\rus') then Comps1:=Comps1+TmpValue; //компонент 3
TmpValue:=TmpValue*2;
if IsComponentSelected('voice\eng') then Comps1:=Comps1+TmpValue; //компонент 4
// .....
// см. справку
#endif

#ifdef precomp
PCFVer:={#precomp};
#else
PCFVer:=0;
#endif
ISDoneError:=true;
if ISDoneInit(ExpandConstant('{src}\records.inf'), $F777, Comps1,Comps2,Comps3, MainForm.Handle, {#NeedMem}, @ProgressCallback) then begin
repeat
// ChangeLanguage('English');
if not SrepInit('',512,0) then break;
if not PrecompInit('',128,PCFVer) then break;
if not FileSearchInit(true) then break;

if not ISArcExtract ( 0, 0, ExpandConstant('{src}\*.arc'), ExpandConstant('{app}'), '', false, '', '', ExpandConstant('{app}'), notPCFonFLY {PCFonFLY}) then break;
PauseButton.Hide;
ISDoneError:=false;
until true;
ISDoneStop;
IsDoneUnpack := False;
end;
HideControls;
WizardForm.CancelButton.Visible:=true;
WizardForm.CancelButton.Enabled:=false;
end;
if (CurStep=ssPostInstall) and ISDoneError then begin
Exec2(ExpandConstant('{uninstallexe}'), '/VERYSILENT', false);
end;
end;

procedure InitializeWizard();
begin
IsDoneUnpack := False;
end;
 
Последнее редактирование:

LexBell

Борода
Супер модератор
в общем, запутали вы меня, вот вам гарантированно рабочая версия, заодно и корректное отрабатывание кнопки закрытия на этапе именно постинсталл ну и да, заодно попрален мой пример для библиотеки, он таки был неправилен. в примере с CancelButtonClick на этапе инсталл никакие флаги не нужны, все работает вполне корректно и без них. Для постинсталл - мой маразм меня победил - забыл уже, что на этом этапе установка собственно завершена и идет установка доп по и всякие служебные записи в реестр, ини и тп, тоесть отмену там делать уже нельзя, поэтому она на этом этапе отключена совсем. но раз очень хочется делать неправильно и сам принцип использования IsDone позволяет, то можно сделать и на этом этапе полноценную отмену. вот, в общем, нужно будет и в файловике этот скрипт заменить.
[SOURCE="iss"]#define NeedSize "5000000000"

#define NeedMem 512

#define SecondPB

#ifdef SecondPB
#define PbLblCount 1
#else
#define PbLblCount 0
#endif

;#define Components

;#define records

;#define facompress

;#define PrecompInside
;#define SrepInside
;#define precomp "0.42"
;#define unrar
;#define XDelta
;#define PackZIP

[Setup]
AppName=ISDone
AppVerName=ISDone
DefaultDirName={pf}\ISDone
DefaultGroupName=ISDone Example
OutputDir=.
OutputBaseFilename=Setup
VersionInfoCopyright=ProFrager
SolidCompression=yes
#ifdef NeedSize
ExtraDiskSpaceRequired={#NeedSize}
#endif

#ifdef Components
[Types]
Name: full; Description: Full installation; Flags: iscustom

[Components]
Name: text; Description: Язык субтитров; Types: full; Flags: fixed
Name: text\rus; Description: Русский; Flags: exclusive; ExtraDiskSpaceRequired: 100000000
Name: text\eng; Description: Английский; Flags: exclusive; ExtraDiskSpaceRequired: 200000000
Name: voice; Description: Язык озвучки; Types: full; Flags: fixed
Name: voice\rus; Description: Русский; Flags: exclusive; ExtraDiskSpaceRequired: 500000000
Name: voice\eng; Description: Английский; Flags: exclusive; ExtraDiskSpaceRequired: 600000000
#endif

[Registry]
Root: HKLM; Subkey: Software\ProFrager; ValueName: path; ValueType: String; ValueData: {app}; Flags: uninsdeletekey; Check: CheckError
Root: HKLM; Subkey: Software\ProFrager; ValueName: name; ValueType: String; ValueData: Data; Flags: uninsdeletekey; Check: CheckError

[Icons]
Name: {group}\Удалить пример ISDone; Filename: {app}\unins000.exe; WorkingDir: {app}; Check: CheckError
Name: {commondesktop}\Удалить пример ISDone; Filename: {app}\unins000.exe; WorkingDir: {app}; Check: CheckError

[Tasks]
Name: VCCheck; Description: Установить Microsoft Visual C++ 2005 Redist
Name: PhysXCheck; Description: Установить Nvidia PhysX

[Run]
Filename: {src}\Redist\vcredist_x86.exe; Parameters: /q; StatusMsg: Устанавливаем Microsoft Visual C++ 2005 Redist...; Flags: skipifdoesntexist; Tasks: VCCheck; Check: CheckError
Filename: {src}\Redist\PhysX.exe; Parameters: /qn; StatusMsg: Устанавливаем Nvidia PhysX...; Flags: skipifdoesntexist; Tasks: PhysXCheck; Check: CheckError

[Files]
Source: Include\English.ini; DestDir: {tmp}; Flags: dontcopy
Source: Include\unarc.dll; DestDir: {tmp}; Flags: dontcopy
Source: ISDone.dll; DestDir: {tmp}; Flags: dontcopy

#ifdef records
Source: records.inf; DestDir: {tmp}; Flags: dontcopy
#endif

#ifdef PrecompInside
Source: Include\CLS-precomp.dll; DestDir: {tmp}; Flags: dontcopy
Source: Include\packjpg_dll.dll; DestDir: {tmp}; Flags: dontcopy
Source: Include\packjpg_dll1.dll; DestDir: {tmp}; Flags: dontcopy
Source: Include\precomp.exe; DestDir: {tmp}; Flags: dontcopy
Source: Include\zlib1.dll; DestDir: {tmp}; Flags: dontcopy
#endif

#ifdef SrepInside
Source: Include\CLS-srep.dll; DestDir: {tmp}; Flags: dontcopy
#endif

#ifdef facompress
Source: Include\facompress.dll; DestDir: {tmp}; Flags: dontcopy
#endif

#ifdef precomp
#if precomp == "0.38"
Source: Include\precomp038.exe; DestDir: {tmp}; Flags: dontcopy
#else
#if precomp == "0.4"
Source: Include\precomp040.exe; DestDir: {tmp}; Flags: dontcopy
#else
#if precomp == "0.41"
Source: Include\precomp041.exe; DestDir: {tmp}; Flags: dontcopy
#else
#if precomp == "0.42"
Source: Include\precomp042.exe; DestDir: {tmp}; Flags: dontcopy
#else
Source: Include\precomp038.exe; DestDir: {tmp}; Flags: dontcopy
Source: Include\precomp040.exe; DestDir: {tmp}; Flags: dontcopy
Source: Include\precomp041.exe; DestDir: {tmp}; Flags: dontcopy
Source: Include\precomp042.exe; DestDir: {tmp}; Flags: dontcopy
#endif
#endif
#endif
#endif
#endif

#ifdef unrar
Source: Include\Unrar.dll; DestDir: {tmp}; Flags: dontcopy
#endif

#ifdef XDelta
Source: Include\XDelta3.dll; DestDir: {tmp}; Flags: dontcopy
#endif

#ifdef PackZIP
Source: Include\7z.dll; DestDir: {tmp}; Flags: dontcopy
Source: Include\packZIP.exe; DestDir: {tmp}; Flags: dontcopy
#endif

[CustomMessages]
russian.ExtractedFile=Извлекается файл:
russian.Extracted=Распаковка архивов...
russian.CancelButton=Отменить распаковку
russian.Error=Ошибка распаковки!
russian.ElapsedTime=Прошло:
russian.RemainingTime=Осталось времени:
russian.EstimatedTime=Всего:
russian.AllElapsedTime=Время установки:

[Languages]
Name: russian; MessagesFile: compiler:Languages\Russian.isl

[UninstallDelete]
Type: filesandordirs; Name: {app}

Код:
const
  PCFonFLY    = true;
  notPCFonFLY = false;
  PbLblCount  = {#PbLblCount};
var
  LblTime      :   array [0..2]             of TLabel;
  LblPct       :   array [0..{#PbLblCount}] of TLabel;
  ISDonePB     :   array [0..{#PbLblCount}] of TNewProgressBar;
  ISDoneCancel :   integer;
  ISDoneError  :   boolean;
  ISDoneStopUP :   boolean;
  PCFVer       :   double;

type
  TCallback = function (OveralPct,CurrentPct: integer;CurrentFile,TimeStr1,TimeStr2,TimeStr3:PAnsiChar): longword;

function WrapCallback(callback:TCallback; paramcount:integer):longword;
  external 'wrapcallback@files:ISDone.dll stdcall delayload';

function ISArcExtract(CurComponent:Cardinal; PctOfTotal:double; InName, OutPath, ExtractedPath: AnsiString; DeleteInFile:boolean; Password, CfgFile, WorkPath: AnsiString; ExtractPCF: boolean ):boolean;
  external 'ISArcExtract@files:ISDone.dll stdcall delayload';
function IS7ZipExtract(CurComponent:Cardinal; PctOfTotal:double; InName, OutPath: AnsiString; DeleteInFile:boolean; Password: AnsiString):boolean;
  external 'IS7zipExtract@files:ISDone.dll stdcall delayload';
function ISRarExtract(CurComponent:Cardinal; PctOfTotal:double; InName, OutPath: AnsiString; DeleteInFile:boolean; Password: AnsiString):boolean;
  external 'ISRarExtract@files:ISDone.dll stdcall delayload';
function ISPrecompExtract(CurComponent:Cardinal; PctOfTotal:double; InName, OutFile: AnsiString; DeleteInFile:boolean):boolean;
  external 'ISPrecompExtract@files:ISDone.dll stdcall delayload';
function ISSRepExtract(CurComponent:Cardinal; PctOfTotal:double; InName, OutFile: AnsiString; DeleteInFile:boolean):boolean;
  external 'ISSrepExtract@files:ISDone.dll stdcall delayload';
function ISxDeltaExtract(CurComponent:Cardinal; PctOfTotal:double; minRAM,maxRAM:integer; InName, DiffFile, OutFile: AnsiString; DeleteInFile, DeleteDiffFile:boolean):boolean;
  external 'ISxDeltaExtract@files:ISDone.dll stdcall delayload';
function ISPackZIP(CurComponent:Cardinal; PctOfTotal:double; InName, OutFile: AnsiString;ComprLvl:integer; DeleteInFile:boolean):boolean;
  external 'ISPackZIP@files:ISDone.dll stdcall delayload';
function ShowChangeDiskWindow(Text, DefaultPath, SearchFile:AnsiString):boolean;
  external 'ShowChangeDiskWindow@files:ISDone.dll stdcall delayload';

function Exec2 (FileName, Param: PAnsiChar;Show:boolean):boolean;
  external 'Exec2@files:ISDone.dll stdcall delayload';
function ISFindFiles(CurComponent:Cardinal; FileMask:AnsiString; var ColFiles:integer):integer;
  external 'ISFindFiles@files:ISDone.dll stdcall delayload';
function ISPickFilename(FindHandle:integer; OutPath:AnsiString; var CurIndex:integer; DeleteInFile:boolean):boolean;
  external 'ISPickFilename@files:ISDone.dll stdcall delayload';
function ISGetName(TypeStr:integer):PAnsichar;
  external 'ISGetName@files:ISDone.dll stdcall delayload';
function ISFindFree(FindHandle:integer):boolean;
  external 'ISFindFree@files:ISDone.dll stdcall delayload';
function ISExec(CurComponent:Cardinal; PctOfTotal,SpecifiedProcessTime:double; ExeName,Parameters,TargetDir,OutputStr:AnsiString;Show:boolean):boolean;
  external 'ISExec@files:ISDone.dll stdcall delayload';

function SrepInit(TmpPath:PAnsiChar;VirtMem,MaxSave:Cardinal):boolean;
  external 'SrepInit@files:ISDone.dll stdcall delayload';
function PrecompInit(TmpPath:PAnsiChar;VirtMem:cardinal;PrecompVers:single):boolean;
  external 'PrecompInit@files:ISDone.dll stdcall delayload';
function FileSearchInit(RecursiveSubDir:boolean):boolean;
  external 'FileSearchInit@files:ISDone.dll stdcall delayload';
function ISDoneInit(RecordFileName:AnsiString; TimeType,Comp1,Comp2,Comp3:Cardinal; WinHandle, NeededMem:longint; callback:TCallback):boolean;
  external 'ISDoneInit@files:ISDone.dll stdcall';
function ISDoneStop:boolean;
  external 'ISDoneStop@files:ISDone.dll stdcall';
function ChangeLanguage(Language:AnsiString):boolean;
  external 'ChangeLanguage@files:ISDone.dll stdcall delayload';
function SuspendProc:boolean;
  external 'SuspendProc@files:ISDone.dll stdcall';
function ResumeProc:boolean;
  external 'ResumeProc@files:ISDone.dll stdcall';

function ProgressCallback(OveralPct,CurrentPct: integer;CurrentFile,TimeStr1,TimeStr2,TimeStr3:PAnsiChar): longword;
begin
    if OveralPct<=1000  then ISDonePB[0].Position := OveralPct;
    LblPct[0].Caption := IntToStr(OveralPct div 10)+'.'+chr(48 + OveralPct mod 10)+'%';
  #ifdef SecondPB
    if CurrentPct<=1000 then ISDonePB[1].Position := CurrentPct;
    LblPct[1].Caption := IntToStr(CurrentPct div 10)+'.'+chr(48 + CurrentPct mod 10)+'%';
  #endif
  WizardForm.FileNamelabel.Caption:=ExpandConstant('{cm:ExtractedFile} ')+MinimizePathName(CurrentFile, WizardForm.FileNamelabel.Font, WizardForm.FileNamelabel.Width-ScaleX(100));
  LblTime[0].Caption:=ExpandConstant('{cm:ElapsedTime} ')+TimeStr2;
  LblTime[1].Caption:=ExpandConstant('{cm:RemainingTime} ')+TimeStr1;
  LblTime[2].Caption:=ExpandConstant('{cm:AllElapsedTime}')+TimeStr3;
  Result := ISDoneCancel;
end;

procedure WizardFormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
  case ISDoneStopUP of
    True:
    begin
      SuspendProc;
      if ExitSetupMsgBox then ISDoneCancel:=1;
      ResumeProc;
    end;
    False : CanClose := True;
  end;
end;

function InitializeSetup(): Boolean;
begin
  ISDoneStopUP := False;
  Result := True;
end;

procedure HideControls;
var
  i :integer;
begin
    for i := 0 to PbLblCount do
    begin
      ISDonePB[i].Hide;
      LblPct[i].Hide;
    end;
  for i := 0 to 1 do LblTime[i].Hide;
end;

procedure CreateControls;
var
  i :integer;
begin
  WizardForm.FileNamelabel.SetBounds(ScaleX(0), ScaleY(30), ScaleX(395), ScaleY(14));
  for i := 0 to PbLblCount do
  begin
    ISDonePB[i] := TNewProgressBar.Create(WizardForm);
    with ISDonePB[i] do
    begin
      Parent   := WizardForm.InstallingPage;
      SetBounds(ScaleX(0), ScaleY(50+i*57), ScaleX(365), ScaleY(21));
      Max      := 1000;
    end;

    LblPct[i] := TLabel.Create(WizardForm);
    with LblPct[i] do
    begin
      Parent    := WizardForm.InstallingPage;
      AutoSize  := False;
      SetBounds(ScaleX(370), ScaleY(52+i*57), ScaleX(80), ScaleY(14));
    end;
  end;

  for i := 0 to 2 do
  begin
    LblTime[i] := TLabel.Create(WizardForm);
    with LblTime[i] do
    begin
      AutoSize := False;
      Alignment := taCenter;
        case i of
        0, 1 :
        begin
          Parent := WizardForm.InstallingPage;
          SetBounds(ScaleX(0), ScaleY(75+i*17), ScaleX(395), ScaleY(14));
        end;
        2 :
        begin
          Parent := WizardForm.FinishedPage;
          SetBounds(ScaleX(180), ScaleY(200), ScaleX(300), ScaleY(14));
        end;
      end;
    end;
  end;
  WizardForm.OnCloseQuery := @WizardFormCloseQuery;
  WizardForm.CancelButton.Enabled := True;
end;

Procedure CurPageChanged(CurPageID: Integer);
Begin
  if (CurPageID = wpFinished) and ISDoneError then
  begin
    LblTime[2].Hide;
    WizardForm.Caption:= ExpandConstant('{cm:Error}');
    WizardForm.FinishedLabel.Font.Color:= clRed;
    WizardForm.FinishedLabel.Caption:= SetupMessage(msgSetupAborted) ;
  end;
end;

function CheckError:boolean;
begin
  result:= not ISDoneError;
end;

procedure CurStepChanged(CurStep: TSetupStep);
var
  Comps1, Comps2, Comps3, TmpValue       : cardinal;
  FindHandle1, ColFiles1, CurIndex1, tmp : integer;
  ExecError                              : boolean;
  InFilePath, OutFilePath, OutFileName   : PAnsiChar;
begin
  if CurStep = ssPostInstall then //Если необходимо, можно поменять на ssInstall
  begin  
    WizardForm.ProgressGauge.Hide;
    CreateControls;
    WizardForm.StatusLabel.Caption:=ExpandConstant('{cm:Extracted}');
    ISDoneCancel:=0;

  // Распаковка всех необходимых файлов в папку {tmp}.

    ExtractTemporaryFile('unarc.dll');

    #ifdef PrecompInside
      ExtractTemporaryFile('CLS-precomp.dll');
      ExtractTemporaryFile('packjpg_dll.dll');
      ExtractTemporaryFile('packjpg_dll1.dll');
      ExtractTemporaryFile('precomp.exe');
      ExtractTemporaryFile('zlib1.dll');
    #endif

    #ifdef SrepInside
      ExtractTemporaryFile('CLS-srep.dll');
    #endif

    #ifdef facompress
      ExtractTemporaryFile('facompress.dll'); //ускоряет распаковку .arc архивов.
    #endif
    #ifdef records
      ExtractTemporaryFile('records.inf');
    #endif

    #ifdef precomp
      #if precomp == "0.38"
        ExtractTemporaryFile('precomp038.exe');
      #else
        #if precomp == "0.4"
          ExtractTemporaryFile('precomp040.exe');
        #else
          #if precomp == "0.41"
            ExtractTemporaryFile('precomp041.exe');
          #else
            #if precomp == "0.42"
              ExtractTemporaryFile('precomp042.exe');
            #else
              ExtractTemporaryFile('precomp038.exe');
              ExtractTemporaryFile('precomp040.exe');
              ExtractTemporaryFile('precomp041.exe');
              ExtractTemporaryFile('precomp042.exe');
            #endif
          #endif
        #endif
      #endif
    #endif

    #ifdef unrar
      ExtractTemporaryFile('Unrar.dll');
    #endif

    #ifdef XDelta
      ExtractTemporaryFile('XDelta3.dll');
    #endif

    #ifdef PackZIP
      ExtractTemporaryFile('7z.dll');
      ExtractTemporaryFile('PackZIP.exe');
    #endif

    ExtractTemporaryFile('English.ini');

// Подготавливаем переменную, содержащую всю информацию о выделенных компонентах для ISDone.dll
// максимум 96 компонентов.
  Comps1:=0; Comps2:=0; Comps3:=0;
  #ifdef Components
    TmpValue:=1;
    if IsComponentSelected('text\rus') then Comps1 := Comps1+TmpValue;     //компонент 1
    TmpValue:=TmpValue*2;
    if IsComponentSelected('text\eng') then Comps1 := Comps1+TmpValue;     //компонент 2
    TmpValue:=TmpValue*2;
    if IsComponentSelected('voice\rus') then Comps1 := Comps1+TmpValue;    //компонент 3
    TmpValue:=TmpValue*2;
    if IsComponentSelected('voice\eng') then Comps1 := Comps1+TmpValue;    //компонент 4
//    .....
// см. справку
  #endif

  #ifdef precomp
    PCFVer:={#precomp};
  #else
    PCFVer:=0;
  #endif
    ISDoneError:=true;
    if ISDoneInit(ExpandConstant('{src}\records.inf'), $F777, Comps1, Comps2, Comps3, MainForm.Handle, {#NeedMem}, @ProgressCallback) then
    begin
      repeat
//        ChangeLanguage('English');
        if not SrepInit('',512,0) then break;
        if not PrecompInit('',128,PCFVer) then break;
        if not FileSearchInit(true) then break;

        if not ISArcExtract ( 0, 0, ExpandConstant('{src}\GameWAV.bin'), ExpandConstant('{app}'), '', false, '', '', ExpandConstant('{app}'), notPCFonFLY {PCFonFLY}) then break;
//        if not ISArcExtract ( 0, 0, ExpandConstant('{src}\test1.arc'), ExpandConstant('{app}'), '', false, '123', '', ExpandConstant('{app}'), notPCFonFLY {PCFonFLY}) then break;

//    далее находятся закомментированые примеры различных функций распаковки (чтобы каждый раз не лазить в справку за примерами)
(*
        if not ISArcExtract    ( 0, 0, ExpandConstant('{src}\arc.arc'), ExpandConstant('{app}\'), '', false, '', ExpandConstant('{tmp}\arc.ini'), ExpandConstant('{app}\'), notPCFonFLY{PCFonFLY}) then break;
        if not IS7ZipExtract   ( 0, 0, ExpandConstant('{src}\CODMW2.7z'), ExpandConstant('{app}\data1'), false, '') then break;
        if not ISRarExtract    ( 0, 0, ExpandConstant('{src}\data_*.rar'), ExpandConstant('{app}'), false, '') then break;
        if not ISSRepExtract   ( 0, 0, ExpandConstant('{app}\data1024_1024.srep'),ExpandConstant('{app}\data1024.arc'), true) then break;
        if not ISPrecompExtract( 0, 0, ExpandConstant('{app}\data.pcf'),    ExpandConstant('{app}\data.7z'), true) then break;
        if not ISxDeltaExtract ( 0, 0, 0, 640, ExpandConstant('{app}\in.pcf'), ExpandConstant('{app}\*.diff'),   ExpandConstant('{app}\out.dat'), false, false) then break;
        if not ISPackZIP       ( 0, 0, ExpandConstant('{app}\1a1\*'), ExpandConstant('{app}\1a1.pak'), 2, false ) then break;
        if not ISExec          ( 0, 0, 0, ExpandConstant('{tmp}\Arc.exe'), ExpandConstant('x -o+ "{src}\001.arc" "{app}\"'), ExpandConstant('{tmp}'), '...',false) then break;
        if not ShowChangeDiskWindow ('Пожалуйста, вставьте второй диск и дождитесь его инициализации.', ExpandConstant('{src}'),'CODMW_2.arc') then break;

//    распаковка группы файлов посредством внешнего приложения

        FindHandle1:=ISFindFiles(0,ExpandConstant('{app}\*.ogg'),ColFiles1);
        ExecError:=false;
        while not ExecError and ISPickFilename(FindHandle1,ExpandConstant('{app}\'),CurIndex1,true) do
        begin
          InFilePath:=ISGetName(0);
          OutFilePath:=ISGetName(1);
          OutFileName:=ISGetName(2);
          ExecError:=not ISExec(0, 0, 0, ExpandConstant('{tmp}\oggdec.exe'), '"'+InFilePath+'" -w "'+OutFilePath+'"',ExpandConstant('{tmp}'),OutFileName,false);
        end;
        ISFindFree(FindHandle1);
        if ExecError then break;
*)
        ISDoneError:=false;
      until true;
      ISDoneStop;
    end;
    HideControls;
  end;
  if {(CurStep=ssPostInstall) and} ISDoneError then
  begin
    Exec2(ExpandConstant('{uninstallexe}'), '/VERYSILENT', false);
  end;
end;[/SOURCE][/SPOILER] Теперь почему мне не нравится повешание своего ивента на кнопку отмены.
Вот что предлагает сама инно в плане правильной подмены ивента:
[SPOILER="код"][SOURCE="iss"]var
  OldEvent_CancelButtonClick: TNotifyEvent;

procedure _CancelButtonClick(Sender: TObject);
begin
  OldEvent_CancelButtonClick(Sender);
end;

procedure InitializeWizard();
begin
  with WizardForm.CancelButton do
  begin
    OldEvent_CancelButtonClick := OnClick;
    OnClick := @_CancelButtonClick;
  end;
end;[/SOURCE][/SPOILER]
Поскольку я люблю все делать таки правильно, то это для меня слишком много, а тупо присвоить другой ивент без сохранения старого мне не позволяет религия, хотя я процентов на 99 уверен, что это не должно вызывать никаких ошибок, но все-же.
 
Последнее редактирование:

Mailchik

Старожил
Проверенный
LexBell
const
PCFonFLY=true;
notPCFonFLY=false;
var
LabelPct1,LabelCurrFileName,LabelTime1,LabelTime2,LabelTime3: TLabel;
ISDoneProgressBar1: TNewProgressBar;
#ifdef SecondProgressBar
LabelPct2: TLabel;
ISDoneProgressBar2:TNewProgressBar;
#endif
MyCancelButton: TButton;
ISDoneCancel:integer;
ISDoneError:boolean;
PCFVer:double;
PauseButton: TNewButton;
IsDoneUnpack : Boolean;

type
TCallback = function (OveralPct,CurrentPct: integer;CurrentFile,TimeStr1,TimeStr2,TimeStr3:pAnsiChar): longword;

function WrapCallback(callback:TCallback; paramcount:integer):longword;external 'wrapcallback@files:ISDone.dll stdcall delayload';

function ISArcExtract(CurComponent:Cardinal; PctOfTotal:double; InName, OutPath, ExtractedPath: AnsiString; DeleteInFile:boolean; Password, CfgFile, WorkPath: AnsiString; ExtractPCF: boolean ):boolean; external 'ISArcExtract@files:ISDone.dll stdcall delayload';
function IS7ZipExtract(CurComponent:Cardinal; PctOfTotal:double; InName, OutPath: AnsiString; DeleteInFile:boolean; Password: AnsiString):boolean; external 'IS7zipExtract@files:ISDone.dll stdcall delayload';
function ISRarExtract(CurComponent:Cardinal; PctOfTotal:double; InName, OutPath: AnsiString; DeleteInFile:boolean; Password: AnsiString):boolean; external 'ISRarExtract@files:ISDone.dll stdcall delayload';
function ISPrecompExtract(CurComponent:Cardinal; PctOfTotal:double; InName, OutFile: AnsiString; DeleteInFile:boolean):boolean; external 'ISPrecompExtract@files:ISDone.dll stdcall delayload';
function ISSRepExtract(CurComponent:Cardinal; PctOfTotal:double; InName, OutFile: AnsiString; DeleteInFile:boolean):boolean; external 'ISSrepExtract@files:ISDone.dll stdcall delayload';
function ISxDeltaExtract(CurComponent:Cardinal; PctOfTotal:double; minRAM,maxRAM:integer; InName, DiffFile, OutFile: AnsiString; DeleteInFile, DeleteDiffFile:boolean):boolean; external 'ISxDeltaExtract@files:ISDone.dll stdcall delayload';
function ISPackZIP(CurComponent:Cardinal; PctOfTotal:double; InName, OutFile: AnsiString;ComprLvl:integer; DeleteInFile:boolean):boolean; external 'ISPackZIP@files:ISDone.dll stdcall delayload';
function ShowChangeDiskWindow(Text, DefaultPath, SearchFile:AnsiString):boolean; external 'ShowChangeDiskWindow@files:ISDone.dll stdcall delayload';

function Exec2 (FileName, Param: PAnsiChar;Show:boolean):boolean; external 'Exec2@files:ISDone.dll stdcall delayload';
function ISFindFiles(CurComponent:Cardinal; FileMask:AnsiString; var ColFiles:integer):integer; external 'ISFindFiles@files:ISDone.dll stdcall delayload';
function ISPickFilename(FindHandle:integer; OutPath:AnsiString; var CurIndex:integer; DeleteInFile:boolean):boolean; external 'ISPickFilename@files:ISDone.dll stdcall delayload';
function ISGetName(TypeStr:integer):pAnsichar; external 'ISGetName@files:ISDone.dll stdcall delayload';
function ISFindFree(FindHandle:integer):boolean; external 'ISFindFree@files:ISDone.dll stdcall delayload';
function ISExec(CurComponent:Cardinal; PctOfTotal,SpecifiedProcessTime:double; ExeName,Parameters,TargetDir,OutputStr:AnsiString;Show:boolean):boolean; external 'ISExec@files:ISDone.dll stdcall delayload';

function SrepInit(TmpPath:pAnsiChar;VirtMem,MaxSave:Cardinal):boolean; external 'SrepInit@files:ISDone.dll stdcall delayload';
function PrecompInit(TmpPath:pAnsiChar;VirtMem:cardinal;PrecompVers:single):boolean; external 'PrecompInit@files:ISDone.dll stdcall delayload';
function FileSearchInit(RecursiveSubDir:boolean):boolean; external 'FileSearchInit@files:ISDone.dll stdcall delayload';
function ISDoneInit(RecordFileName:AnsiString; TimeType,Comp1,Comp2,Comp3:Cardinal; WinHandle, NeededMem:longint; callback:TCallback):boolean; external 'ISDoneInit@files:ISDone.dll stdcall';
function ISDoneStop:boolean; external 'ISDoneStop@files:ISDone.dll stdcall';
function ChangeLanguage(Language:AnsiString):boolean; external 'ChangeLanguage@files:ISDone.dll stdcall delayload';
function SuspendProc:boolean; external 'SuspendProc@files:ISDone.dll stdcall';
function ResumeProc:boolean; external 'ResumeProc@files:ISDone.dll stdcall';

function ProgressCallback(OveralPct,CurrentPct: integer;CurrentFile,TimeStr1,TimeStr2,TimeStr3:pAnsiChar): longword;
begin
if OveralPct<=1000 then ISDoneProgressBar1.Position := OveralPct;
LabelPct1.Caption := IntToStr(OveralPct div 10)+'.'+chr(48 + OveralPct mod 10)+'%';
LabelCurrFileName.Caption:=ExpandConstant('{cm:ExtractedFile} ')+MinimizePathName(CurrentFile, LabelCurrFileName.Font, LabelCurrFileName.Width-ScaleX(100));
LabelTime1.Caption:=ExpandConstant('{cm:ElapsedTime} ')+TimeStr2;
LabelTime2.Caption:=ExpandConstant('{cm:RemainingTime} ')+TimeStr1;
LabelTime3.Caption:=ExpandConstant('{cm:AllElapsedTime}')+TimeStr3;
Result := ISDoneCancel;
end;

procedure CancelButtonClick(CurPageID: Integer; var Cancel, Confirm: Boolean);
begin
if ((CurPageID = wpInstalling) and IsDoneUnpack) then
begin
SuspendProc; // ставим распаковку, или чего там сейчас IsDone делает, на паузу
if ExitSetupMsgBox then ISDoneCancel:=1; // настоящая отмена происходит тут
Confirm := False; // убираем запрос подтверждения выхода
Cancel := False; // да и саму отмену тоже запрещаем, что-бы библиотека IsDone могла корректно отработать
ResumeProc; // продолжаем работу IsDone с учетом изменивхшихся или не изменившихся условий
end else
begin
Confirm := True;
Cancel := ExitSetupMsgBox;
end;
end;

procedure HideControls;
begin
WizardForm.FileNamelabel.Hide;
ISDoneProgressBar1.Hide;
LabelPct1.Hide;
LabelCurrFileName.Hide;
LabelTime1.Hide;
LabelTime2.Hide;
end;

procedure CreateControls;
var PBTop:integer;
begin
PBTop:=ScaleY(50);
ISDoneProgressBar1 := TNewProgressBar.Create(WizardForm);
with ISDoneProgressBar1 do begin
Parent := WizardForm.InstallingPage;
Height := WizardForm.ProgressGauge.Height;
Left := ScaleX(0);
Top := PBTop;
Width := ScaleX(365);
Max := 1000;
end;
LabelPct1 := TLabel.Create(WizardForm);
with LabelPct1 do begin
Parent := WizardForm.InstallingPage;
AutoSize := False;
Left := ISDoneProgressBar1.Width+ScaleX(5);
Top := ISDoneProgressBar1.Top + ScaleY(2);
Width := ScaleX(80);
end;
LabelCurrFileName := TLabel.Create(WizardForm);
with LabelCurrFileName do begin
Parent := WizardForm.InstallingPage;
AutoSize := False;
Width := ISDoneProgressBar1.Width+ScaleX(30);
Left := ScaleX(0);
Top := ScaleY(30);
end;
LabelTime1 := TLabel.Create(WizardForm);
with LabelTime1 do begin
Parent := WizardForm.InstallingPage;
AutoSize := False;
Width := ISDoneProgressBar1.Width div 2;
Left := ScaleX(0);
Top := PBTop + ScaleY(35);
end;
LabelTime2 := TLabel.Create(WizardForm);
with LabelTime2 do begin
Parent := WizardForm.InstallingPage;
AutoSize := False;
Width := LabelTime1.Width+ScaleX(40);
Left := ISDoneProgressBar1.Width div 2;
Top := LabelTime1.Top;
end;
LabelTime3 := TLabel.Create(WizardForm);
with LabelTime3 do begin
Parent := WizardForm.FinishedPage;
AutoSize := False;
Width := 300;
Left := 180;
Top := 200;
end;
end;
Procedure CurPageChanged(CurPageID: Integer);
Begin
if (CurPageID = wpFinished) then
begin
PauseButton.Hide;
if (CurPageID = wpFinished) and ISDoneError then
begin
LabelTime3.Hide;
PauseButton.Hide;
WizardForm.Caption:= ExpandConstant('{cm:Error}');
WizardForm.FinishedLabel.Font.Color:= clRed;
WizardForm.FinishedLabel.Caption:= SetupMessage(msgSetupAborted) ;
end;
end;
end;

function CheckError:boolean;
begin
result:= not ISDoneError;
end;

procedure CurStepChanged(CurStep: TSetupStep);
var Comps1,Comps2,Comps3, TmpValue:cardinal;
FindHandle1,ColFiles1,CurIndex1,tmp:integer;
ExecError:boolean;
InFilePath,OutFilePath,OutFileName:pAnsiChar;
begin
if CurStep = ssPostInstall then begin //Если необходимо, можно поменять на ssPostInstall
IsDoneUnpack := True;
WizardForm.ProgressGauge.Hide;
WizardForm.CancelButton.Enabled:=True;
CreateControls;
WizardForm.StatusLabel.Caption:=ExpandConstant('{cm:Extracted}');
ISDoneCancel:=0;

// Распаковка всех необходимых файлов в папку {tmp}.

ExtractTemporaryFile('unarc.dll');

#ifdef PrecompInside
ExtractTemporaryFile('CLS-precomp.dll');
ExtractTemporaryFile('packjpg_dll.dll');
ExtractTemporaryFile('packjpg_dll1.dll');
ExtractTemporaryFile('precomp.exe');
ExtractTemporaryFile('zlib1.dll');
#endif
#ifdef SrepInside
ExtractTemporaryFile('CLS-srep.dll');
#endif
#ifdef MSCInside
ExtractTemporaryFile('CLS-MSC.dll');
#endif
#ifdef facompress
ExtractTemporaryFile('facompress.dll'); //ускоряет распаковку .arc архивов.
#endif
#ifdef records
ExtractTemporaryFile('records.inf');
#endif
#ifdef precomp
#if precomp == "0.38"
ExtractTemporaryFile('precomp038.exe');
#else
#if precomp == "0.4"
ExtractTemporaryFile('precomp040.exe');
#else
#if precomp == "0.41"
ExtractTemporaryFile('precomp041.exe');
#else
#if precomp == "0.42"
ExtractTemporaryFile('precomp042.exe');
#else
ExtractTemporaryFile('precomp038.exe');
ExtractTemporaryFile('precomp040.exe');
ExtractTemporaryFile('precomp041.exe');
ExtractTemporaryFile('precomp042.exe');
#endif
#endif
#endif
#endif
#endif
#ifdef unrar
ExtractTemporaryFile('Unrar.dll');
#endif
#ifdef XDelta
ExtractTemporaryFile('XDelta3.dll');
#endif
#ifdef PackZIP
ExtractTemporaryFile('7z.dll');
ExtractTemporaryFile('PackZIP.exe');
#endif

ExtractTemporaryFile('English.ini');

// Подготавливаем переменную, содержащую всю информацию о выделенных компонентах для ISDone.dll
// максимум 96 компонентов.
Comps1:=0; Comps2:=0; Comps3:=0;
#ifdef Components
TmpValue:=1;
if IsComponentSelected('text\rus') then Comps1:=Comps1+TmpValue; //компонент 1
TmpValue:=TmpValue*2;
if IsComponentSelected('text\eng') then Comps1:=Comps1+TmpValue; //компонент 2
TmpValue:=TmpValue*2;
if IsComponentSelected('voice\rus') then Comps1:=Comps1+TmpValue; //компонент 3
TmpValue:=TmpValue*2;
if IsComponentSelected('voice\eng') then Comps1:=Comps1+TmpValue; //компонент 4
// .....
// см. справку
#endif

#ifdef precomp
PCFVer:={#precomp};
#else
PCFVer:=0;
#endif
ISDoneError:=true;
if ISDoneInit(ExpandConstant('{src}\records.inf'), $F777, Comps1,Comps2,Comps3, MainForm.Handle, {#NeedMem}, @ProgressCallback) then begin
repeat
// ChangeLanguage('English');
if not SrepInit('',512,0) then break;
if not PrecompInit('',128,PCFVer) then break;
if not FileSearchInit(true) then break;

if not ISArcExtract ( 0, 0, ExpandConstant('{src}\*.arc'), ExpandConstant('{app}'), '', false, '', '', ExpandConstant('{app}'), notPCFonFLY {PCFonFLY}) then break;
PauseButton.Hide;
ISDoneError:=false;
until true;
ISDoneStop;
IsDoneUnpack := False;
end;
HideControls;
WizardForm.CancelButton.Visible:=true;
WizardForm.CancelButton.Enabled:=false;
end;
if (CurStep=ssPostInstall) and ISDoneError then begin
Exec2(ExpandConstant('{uninstallexe}'), '/VERYSILENT', false);
end;
end;

procedure InitializeWizard();
begin
IsDoneUnpack := False;
end;
Потому что на этапе ssPostInstall событие CancelButtonClick не срабатывает..
Используй своё событие, как ты и предложил 2 страницы назад
 
Последнее редактирование:

vint56

Ветеран
Проверенный
LexBell тот пример что ты выложил у меня тоже не работал сделал вот так и все стало работать и спасибо за направления
[SOURCE="iss"]procedure WizardFormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
case ISDoneStopUP of
False:
begin
SuspendProc;
if ExitSetupMsgBox then ISDoneCancel:=1;
ResumeProc;
end;
True : CanClose := True;
end;
end;[/SOURCE]
[MOD="LexBell"]Это не направление, это уже гарантированно рабочий пример. направления я давал в течении последних 2-х страниц :)[/MOD]
 
Последнее редактирование модератором:

Shift85

Старожил
Как через ботву наложить такую форму чтобы зеленые края потом были прозрачные

Если нетрудно покажите пожалуйста пример...
 
Статус
В этой теме нельзя размещать новые ответы.
Сверху