Ru-Board.club
← Вернуться в раздел «Программы»

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

Автор: AlekseyPopovv
Дата сообщения: 24.10.2013 15:05
Genri
Примерно вот так что бы было
В справке читал про это , но как прикрутить это не знаю. Помогите пожалуйста.

Добавлено:
nik1967
Спасибо. Буду пробовать.
Автор: Genri
Дата сообщения: 24.10.2013 16:09
nik1967

Цитата:
одна устанавливается в систему, другая просто распаковывается в папку назначения
-- все немного сложнее. Подавляющее большинство инсталляторов, позволяют указать папку назначения вне зависимости от того, устанавливается "обычная" версия или портабельная. И даже отсутствие деинсталлятора не сделает программу "портабельной" если она использует какие-либо ключи в реестре или какие-либо файлы в системной директории.

AlekseyPopovv

Цитата:
Примерно вот так что бы было
-- создать сами пункты достаточно просто. В топике масса примеров. Но как я сказал выше, отсутствие деинсталлятора, не сделает программу портабельной. Портабельность подразумевает, что папку с программой можно просто скопировать на другой комп и она нормально заработает. Если программа не использует никаких сторонних файлов, кроме как из своей папки и не прописывает ключи в реестр, тогда она априори портабельная. Вне зависимости от наличия или отсутствия деинсталлятора.
Но если например "обычная" версия использует для хранения настроек реестр, а портабельная вместо реестра хранит настройки в инишнике, тогда это должно быть предусмотрено в самой программе. Отсюда и вопрос - чем в твоем случае отличаются обычная и портабельная версии? Если только наличием деинсталлятора - см. примеры ув.nik1967. Если местом хранения настроек - озвучь варианты.
Автор: SotM
Дата сообщения: 24.10.2013 19:42
AlekseyPopovv
Это прикол такой с выкладыванием таких широких скриншотов?! Убери под кат!
Автор: Dobry_Doctor
Дата сообщения: 25.10.2013 13:37
Доброго времени суток всем.
Для "красивого" прерывания процесса инсталла, если после wpInfoBefore (ну или wpWelcome) не прошла проверка некоторых условий, пользовался ShouldSkipPage() с пропуском wpSelectDir,wpSelectProgramGroup,wpSelectTasks,wpReady,wpPreparing,wpInstalling,wpInfoAfter. В результате довольно "красиво" вываливался в wpFinished. До тех пор пока не решил вручную создать свою форму с контролами и после ввода в контролы некоторых значений сделать еще одну проверку.
Вопрос : какой PageID нужно указать в ShouldSkipPage(), чтобы и созданная MyPage (находящаяся сразу после wpInfoBefore) была пропущена ? Или может это делается как-то по-другому ?
Вот кусок кода из секции Code:

Код:
var MyPage: TWizardPage;
fAbortSetup: Boolean;

procedure CreateNewPage;
begin
MyPage:=CreateCustomPage(wpInfoBefore, 'Текст1', 'Текст2');

TopText:=TLabel.Create(MyPage)
...

Edit1:=TEdit.Create(MyPage)
...

// и т.д.
end;

procedure InitializeWizard();
begin
{ Custom wizard pages }
CreateNewPage;
end;

function InitializeSetup(): Boolean;
begin
fAbortSetup := false;
Result:=True;
end;

function NextButtonClick(CurPageID: Integer): Boolean;
begin
Result := true;

case CurPageID of
wpInfoBefore:
begin

// проверка некоторых условий, например
if условие=false then
begin
if ActiveLanguage = 'English' then
MsgBox('The operating system is not found the installed program.', mbInformation, MB_OK);
if ActiveLanguage = 'Russian' then
MsgBox('В операционной системе не найдено установленной программы.', mbInformation, MB_OK);
fAbortSetup := true;
end;
end;
end;
end;

function ShouldSkipPage(PageID: Integer): Boolean;
begin
if fAbortSetup then
begin
case PageID of
wpSelectDir,wpSelectProgramGroup,wpSelectTasks,wpReady,wpPreparing,wpInstalling,wpInfoAfter: Result := True;
end;
if ActiveLanguage = 'English' then WizardForm.FinishedLabel.Caption := 'Update installation is aborted.'+#10+#13+'Click "Finish" to exit the installation'
else if ActiveLanguage = 'Russian' then WizardForm.FinishedLabel.Caption := 'Установка обновления прервана.'+#10+#13+'Нажмите "Завершить" чтобы выйти из программы установки.';
end;
end;
Автор: nik1967
Дата сообщения: 25.10.2013 14:15
Dobry_Doctor, MyPage.ID
Автор: cepbl4
Дата сообщения: 27.10.2013 12:10
Ребята, подскажите, пжл, как на странице Task-ов сделать следующее:

при заходе на страницу тасков видны некоторые таски и вот так:
...
Таск1 радиобатон выбран
Таск2 радиобатон невыбран

при выбирании радиобатона Таска2, появляется список из некоторых подтасков, примерно так:

Таск1
Таск2
Таск2.1
Таск2.2
...
Таск2.n

Т.е. чтобы появлялся раскрывающийся список Тасков 2.n только при выборе Таска 2.

[more] [/more]
Автор: tuz1979
Дата сообщения: 28.10.2013 01:33
привет всем!
помогите пожалуйста сделать инсталятор как етот
https://disk.yandex.ua/public/?hash=Y7qiL%2BMzyDihg7Gf2MzY3jGrflUJ%2BTw6yEVfRMTdPfk%3D
Автор: AlekseyPopovv
Дата сообщения: 28.10.2013 16:31
Помогите вот с такой штукой:

Нужно чтобы при выборе "Распаковка портативной версии" галочки были не активные. Вот код:
[Tasks]
; Тип
; normalmode
Name: normalmode; Description: Установка обычной версии; GroupDescription: "Тип:"; Flags: exclusive
; portablemode
Name: portablemode; Description: Распаковка портативной версии; GroupDescription: "Тип:"; Flags: exclusive unchecked
; Дополнительно
; Ярлык(и) на «Рабочем столе»
Name: "desktopicon"; Description: "Ярлык(и) на «Рабочем столе»"; GroupDescription: "Дополнительно:"; Flags: checkedonce
; Ярлыки в меню «Пуск»
Name: "starticon"; Description: "Ярлыки в меню «Пуск»"; GroupDescription: "Дополнительно:"; Flags: checkedonce
Автор: uselocker
Дата сообщения: 28.10.2013 20:38
Всем привет! Прошу помощи коллективного разума. Задача стоит такая: в ини файл записать путь к офисным приложениям. Как бы вроде все просто но уже покопав доки и попробовав много вариантов решил обратиться за помощью. Типовые задачи описанные есть и я из них попытался собрать вариант для себя, но вижу что я скорее всего что-то упускаю. Странно но не работает в самой простой конфигурации скрипта. А именно если задать тестовый вариант то ничего в файле не меняется.
пример

Код:
[INI]
Filename: "bis.ini"; Section: "application"; Key: "rtfedit"; String: "sdjkfgskljgsldkjgdslkjghsklgj"
Автор: trolltmn
Дата сообщения: 29.10.2013 09:49
Доброго времени суток господа, снова к вам на поклон за помощью.

Решил реализовать бэкап, но не по простому пути а через хитрую пятую точку, и столкнулся с проблемой.

имеем:

Код:
#define BackBTNCheck "{code:BackupButtonVis}"; проверка истиности наличия бэкапа

// секция проверки показа кнопки на стартовой странице
Function BackupButtonVis(BTNCheck: boolean): String;
begin
    BTNCheck := True;
    If FileExists(ExpandConstant('{app}\backup.7z')) then begin
    BTNCheck := False;
    end;
end;
// конец секции проверки показа кнопки на стартовой странице

wpWelcome:
begin
ImgSetVisibility(work1,True);
PageNameLabel.Show
WelcomeLabel1.Show
WelcomeLabel2.Show
#if "True" == BackBTNCheck
BtnSetVisibility(Backbtn,True);
#elif "False" == BackBTNCheck
BtnSetVisibility(UnBackbtn,True);
#else
BtnSetVisibility(Backbtn,True);
#endif
end;

Автор: Gourmet
Дата сообщения: 29.10.2013 10:06
Genri

Цитата:
Код:
Source: {#GetEnv("ENVVAR")}\MyProg.exe; DestDir: {app}


- это работает, попробовали по аналогии

Source: "{#ExpandConstant('{userdocs}')}\Visual Studio 2005\Projects\SKIP.src\hlp\hlp.rus\kdstc.cnt"; DestDir: "{app}\"; Flags: restartreplace; Languages: rus

ругается на ExpandConstant
Автор: AlekseyPopovv
Дата сообщения: 29.10.2013 12:08
Ребята. С моей проблемой может кто ни будь помочь?
Автор: R3Pa4eK
Дата сообщения: 29.10.2013 15:25
Gourmet
Source: "{userdocs}\Visual Studio 2005\Projects\SKIP.src\hlp\hlp.rus\kdstc.cnt"; DestDir: "{app}\"; Flags: restartreplace; Languages: rus
Автор: Gourmet
Дата сообщения: 29.10.2013 15:39
R3Pa4eK

Цитата:
Source: "{userdocs}\Visual Studio 2005\Projects\SKIP.src\hlp\hlp.rus\kdstc.cnt"; DestDir: "{app}\"; Flags: restartreplace; Languages: rus


нет, такое не работает, мы с этого начинали, но просто константы в Source не раскрываются


Цитата:
Error: Source file "C:\Setup\{userdocs}\Visual Studio 2005\Projects\SKIP.src\hlp\hlp.rus\kdstc.cnt" does not exist.

Автор: Genri
Дата сообщения: 29.10.2013 20:15
AlekseyPopovv

Цитата:
Нужно чтобы при выборе "Распаковка портативной версии" галочки были не активные.
-- адаптируй под свои нужды:
[more]
Код:
[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application

[Tasks]
Name: task1; Description: "taskA"; GroupDescription: "Additional task:"; Flags: unchecked exclusive
Name: task2; Description: "task"; GroupDescription: "Additional task:"; Flags: exclusive
Name: task2\1; Description: "taskB"; GroupDescription: "Additional task:"; Flags: unchecked
Name: task2\2; Description: "taskC"; GroupDescription: "Additional task:"; Flags: unchecked
Name: task2\3; Description: "taskD"; GroupDescription: "Additional task:"; Flags: unchecked
Автор: Gourmet
Дата сообщения: 30.10.2013 08:01

Цитата:
Gourmet -- одна и та же ошибка - путаете директивы препроцессора и функции компилятора. Директивы препроцессора выполняются при сборке (при создании инсталлятора); функции - при запуске инсталлятора.


в хелпе inno setup они все называются функциями, никакого различия нет

то есть, нет возможности получить маршрут к Моим Документам при создании архива? не статически, динамически, поскольку в разных ОС он разный
Автор: tuz1979
Дата сообщения: 30.10.2013 10:11
ребята подскажите как добавить кнопки вот здесь


вот скрипт

[more];Название приложения
#define MyAppName "Batman - Arkham Asylum GOTY"

;Заголовок
#define MyAppName1 "Batman - Arkham Asylum GOTY"

;Екзешник
#define ExeName "BmLauncher.exe"

;Рабочая папка
#define WorkDir "{app}\Binaries"

;Место
#define NeedSize "9.74 GB"
#define NeedSizeInBytes "10462445624"
#define NeedMem 256
;#define SecondProgressBar

#define Components
;Размер компонетлиста
#define Short
;#define Long

;#define records

#define facompress
;#define PrecompInside
#define SrepInside
;#define MSCInside
;#define precomp "0.42"
;#define unrar
;#define XDelta
;#define PackZIP
#include "Files\TransparentStatic.iss"
#include "{tmp}\botva2.iss"

[Setup]
AppID={#MyAppName}_Seraph1
AppName={#MyAppName}
AppVerName={#MyAppName}
DefaultGroupName={#MyAppName}
DefaultDirName={pf}\{#MyAppName}
OutputBaseFilename=Installer
setupiconfile=icon.ico
UninstallFilesDir={userappdata}\{#MyAppName}_unistall
AppPublisher=Seraph1
VersionInfoCopyright=Seraph1
ExtraDiskSpaceRequired={#NeedSizeInBytes}

[Messages]
rus.ExitSetupMessage=Выйти из программы установки?
eng.ExitSetupMessage=Exit Setup program?

[Languages]
Name: rus; MessagesFile: compiler:Languages\Russian.isl
Name: eng; MessagesFile: compiler:Default.isl

[Files]
Source: "{tmp}\isxdl.dll"; DestDir: "{tmp}"; MinVersion: 0.0,5.0; Flags: deleteafterinstall dontcopy
Source: "{tmp}\russian.ini"; DestDir: "{tmp}"; MinVersion: 0.0,5.0; Flags: deleteafterinstall dontcopy
Source: "{tmp}\botva2.dll"; DestDir: "{tmp}"; MinVersion: 0.0,5.0; Flags: deleteafterinstall dontcopy
Source: "{tmp}\botva2.iss"; DestDir: "{tmp}"; MinVersion: 0.0,5.0; Flags: deleteafterinstall dontcopy
Source: "{tmp}\CallbackCtrl.dll"; DestDir: "{tmp}"; MinVersion: 0.0,5.0; Flags: deleteafterinstall dontcopy
Source: "{tmp}\btn1.png"; DestDir: "{tmp}"; MinVersion: 0.0,5.0; Flags: deleteafterinstall dontcopy
Source: "{tmp}\btn2.png"; DestDir: "{tmp}"; MinVersion: 0.0,5.0; Flags: deleteafterinstall dontcopy
Source: "{tmp}\btn3.png"; DestDir: "{tmp}"; MinVersion: 0.0,5.0; Flags: deleteafterinstall dontcopy
Source: "{tmp}\btn4.png"; DestDir: "{tmp}"; MinVersion: 0.0,5.0; Flags: deleteafterinstall dontcopy
Source: "{tmp}\btn5.png"; DestDir: "{tmp}"; MinVersion: 0.0,5.0; Flags: deleteafterinstall dontcopy
Source: "{tmp}\dotnetfx35setup.exe"; DestDir: "{tmp}"; MinVersion: 0.0,5.0; Flags: deleteafterinstall ignoreversion dontcopy
; Source: "{app}\res_mods\0.8.8\audio\"; DestDir: "{app}\res_mods\0.8.8\audio"; Components: g0\c03\c0302 g0\c04 g0\c05\c0504; MinVersion: 0.0,5.0; Flags: ignoreversion

Source: Files\0.bmp; DestDir: {tmp}; Flags: dontcopy
Source: Files\1.bmp; DestDir: {tmp}; Flags: dontcopy
Source: Files\2.bmp; DestDir: {tmp}; Flags: dontcopy
Source: Files\3.bmp; DestDir: {tmp}; Flags: dontcopy
Source: Files\btnimage.bmp; DestDir: {tmp}; Flags: dontcopy
Source: Files\Button.bmp; DestDir: {tmp}; Flags: dontcopy
Source: Files\CallbackCtrl.dll; Flags: dontcopy
Source: Files\InnoCallback.dll; Flags: dontcopy

Source: Isdone\English.ini; DestDir: {tmp}; Flags: dontcopy
Source: Isdone\Russian.ini; DestDir: {tmp}; Flags: dontcopy
Source: Isdone\unarc.dll; DestDir: {tmp}; Flags: dontcopy
Source: Isdone\ISDone.dll; DestDir: {tmp}; Flags: dontcopy
#ifdef records
Source: output\records.inf; DestDir: {tmp}; Flags: dontcopy
#endif

#ifdef PrecompInside
Source: Isdone\CLS-precomp.dll; DestDir: {tmp}; Flags: dontcopy
Source: Isdone\packjpg_dll.dll; DestDir: {tmp}; Flags: dontcopy
Source: Isdone\packjpg_dll1.dll; DestDir: {tmp}; Flags: dontcopy
Source: Isdone\precomp.exe; DestDir: {tmp}; Flags: dontcopy
Source: Isdone\zlib1.dll; DestDir: {tmp}; Flags: dontcopy
#endif
#ifdef SrepInside
Source: Isdone\CLS-srep.dll; DestDir: {tmp}; Flags: dontcopy
#endif
#ifdef MSCInside
Source: Isdone\CLS-MSC.dll; DestDir: {tmp}; Flags: dontcopy
#endif
#ifdef facompress
Source: Isdone\facompress.dll; DestDir: {tmp}; Flags: dontcopy
#endif
#ifdef precomp
#if precomp == "0.38"
; Source: Isdone\precomp038.exe; DestDir: {tmp}; Flags: dontcopy
#else
#if precomp == "0.4"
; Source: Isdone\precomp040.exe; DestDir: {tmp}; Flags: dontcopy
#else
#if precomp == "0.41"
; Source: Isdone\precomp041.exe; DestDir: {tmp}; Flags: dontcopy
#else
#if precomp == "0.42"
; Source: Isdone\precomp042.exe; DestDir: {tmp}; Flags: dontcopy
#else
; Source: Isdone\precomp038.exe; DestDir: {tmp}; Flags: dontcopy
; Source: Isdone\precomp040.exe; DestDir: {tmp}; Flags: dontcopy
; Source: Isdone\precomp041.exe; DestDir: {tmp}; Flags: dontcopy
; Source: Isdone\precomp042.exe; DestDir: {tmp}; Flags: dontcopy
#endif
#endif
#endif
#endif
#endif
#ifdef unrar
Source: Isdone\Unrar.dll; DestDir: {tmp}; Flags: dontcopy
#endif
#ifdef XDelta
Source: Isdone\XDelta3.dll; DestDir: {tmp}; Flags: dontcopy
#endif
#ifdef PackZIP
Source: Isdone\7z.dll; DestDir: {tmp}; Flags: dontcopy
Source: Isdone\packZIP.exe; DestDir: {tmp}; Flags: dontcopy
#endif

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

[CustomMessages]

rus.Icons=Создать ярлык на рабочем столе
rus.Group=Создать ярлыки в меню "Пуск"
rus.Welcome1='{#MyAppName1}'
rus.Welcome2=%nВас приветствует Мастер установки. Рекомендуется закрыть%nантивирусные пакеты,а так же все прочие приложения.
rus.Finished1='{#MyAppName1}'
rus.Finished2=%nУстановка успешко завершена. Запуск можно произвести при помощи%nсоответствующей иконки в меню Пуск или на рабочем столе.
rus.FreeSpace=Доступно места на диске:
rus.NeedSpace=Требуется места на диске:
rus.ExtractedFile=Извлекается файл:
rus.Extracted=Распаковка архивов...
rus.CancelButton=Отменить распаковку
rus.Error=Ошибка распаковки!
rus.Error2=Завершение установки...
rus.Error1=Установка не была завершена успешно.
rus.ElapsedTime=Прошло:
rus.RemainingTime=Осталось времени:
rus.EstimatedTime=Всего:
rus.AllElapsedTime=Время установки:
rus.voice=Язык озвучки
rus.interface=Язык интерфейса
rus.game=Язык игры
rus.eng=Английский
rus.rus=Русский
rus.rus1=Русский
rus.play1=Играть {#MyAppName}
rus.unins=Удалить {#MyAppName}
rus.soft=Дополнительный софт
rus.vc=Microsoft Visual C++ Redist
rus.vc1=Установка Microsoft Visual C++ Redist...
rus.dx=DirectX
rus.dx1=Обновление DirectX...
rus.dt=Установить Microsoft Net Framework 3.5
rus.dt1=Установка Microsoft Net Framework 3.5...
rus.px=Nvidia PhysX
rus.live=Games for Windows LIVE
rus.Install=Установить
rus.installing=Установка Дополнительного программного обеспечения...
rus.del=Удалить сохраненные игры?
rus.dlc=Загружаемый контент (DLC)
rus.interfaceru=Русский текст и Английская Озвучка (при выборе русского языка в лаунчере)
rus.disk=Вставте следующий диск.
rus.pb=Установить Punk Buster
rus.ger=Немецкий
rus.res=Изменить Разрешение
rus.ita=Итальянский
rus.pol=Польский
rus.por=Португальский
rus.spa=Испанский
rus.fre=Французский
rus.rc=Rockstar Games Social Club



eng.FreeSpace=Free space on disk:
eng.NeedSpace=Need space on disk:
eng.Welcome1='{#MyAppName}'
eng.Welcome2=%nWelcome to installation program. It is recommended to switch off%nanti-virus packages and also to close other applications.
eng.Finished2=%nInstallation was completed successfully.%nThe application may be launched by selected icons
eng.Icons=Create a desktop icon
eng.Group=Create a Start Menu icon
eng.FreeSpace=Free space on disc:
eng.NeedSpace=Required space on disc:
eng.ExtractedFile=Extracting File:
eng.Extracted=Unpacking archives...
eng.CancelButton=Cancel
eng.Error=Error unpacking!
eng.Error2=Finishing the Installation...
eng.Error1=lnstallation wasn't completed successfully.
eng.ElapsedTime=Elapsed Time:
eng.RemainingTime=Remaining time:
eng.EstimatedTime=Estimated Time:
eng.AllElapsedTime=Installing time:
eng.voice=Voice language
eng.interface=Interface language
eng.game=Game language
eng.eng=English
eng.rus=Russian
eng.rus1=Russian
eng.ita=Italian
eng.pol=Polish
eng.por=Portuguese
eng.spa=Spanish
eng.fre=French
eng.play1=Play {#MyAppName}
eng.unins=Uninstall {#MyAppName}
eng.soft=Additional software
eng.vc=Visual C++ Redist
eng.vc1=Installing Microsoft Visual C++ Redist...
eng.dt=Install Microsoft Net Framework 3.5
eng.dt1=Installing Microsoft Net Framework 3.5...
eng.live=Games for Windows LIVE
eng.px=Nvidia PhysX
eng.dx=DirectX
eng.dx1=Updating DirectX...
eng.install=Install
eng.installing=Installing Additional Software...
eng.del=Delete saved games?
eng.dlc=Downloadable Content (DLC)
eng.interfaceru=Russian text and English Voice (if you choose russian language if launcher)
eng.pb=Install Punk Buster
eng.ger=German
eng.res=Change Resolution





[Icons]

;Name: {group}\{cm:unins}; Filename: {uninstallexe}; Check: MakeStartMenuIcon and CheckError
;Name: {group}\Settlers 6; Filename: {app}\Play Settlers 6.exe; WorkingDir: {app}; Check: MakeStartMenuIcon and CheckError
;Name: {userdesktop}\Settlers 6; Filename: {app}\Play Settlers 6.exe; WorkingDir: {app}; Check: MakeDesktopIcon and CheckError
;Name: {group}\Settlers 6 - The Eastern Realm; Filename: {app}\Play Settlers 6 - The Eastern Realm.exe; WorkingDir: {app}; Check: MakeStartMenuIcon and CheckError
;Name: {userdesktop}\Settlers 6 - The Eastern Realm; Filename: {app}\Play Settlers 6 - The Eastern Realm.exe; WorkingDir: {app}; Check: MakeDesktopIcon and CheckError

Name: {group}\{cm:unins}; Filename: {uninstallexe}; Check: MakeStartMenuIcon and CheckError
Name: {group}\{cm:play1}; Filename: {#WorkDir}\{#ExeName}; WorkingDir: {#WorkDir}; Check: MakeStartMenuIcon and CheckError; Parameters: -scofflineonly
Name: {userdesktop}\{#MyAppName}; Filename: {#WorkDir}\{#ExeName}; WorkingDir: {#WorkDir}; Check: MakeDesktopIcon and CheckError; Parameters: -scofflineonly






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

[Components]
//Name: pack; Description: {cm:pack}; Types: full
Name: text; Description: {cm:game}; Flags: fixed checkablealone; Types: full
Name: text\eng; Description: {cm:eng}; Flags: exclusive
Name: text\rus; Description: {cm:rus}; Flags: exclusive; Types: full
Name: soft; Description: {cm:soft}; Types: full
Name: soft\dx; Description: {cm:dx}; Types: full
Name: soft\vc; Description: {cm:vc}; Types: full
Name: soft\px; Description: {cm:px}; Types: full
Name: soft\live; Description: {cm:live}; Types: full
;Name: soft\rc\del; Description: Delete {cm:rc}; Types: full




;Name: text\rus1; Description: {cm:rus1}; Flags: exclusive
;Name: Voice; Description: {cm:voice}; Flags: fixed checkablealone; Types: full
;Name: Voice\eng; Description: {cm:eng}; Flags: exclusive
;Name: Voice\rus; Description: {cm:rus}; Flags: exclusive
;Name: Voice\ger; Description: {cm:ger}; Flags: exclusive
;Name: dx; Description: {cm:dx}; Types: full
;Name: soft\live; Description: {cm:live}; Types: full
;Name: soft\pb; Description: {cm:pb}; Types: full
#endif


[Run]

Filename: {app}\Redist\DirectX\DXSETUP.exe; Components: soft\dx; Check: CheckError
Filename: {app}\Redist\vcredist_x86.exe; Components: soft\vc; Check: CheckError
Filename: {app}\Redist\PhysX.exe; Components: soft\px; Check: CheckError
Filename: {app}\Redist\gfwlivesetup.exe; Components: soft\vc; Check: CheckError
;Filename: {app}\Redist\pbsetup.exe; WorkingDir: {app}\Redist; Components: soft\pb; Check: CheckError

[Registry]
;{app}: ; Flags: uninsdeletekey


;Root: HKLM; SubKey: SOFTWARE\Ubisoft\Far Cry 2; ValueType: string; ValueName: InstallDir; ValueData: {app}; Flags: uninsdeletekey
Root: HKLM; SubKey: SOFTWARE\RocksteadyLtd\Batman Arkham Asylum GOTY; ValueType: string; ValueName: Install Directory; ValueData: {app}; Flags: uninsdeletekey
Root: HKLM; SubKey: SOFTWARE\RocksteadyLtd\Batman Arkham Asylum GOTY; ValueType: dword; ValueName: LaunchPostInstall; ValueData: $00000000; Flags: uninsdeletekey


[INI]
Filename: {app}\BmGame\Config\Installer.ini; Section: Language; Key: Language; String: rus; Components: text\rus

;Filename: "{app}\extra1\bba\s6lng.ini"; Section: "Settlers6"; Key: "Language"; String: "en"; Components: text\eng;



[Code]
//******************************************* [Начало - Элементы страниц] ***************************************************//
var
IsInit:Boolean;
n: Integer;
ResultStr:string;
ResultCode: Integer;

BorderWidth: Integer;

BGImage, BTNImage, ReadyBitmap: TBitmapImage;
BGImageStream, BTNImageStream: TMemoryStream;


procedure InitializeWizard1();
begin
with WizardForm do
begin
WizardForm.BorderIcons:= [biSystemMenu];
DirBrowseButton.Left:=390;
DirBrowseButton.Top:=105;
DirEdit.Left:=90;
DirEdit.Top:= 105;
DirBrowseButton.Width:=80;
DirEdit.width:=290;
GroupBrowseButton.Left:=390;
GroupBrowseButton.Top:=105;
GroupBrowseButton.Width:=80
GroupEdit.Left:=80;
GroupEdit.Top:= 105;
GroupEdit.width:=300;
GroupEdit.Color:= ClBlack
NextButton.BringToFront;
NextButton.Left:=300;
NextButton.Top:=270;
NextButton.Width:=80;
BackButton.BringToFront;
BackButton.Left:=210;
BackButton.Top:=270;
BackButton.Width:=80;
CancelButton.BringToFront;
CancelButton.Left:=390;
CancelButton.Top:=270;
CancelButton.Width:=80;
Font.Name:='Trebuchet MS';
DirEdit.Color:=clBlack;
Font.Color:=clWhite;
ProgressGauge.Top:=110;
ProgressGauge.Left:=235;
ProgressGauge.Width:=337;

ReadyMemo.Left:=100;
ReadyMemo.Top:= 100;
ReadyMemo.Width:=350;
ReadyMemo.Height:=166;
ReadyMemo.Font.Color:= clWhite;
ReadyMemo.ScrollBars:= ssNone; //ssVertical
ReadyMemo.Color:= clBlack;

InfoBeforeMemo.Left:=228;
InfoBeforeMemo.Top:=90;
InfoBeforeMemo.Width:=350;
InfoBeforeMemo.Height:=193;

InfoAfterMemo.Left:=228;
InfoAfterMemo.Top:=90;
InfoAfterMemo.Width:=350;
InfoAfterMemo.Height:=193;

BGImageStream := TMemoryStream.Create;
ExtractTemporaryFileToStream('0.bmp', BGImageStream);
BGImageStream.Position := 0;

BTNImageStream := TMemoryStream.Create;
ExtractTemporaryFileToStream('btnimage.bmp', BTNImageStream);
BTNImageStream.Position := 0;

BGImage := TBitmapImage.Create(WizardForm);
BGImage.Bitmap.LoadFromStream(BGImageStream);
BTNImage := TBitmapImage.Create(WizardForm);
BTNImage.Bitmap.LoadFromStream(BTNImageStream);

with WizardForm.ComponentsList do begin
ComponentsList.Left:=40;
ComponentsList.Top:=80;
//80
ComponentsList.Width:=193;
ComponentsList.Height:=147;
ComponentsList.Font.Color:= clWhite;
ComponentsList.Color:= clBlack;
ComponentsList.Font.Style:=[];
ComponentsList.Font.Name:='Trebuchet';
ComponentsList.BorderStyle := bsNone;
//ComponentsList.Font.Height:=15;
#ifdef Long
BorderWidth := (WizardForm.ComponentsList.Width-WizardForm.ComponentsList.ClientWidth) div 2;
if ItemCount > 5 then
LoadBGBmpFromBitmap(BGImage.Bitmap, WizardForm.ComponentsList.Left+BorderWidth/4, WizardForm.ComponentsList.Top+BorderWidth/4)
else
LoadBGBmpFromBitmap(BGImage.Bitmap, WizardForm.ComponentsList.Left+BorderWidth, WizardForm.ComponentsList.Top+BorderWidth);
LoadBtnBmpFromBitmap(btnimage.Bitmap);

#endif
#ifdef Short
BorderWidth := (WizardForm.ComponentsList.Width-WizardForm.ComponentsList.ClientWidth) div 2;
LoadBGBmpFromBitmap(BGImage.Bitmap, WizardForm.ComponentsList.Left+BorderWidth, WizardForm.ComponentsList.Top+BorderWidth);
LoadBtnBmpFromBitmap(btnimage.Bitmap);

#endif
end;
end;
end;
//******************************************* [Конец - Элементы страниц] ***************************************************//
//******************************************* [Начало - Размер окна инсталлятора] ***************************************************//
procedure InitializeWizard2();
begin
//WizardForm.Width:=506;
//WizardForm.Height:=332;

WizardForm.ClientWidth:=500;
WizardForm.ClientHeight:=300;

WizardForm.Position:=poScreenCenter;
//6 28
with WizardForm do
begin
InnerNotebook.Left:=0;
InnerNotebook.Top:=0;
InnerNotebook.Width:=500; //Ширина инсталлятора
InnerNotebook.Height:=300; //Высота инсталлятора
OuterNotebook.Left:=0;
OuterNotebook.Top:=0;
OuterNotebook.Width:=500; //Ширина инсталлятора
OuterNotebook.Height:=300; //Высота инсталлятора
end;
end;
//******************************************* [Конец - Размер окна инсталлятора] ***************************************************//
//******************************************* [Начало - Наложение изображений] ***************************************************//
var
BmpFile: TBitmapImage; //Наложение изображений
MyStream: TMemoryStream;

procedure InitializeWizard3();
begin
ExtractTemporaryFile('0.bmp');
ExtractTemporaryFile('1.bmp');
ExtractTemporaryFile('2.bmp');
ExtractTemporaryFile('3.bmp');


BmpFile:= TBitmapImage.Create(WizardForm);
BmpFile.Bitmap.LoadFromFile(ExpandConstant('{tmp}\1.bmp'));
BmpFile.SetBounds(0, 0, 500, 300);
BmpFile.Parent:= WizardForm.WelcomePage;

BmpFile:= TBitmapImage.Create(WizardForm);
BmpFile.Bitmap.LoadFromFile(ExpandConstant('{tmp}\2.bmp'));
BmpFile.SetBounds(0, 0, 500, 300);
BmpFile.Parent:= WizardForm.InfoBeforePage;

BmpFile:= TBitmapImage.Create(WizardForm);
BmpFile.Bitmap.LoadFromFile(ExpandConstant('{tmp}\2.bmp'));
BmpFile.SetBounds(0, 0, 500, 300);
BmpFile.Parent:= WizardForm.SelectDirPage;

BmpFile:= TBitmapImage.Create(WizardForm);
BmpFile.Bitmap.LoadFromFile(ExpandConstant('{tmp}\3.bmp'));
BmpFile.SetBounds(0, 0, 500, 300);
BmpFile.Stretch:= true
BmpFile.Parent:= WizardForm.SelectProgramGroupPage;

BmpFile:= TBitmapImage.Create(WizardForm);
BmpFile.Bitmap.LoadFromFile(ExpandConstant('{tmp}\0.bmp'));
BmpFile.SetBounds(0, 0, 500, 300);
BmpFile.Stretch:= true
BmpFile.Parent:= WizardForm.SelectComponentsPage;

BmpFile:= TBitmapImage.Create(WizardForm);
BmpFile.Bitmap.LoadFromFile(ExpandConstant('{tmp}\2.bmp'));
BmpFile.SetBounds(0, 0, 500, 300);
BmpFile.Stretch:= true
BmpFile.Parent:= WizardForm.ReadyPage;

BmpFile:= TBitmapImage.Create(WizardForm);
BmpFile.Bitmap.LoadFromFile(ExpandConstant('{tmp}\1.bmp'));
BmpFile.SetBounds(0, 0, 500, 300);
BmpFile.Stretch:= true
BmpFile.Parent:= WizardForm.InstallingPage;

BmpFile:= TBitmapImage.Create(WizardForm);
BmpFile.Bitmap.LoadFromFile(ExpandConstant('{tmp}\2.bmp'));
BmpFile.SetBounds(0, 0, 500, 300);
BmpFile.Stretch:= true
BmpFile.Parent:= WizardForm.InfoAfterPage;


BmpFile:= TBitmapImage.Create(WizardForm);
BmpFile.Bitmap.LoadFromFile(ExpandConstant('{tmp}\1.bmp'));
BmpFile.SetBounds(0, 0, 500, 300);
BmpFile.Stretch:= true
BmpFile.Parent:= WizardForm.FinishedPage;

MyStream:= tMemoryStream.Create();
ExtracttemporaryFileToStream('0.bmp', MyStream);
MyStream.SaveToFile(ExpandConstant('{tmp}\0.bmp'));
DeleteFile(ExpandConstant('{tmp}')+'\0.bmp');
ExtracttemporaryFileToStream('1.bmp', MyStream);
MyStream.SaveToFile(ExpandConstant('{tmp}\1.bmp'));
DeleteFile(ExpandConstant('{tmp}')+'\1.bmp');
ExtracttemporaryFileToStream('2.bmp', MyStream);
MyStream.SaveToFile(ExpandConstant('{tmp}\2.bmp'));
DeleteFile(ExpandConstant('{tmp}')+'\2.bmp');
ExtracttemporaryFileToStream('3.bmp', MyStream);
MyStream.SaveToFile(ExpandConstant('{tmp}\3.bmp'));
DeleteFile(ExpandConstant('{tmp}')+'\3.bmp');

with WizardForm do
begin
MainPanel.Hide;
Finishedlabel.Hide;
DiskSpaceLabel.Hide;
ProgressGauge.Hide;
TypesCombo.Hide;
ComponentsDiskSpaceLabel.Hide;
FilenameLabel.Hide;
StatusLabel.Hide;
end;
end;
//******************************************* [Конец - Наложение изображений] ***************************************************//
//******************************************* [Начало - Лейблы] ***************************************************//
var
WLabel1, WLabel2, StatusLabel, FilenameLabel: TLabel;

procedure InitializeWizard4;
begin
StaticSetTransparent;
//****************[WelcomePage]
WizardForm.WelcomeLabel1.Font.Color:=clWhite;
WizardForm.WelcomeLabel1.Font.Name:='Trebuchet MS';
WizardForm.WelcomeLabel1.Left:=10;
WizardForm.WelcomeLabel1.WordWrap:=True;
// WizardForm.WelcomeLabel1.Alignment := taCenter;
WizardForm.WelcomeLabel1.Top:=175;
WizardForm.WelcomeLabel1.Width:=351;
WizardForm.WelcomeLabel1.Caption:= ExpandConstant('{cm:welcome1}');
WizardForm.WelcomeLabel1.Height:=20;
WizardForm.WelcomeLabel1.Font.Style:=[fsBold];
WizardForm.WelcomeLabel1.Font.Height:=20;
WizardForm.WelcomeLabel2.Font.Color:=clWhite;
WizardForm.WelcomeLabel2.Font.Name:='Trebuchet MS';
WizardForm.WelcomeLabel2.Font.Height:=17;
WizardForm.WelcomeLabel2.Left:=10;
WizardForm.WelcomeLabel2.Top:=183
WizardForm.WelcomeLabel2.Caption:= ExpandConstant('{cm:welcome2}');
WizardForm.WelcomeLabel2.Width:=500;

//****************[WelcomePage]
//****************[SelectDirPage]
WizardForm.SelectDirLabel.Font.Color:=clWhite;
WizardForm.SelectDirLabel.Font.Name:='Trebuchet MS';
WizardForm.SelectDirLabel.Font.Height:=17;
WizardForm.SelectDirLabel.Left:=40;
WizardForm.SelectDirLabel.Top:=75;
WizardForm.SelectDirLabel.Width:=351;
WizardForm.SelectDirLabel.Height:=20;
WizardForm.SelectDirBrowseLabel.Font.Color:=clWhite;
WizardForm.SelectDirBrowseLabel.Font.Name:='Trebuchet MS';
WizardForm.SelectDirBrowseLabel.Left:=40;
WizardForm.SelectDirBrowseLabel.Font.Height:=17;
WizardForm.SelectDirBrowseLabel.Top:=142;
WizardForm.SelectDirBrowseLabel.Width:=351;
WizardForm.SelectDirBrowseLabel.Height:=33;
//****************[SelectDirPage]
//****************[SelectComponentsPage]
WizardForm.SelectComponentsLabel.Font.Color:=clWhite;
WizardForm.SelectComponentsLabel.Font.Name:='Trebuchet MS';
WizardForm.SelectComponentsLabel.Font.Height:=17;
WizardForm.SelectComponentsLabel.Left:=260;
WizardForm.SelectComponentsLabel.Top:=110;
WizardForm.SelectComponentsLabel.Width:=200;
WizardForm.SelectComponentsLabel.Height:=300;
//****************[SelectComponentsPage]
//****************[InfoBeforePage]
WizardForm.InfoBeforeClickLabel.Font.Color:=clWhite;
WizardForm.InfoBeforeClickLabel.Font.Name:='Trebuchet MS';
WizardForm.InfoBeforeClickLabel.Font.Height:=17;
WizardForm.InfoBeforeClickLabel.Left:=10;
WizardForm.InfoBeforeClickLabel.Top:=290;
//****************[InfoBeforePage]
//****************[SelectProgramGroupPage]
WizardForm.SelectStartMenuFolderLabel.Font.Color:=clWhite;
WizardForm.SelectStartMenuFolderLabel.Font.Name:='Trebuchet MS';
WizardForm.SelectStartMenuFolderLabel.Font.Height:=17;
WizardForm.SelectStartMenuFolderLabel.Left:=40;
WizardForm.SelectStartMenuFolderLabel.Top:=75;
WizardForm.SelectStartMenuFolderBrowseLabel.Font.Color:=clWhite;
WizardForm.SelectStartMenuFolderBrowseLabel.Font.Name:='Trebuchet MS';
WizardForm.SelectStartMenuFolderBrowseLabel.Font.Height:=17;
WizardForm.SelectStartMenuFolderBrowseLabel.Left:=40;
WizardForm.SelectStartMenuFolderBrowseLabel.Top:=190;
WizardForm.SelectStartMenuFolderBrowseLabel.Width:=351;
WizardForm.SelectStartMenuFolderBrowseLabel.Height:=33;
//****************[SelectProgramGroupPage]
//****************[ReadyPage]
WizardForm.ReadyLabel.Font.Color:=clWhite;
WizardForm.ReadyLabel.Font.Name:='Trebuchet MS';
WizardForm.ReadyLabel.Left:=10;
WizardForm.ReadyLabel.Top:=275;
WizardForm.ReadyLabel.Width:=0;
//****************[ReadyPage]
//****************[InstallingPage]

begin
StatusLabel:= TLabel.Create(WizardForm);
with StatusLabel do
begin
Left:=228;
Top:=88;
Width:=0;
Height:= 0;
AutoSize:= False;
Transparent := True;
Parent:= WizardForm.InstallingPage;
Font.Name:= 'Trebuchet MS';
Font.Height:= 17;
end;
end;
//****************[InstallingPage]
//****************[InfoAfterPage]
WizardForm.InfoAfterClickLabel.Font.Color:=clWhite;
WizardForm.InfoAfterClickLabel.Font.Name:='Trebuchet MS';
WizardForm.InfoAfterClickLabel.Left:=178;
WizardForm.InfoAfterClickLabel.Top:=290;
//****************[InfoAfterPage]
//****************[FinishedPage]
WizardForm.FinishedHeadingLabel.Font.Color:=clWhite;
WizardForm.FinishedHeadingLabel.Font.Name:='Trebuchet MS';
WizardForm.FinishedHeadingLabel.Left:=10;
WizardForm.FinishedHeadingLabel.Top:=175;
WizardForm.FinishedHeadingLabel.Width:=400;
WizardForm.FinishedHeadingLabel.Height:=20;
WizardForm.FinishedHeadingLabel.Font.Height:=20;
WizardForm.FinishedHeadingLabel.Font.Style:=[fsBold];
WizardForm.FinishedHeadingLabel.Caption:= ExpandConstant('{cm:Finished1}');


WLabel1 := TLabel.Create(WizardForm);
WLabel1.Left := 10;
WLabel1.Top := 183;
WLabel1.Width :=500;
WLabel1.Height :=10;
WLabel1.Font.Color:= clwhite;
WLabel1.Font.Name:='Trebuchet MS';
WLabel1.Font.Height:=17;
WLabel1.Caption := ExpandConstant('{cm:finished2}');
WLabel1.Transparent := True;
WLabel1.Parent := WizardForm.FinishedPage;

WLabel2 := TLabel.Create(WizardForm);
WLabel2.Left := 87;
WLabel2.Top := 190;
WLabel2.Width := 209;
WLabel2.Height := 13;
WLabel2.Font.Color:= clwhite;
WLabel2.Font.Name:='Trebuchet MS';
WLabel2.Font.Height:=17;
WLabel2.Caption := ExpandConstant('{cm:NeedSpace} {#NeedSize}');
WLabel2.Transparent := True;
WLabel2.Parent := WizardForm.SelectDirPage;

//****************[FinishedPage]
end;
//******************************************* [Конец - Лейблы] ***************************************************//
//******************************************* [Начало - Лейблы 2] ***************************************************//
type
TTimerProc = procedure(HandleW, Msg, idEvent, TimeSys: LongWord);

var
TextTimer: LongWord;

function WrapTimerProc(callback: TTimerProc; Paramcount: Integer): longword; external 'wrapcallback@files:innocallback.dll stdcall';
function SetTimer(hWnd, nIDEvent, uElapse, lpTimerFunc: LongWord): longword; external 'SetTimer@user32';
function KillTimer(hWnd, nIDEvent: LongWord): LongWord; external 'KillTimer@user32 stdcall delayload';

Procedure TextProc(h, msg, idevent, dwTime: Longword);
Begin
//FilenameLabel.Caption:= WizardForm.FilenameLabel.Caption;
// StatusLabel.Caption:= WizardForm.StatusLabel.Caption;
End;

procedure DeinitializeSetup1();
begin
KillTimer(0, TextTimer);
end;

procedure InitializeWizard5();
begin


FilenameLabel:= TLabel.Create(WizardForm);
with FilenameLabel do
begin
Left:=228;
Top:=140;
Width:= 0;
Height:= 0;
AutoSize:= False;
Transparent := True;
Parent:= WizardForm.InstallingPage;
Font.Name:= 'Trebuchet MS';
Font.Height:= 17;
end;
end;



//******************************************* [Конец - Лейблы 2] ***************************************************//
//******************************************* [ 2 обзора и ярлыки ] ***************************************************//
var
StartMenuIcon,DesktopIcon: TCheckBox; DesktopIconLabel, StartMenuIconLabel: TLabel;

function MakeDesktopIcon: Boolean; begin Result:=DesktopIcon.Checked; end;
function MakeStartMenuIcon: Boolean; begin Result:=StartMenuIcon.Checked;end;

procedure DesktopIconOnClick(Sender: TObject);
begin
if DesktopIcon.Checked = False then
DesktopIcon.Checked:= True else
DesktopIcon.Checked:= False;
end;

procedure StartMenuIconOnClick(Sender: TObject);
begin
if StartMenuIcon.Checked = False then
StartMenuIcon.Checked:= True else
StartMenuIcon.Checked:= False;
end;

procedure NoStartMenuIcon(Sender: TObject);
begin
if StartMenuIcon.Checked = false then
begin
wizardform.GroupEdit.enabled:= false;
wizardform.GroupBrowseButton.enabled:= false;
end
else
begin
wizardform.GroupEdit.enabled:= true;
wizardform.GroupBrowseButton.enabled:= true;
end;
end;

procedure InitializeWizard6();
begin
StatusLabel.Hide;
FilenameLabel.Hide;

DesktopIcon:= TCheckBox.Create(WizardForm);
with DesktopIcon do
begin
Parent:= WizardForm.SelectProgramGroupPage;
Left:=240;
Top:= 161;
Width:= 13;
Height:= 13;
TabOrder:= 2;
Checked:= True;
end;

DesktopIconLabel := TLabel.Create(WizardForm);
with DesktopIconLabel do begin
AutoSize:=true;
SetBounds(255, 160, 0, 0);
WordWrap:= False;
// ShowAccelChar := False;
Transparent:=True;
Font.Name:= 'Trebuchet MS';
Font.Height:= 17;
Font.Color:=clWhite;
Caption := ExpandConstant('{cm:Icons}');
Parent := wizardform.SelectProgramGroupPage;
OnClick:= @DesktopIconOnClick;
end;

StartMenuIcon:= TCheckBox.Create(WizardForm);
with StartMenuIcon do
begin
Parent:= WizardForm.SelectProgramGroupPage;
Left:=40;
Top:= 161;
Width:= 13;
Height:= 13;
TabOrder:= 2;
Checked:= True;
OnClick:= @NoStartMenuIcon;
end;

StartMenuIconLabel := TLabel.Create(WizardForm);
with StartMenuIconLabel do begin
AutoSize:=true;
SetBounds(55, 160, 0, 0);
WordWrap:= False;
// ShowAccelChar := False;
Transparent:=True;
Font.Name:= 'Trebuchet MS';
Font.Height:= 17;
Font.Color:=clWhite;
Caption := ExpandConstant('{cm:Group}');
Parent := wizardform.SelectProgramGroupPage;
OnClick:= @StartMenuIconOnClick;
end;
end;
//******************************************* [ 2 обзора и ярлыки ] ***************************************************//
//******************************************* [ Место ] ***************************************************//
var
NeedSpaceLabel,FreeSpaceLabel: TLabel;
FreeMB, TotalMB: Cardinal;
SizeStr: String;
SizeInt: Integer;
SymbolNumber: Integer;

Function NumToStr(Float: Extended): String;
Begin
Result:= Format('%.2n', [Float]); StringChange(Result, ',', '.');
while ((Result[Length(Result)] = '0') or (Result[Length(Result)] = '.')) and (Pos('.', Result) > 0) do
SetLength(Result, Length(Result)-1);
End;

function GetSize(): Integer;
begin
SizeStr:= WizardForm.DiskSpaceLabel.Caption;
for SymbolNumber:= 97 to 122 do begin
while (Pos(Chr(SymbolNumber), SizeStr) > 0) do Delete(SizeStr, Pos(Chr(SymbolNumber), SizeStr),1); //Находим все символы нижнего регистра и удаляем
while (Pos(AnsiUppercase(Chr(SymbolNumber)), SizeStr) > 0) do Delete(SizeStr, Pos(AnsiUppercase(Chr(SymbolNumber)), SizeStr),1); end; //Находим все символы верхнего регистра и удаляем
for SymbolNumber:= 192 to 255 do begin
while (Pos(Chr(SymbolNumber), SizeStr) > 0) do Delete(SizeStr, Pos(Chr(SymbolNumber), SizeStr),1); end; //Находим все символы нижнего регистра и удаляем
while (Pos('.', SizeStr) > 0) do Delete(SizeStr, Pos('.', SizeStr), 1) //Удаляем точки
Delete(SizeStr, Pos(',', SizeStr), 5) //Удаляем дробную часть
//Result:= StrToInt(Trim(SizeStr)); //Переводим в число
end;

function CompareNum(FirstNum, SecondNum: Integer): Boolean;
begin
if FirstNum < SecondNum then Result:= False else Result:= True;
end;

Function MbOrTb(Byte: Extended): String;
begin
if Byte < 1024 then Result:= NumToStr(Byte) + ' MB' else
if Byte/1024 < 1024 then Result:= NumToStr(round(Byte/1024*100)/100) + ' GB' else
Result:= NumToStr(round((Byte/(1024*1024))*100)/100) + ' TB'
end;

procedure GetFreeSpaceCaption(Sender: TObject);
var Path: String;
begin
Path := ExtractFileDrive(WizardForm.DirEdit.Text);
GetSpaceOnDisk(Path, True, FreeMB, TotalMB);
FreeSpaceLabel.Caption:= ExpandConstant('{cm:FreeSpace} ') + MbOrTb(FreeMB)
if WizardForm.CurPageID = wpSelectDir then begin
WizardForm.NextButton.Enabled:= CompareNum(FreeMB, SizeInt)
end;
end;

procedure InitializeWizard7();
begin
WizardForm.DiskSpaceLabel.Hide;
SizeInt:= GetSize;
FreeSpaceLabel := TLabel.Create(WizardForm);
FreeSpaceLabel.SetBounds(87, 210, 209, 13)
FreeSpaceLabel.Parent := WizardForm.SelectDirPage;
FreeSpaceLabel.Transparent:=true;
FreeSpaceLabel.Font.Name:= 'Trebuchet MS';
FreeSpaceLabel.Font.Height:= 17;

WizardForm.DirEdit.OnChange:= @GetFreeSpaceCaption;
WizardForm.DirEdit.Text:= WizardForm.DirEdit.Text + #0;
end;

//******************************************* [ Место ] ***************************************************//
//******************************************* [Начало - Текстурирования кнопок] ***************************************************//
const
ButtonWidth = 80;
ButtonHeight = 23;

bidBack = 0;
bidNext = 1;
bidCancel = 2;
bidDirBrowse = 3;
bidGroupBrowse = 4;

var
ButtonPanel: array [0..4] of TPanel;
ButtonImage: array [0..4] of TBitmapImage;
ButtonLabel: array [0..4] of TLabel;

procedure ButtonLabelClick(Sender: TObject);
var
Button: TButton;
begin
ButtonImage[TLabel(Sender).Tag].Left:=0
case TLabel(Sender).Tag of
bidBack: Button:=WizardForm.BackButton
bidNext: Button:=WizardForm.NextButton
bidCancel: Button:=WizardForm.CancelButton
bidDirBrowse: Button:=WizardForm.DirBrowseButton
bidGroupBrowse: Button:=WizardForm.GroupBrowseButton
else
Exit
end
Button.OnClick(Button)
end;

procedure ButtonLabelMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
if ButtonLabel[TLabel(Sender).Tag].Enabled then
ButtonImage[TLabel(Sender).Tag].Left:=-ButtonWidth
end;

procedure ButtonLabelMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
ButtonImage[TLabel(Sender).Tag].Left:=0
end;

procedure LoadButtonImage(AButton: TButton; AButtonIndex: integer);
var
Image: TBitmapImage;
Panel: TPanel;
Labl: TLabel;

begin
Panel:=TPanel.Create(WizardForm)
Panel.Left:=AButton.Left
Panel.Top:=AButton.Top
Panel.Width:=AButton.Width
Panel.Height:=AButton.Height
Panel.Tag:=AButtonIndex
Panel.Parent:=AButton.Parent
ButtonPanel[AButtonIndex]:=Panel

Image:=TBitmapImage.Create(WizardForm)
Image.Width:=160
Image.Height:=88
Image.Enabled:=False
Image.Bitmap.LoadFromFile(ExpandConstant('{tmp}\button.bmp'))
Image.Parent:=Panel
ButtonImage[AButtonIndex]:=Image

with TLabel.Create(WizardForm) do begin
Tag:=AButtonIndex
Parent:=Panel
Width:=Panel.Width
Height:=Panel.Height
Transparent:=True
OnClick:=@ButtonLabelClick
OnDblClick:=@ButtonLabelClick
OnMouseDown:=@ButtonLabelMouseDown
OnMouseUp:=@ButtonLabelMouseUp
end

Labl:=TLabel.Create(WizardForm)
Labl.Left:=0
Labl.Top:=3
Labl.Height:=17
Labl.Width:=Panel.Width
Labl.Autosize:=false
Labl.Alignment:=taCenter
Labl.Tag:=AButtonIndex
Labl.Transparent:=True
Labl.Font.Color:=clWhite
Labl.Font.Height:=17;
Labl.Font.Name:='Trebuchet MS';
Labl.Caption:=AButton.Caption
Labl.OnClick:=@ButtonLabelClick
Labl.OnDblClick:=@ButtonLabelClick
Labl.OnMouseDown:=@ButtonLabelMouseDown
Labl.OnMouseUp:=@ButtonLabelMouseUp
Labl.Parent:=Panel
ButtonLabel[AButtonIndex]:=Labl
end;

procedure UpdateButton(AButton: TButton;AButtonIndex: integer);
begin
ButtonLabel[AButtonIndex].Caption:=AButton.Caption
ButtonPanel[AButtonIndex].Visible:=AButton.Visible
ButtonLabel[AButtonIndex].Enabled:=Abutton.Enabled
end;

procedure LicenceAcceptedRadioOnClick(Sender: TObject);
begin
ButtonLabel[bidNext].Enabled:=True
end;

procedure LicenceNotAcceptedRadioOnClick(Sender: TObject);
begin
ButtonLabel[bidNext].Enabled:=False
end;

procedure CurPageChanged4(CurPageID: Integer);
begin
UpdateButton(WizardForm.BackButton,bidBack)
UpdateButton(WizardForm.NextButton,bidNext)
UpdateButton(WizardForm.CancelButton,bidCancel)
ButtonLabel[bidBack].Left := (ButtonPanel[bidBack].Width / 2 - ButtonLabel[bidBack].Width / 2);
ButtonLabel[bidNext].Left := (ButtonPanel[bidNext].Width / 2 - ButtonLabel[bidNext].Width / 2);
ButtonLabel[bidCancel].Left := (ButtonPanel[bidCancel].Width / 2 - ButtonLabel[bidCancel].Width / 2);
ButtonLabel[bidDirBrowse].Left := (ButtonPanel[bidDirBrowse].Width / 2 - ButtonLabel[bidDirBrowse].Width / 2);
ButtonLabel[bidGroupBrowse].Left := (ButtonPanel[bidGroupBrowse].Width / 2 - ButtonLabel[bidGroupBrowse].Width / 2);
end;

procedure InitializeWizard8();
begin
WizardForm.BackButton.Width:=ButtonWidth
WizardForm.BackButton.Height:=ButtonHeight

WizardForm.NextButton.Width:=ButtonWidth
WizardForm.NextButton.Height:=ButtonHeight

WizardForm.CancelButton.Width:=ButtonWidth
WizardForm.CancelButton.Height:=ButtonHeight


WizardForm.DirBrowseButton.Width:=ButtonWidth
WizardForm.DirBrowseButton.Height:=ButtonHeight


WizardForm.GroupBrowseButton.Width:=ButtonWidth
WizardForm.GroupBrowseButton.Height:=ButtonHeight

WizardForm.LicenseAcceptedRadio.OnClick:=@LicenceAcceptedRadioOnClick

WizardForm.LicenseNotAcceptedRadio.OnClick:=@LicenceNotAcceptedRadioOnClick

ExtractTemporaryFile('button.bmp')
LoadButtonImage(WizardForm.BackButton,bidBack)
LoadButtonImage(WizardForm.NextButton,bidNext)
LoadButtonImage(WizardForm.CancelButton,bidCancel)
LoadButtonImage(WizardForm.DirBrowseButton,bidDirBrowse)
LoadButtonImage(WizardForm.GroupBrowseButton,bidGroupBrowse)
end;

//******************************************* [Конец - Текстурирования кнопок] ***************************************************//






//******************************************* [Начало - isdone] ***************************************************//
const
PCFonFLY=true;
notPCFonFLY=false;
var
LabelPct1,LabelCurrFileName,LabelTime1,LabelTime2,LabelTime3: TLabel;
ISDoneProgressBar1: TNewProgressBar;
#ifdef SecondProgressBar
LabelPct2: TLabel;
ISDoneProgressBar2:TNewProgressBar;
#endif

ISDoneCancel:integer;
ISDoneError: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 ISDoneProgressBar1.Position := OveralPct;
LabelPct1.Caption := IntToStr(OveralPct div 10)+'.'+chr(48 + OveralPct mod 10)+'%';
#ifdef SecondProgressBar
if CurrentPct<=1000 then ISDoneProgressBar2.Position := CurrentPct;
LabelPct2.Caption := IntToStr(CurrentPct div 10)+'.'+chr(48 + CurrentPct mod 10)+'%';
#endif
LabelCurrFileName.Caption:=ExpandConstant('{cm:ExtractedFile} ')+MinimizePathName(CurrentFile, LabelCurrFileName.Font, LabelCurrFileName.Width-100);
LabelTime1.Caption:=ExpandConstant('{cm:ElapsedTime} ')+TimeStr2;
LabelTime2.Caption:=ExpandConstant('{cm:RemainingTime} ')+TimeStr1;
LabelTime3.Caption:=ExpandConstant('{cm:AllElapsedTime}')+TimeStr3;
Result := ISDoneCancel;
end;

procedure CancelButtonOnClick(Sender: TObject);
begin
SuspendProc;
if MsgBox(SetupMessage(msgExitSetupMessage), mbConfirmation, MB_YESNO) = IDYES then ISDoneCancel:=1;
ResumeProc;
end;


procedure BeforeInstall;
begin
With Tlabel.Create(WizardForm) do begin
Parent:=WizardForm.InstallingPage;
Caption:= ExpandConstant('{cm:installing');
AutoSize := true;
Left := 10;
Top := 213;
Font.Name:='Trebuchet MS';
Font.Height:=17;
Transparent:= true;
end;
end;




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

#ifdef SecondProgressBar
ISDoneProgressBar2.Hide;
LabelPct2.Hide;
#endif
end;

procedure CreateControls;
var PBTop:integer;
begin
PBTop:=50;
ISDoneProgressBar1 := TNewProgressBar.Create(WizardForm);
with ISDoneProgressBar1 do begin
Parent := WizardForm.InstallingPage;
Height := 15;
Left := 10;
Top := 193;
Width := 443;

Max := 1000;
end;
LabelPct1 := TLabel.Create(WizardForm);
with LabelPct1 do begin
Parent := WizardForm.InstallingPage;
AutoSize := False;
Left := ISDoneProgressBar1.Width+15;
Top := ISDoneProgressBar1.Top + -2;
Width := 80;
Font.Name:='Trebuchet MS';
Font.Height:=18;


Transparent:= true;
end;
LabelCurrFileName := TLabel.Create(WizardForm);
with LabelCurrFileName do begin
Parent := WizardForm.InstallingPage;
AutoSize := False;
Width := ISDoneProgressBar1.Width+30;
Left := 10;
Top := 170;
Font.Name:='Trebuchet MS';
Font.Height:=17;
Transparent:= true;
end;
#ifdef SecondProgressBar
PBTop:=PBTop+25;
ISDoneProgressBar2 := TNewProgressBar.Create(WizardForm);
with ISDoneProgressBar2 do begin
Parent := WizardForm.InstallingPage;
Left := 0;
Top := 230;
Width := ISDoneProgressBar1.Width;
Max := 1000;
Height := WizardForm.ProgressGauge.Height;
end;
LabelPct2 := TLabel.Create(WizardForm);
with LabelPct2 do begin
Parent := WizardForm.InstallingPage;
AutoSize := False;
Left := ISDoneProgressBar2.Width+5;
Top := ISDoneProgressBar2.Top + 2;
Width := 80;
Transparent:= true;
Font.Name:='Trebuchet MS';
end;
#endif
LabelTime1 := TLabel.Create(WizardForm);
with LabelTime1 do begin
Parent := WizardForm.InstallingPage;
AutoSize := False;
Width := ISDoneProgressBar1.Width div 2;
Left := 10;
Top := 215;
Transparent:= true;
Font.Name:='Trebuchet MS';
Font.Height:=17;
end;
LabelTime2 := TLabel.Create(WizardForm);
with LabelTime2 do begin
Parent := WizardForm.InstallingPage;
AutoSize := False;
Width := LabelTime1.Width+40;
Left := ISDoneProgressBar1.Width div 2;
Top := LabelTime1.Top;
Transparent:= true;
Font.Name:='Trebuchet MS';
Font.Height:=17;
end;
LabelTime3 := TLabel.Create(WizardForm);
with LabelTime3 do begin
Parent := WizardForm.FinishedPage;
AutoSize := False;
Width := 300;
Left := 190;
Top := 180;
Alignment := taRightJustify;
Transparent:= true;
Font.Name:='Trebuchet MS';
Font.Height:=17;
end;

end;
//******************************************* [Конец - isdone] ***************************************************//







procedure DeinitializeSetup2;
begin
StaticSetDefault;
end;

procedure InitializeWizard();
begin
InitializeWizard1();
InitializeWizard2();
InitializeWizard3();
InitializeWizard4();
InitializeWizard5();
InitializeWizard6();
InitializeWizard7();
InitializeWizard8();
IsInit:=True;// в самом конце InitializeWizard

end;


function InitializeSetup(): Boolean;
begin
RegQueryStringValue(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{#MyAppName}_Seraph1_is1', 'UninstallString', ResultStr)
if ResultStr='' then
begin
IsInit:=False;
Result := True;
end
else
ResultStr:=RemoveQuotes(ResultStr);
Exec(ResultStr, '', '', SW_SHOWNORMAL, ewNoWait, ResultCode)
end;

procedure CurPageChanged(CurPageID: Integer);
begin

// if CurPageID = wpSelectDir then begin WizardForm.NextButton.Enabled:= False; end; //Для примера, потом удалите
//WizardLabel.Parent:= PageFromID(CurPageID).Surface;
UpdateButton(WizardForm.BackButton,bidBack)
UpdateButton(WizardForm.NextButton,bidNext)
UpdateButton(WizardForm.CancelButton,bidCancel)
UpdateButton(WizardForm.DirBrowseButton,bidDirBrowse)
UpdateButton(WizardForm.GroupBrowseButton,bidGroupBrowse)
if CurPageID = wpSelectDir then begin
GetFreeSpaceCaption(nil);
end;
if CurPageID = wpSelectProgramGroup then begin
ButtonLabel[bidNext].Caption:=ExpandConstant ('{cm:Install}');
ButtonLabel[bidNext].Left:= (ButtonPanel[bidNext].Width/2) - (ButtonLabel[bidNext].Width/2);
end;
if (CurPageID = wpFinished) and ISDoneError then
begin
LabelTime3.Hide;
Wlabel1.Hide;
WizardForm.Caption:= ExpandConstant('{cm:Error}');
WizardForm.FinishedHeadingLabel.Font.Color:= clWhite;
WizardForm.FinishedHeadingLabel.Caption:= ExpandConstant('{cm:Error1}');
end;
end;

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

function ShouldSkipPage(PageID: Integer): Boolean;
begin
if (PageID =wpReady)then
Result:= True;
end;


type
TSHFileOpStruct = record
Wnd: HWND;
wFunc: UINT;
pFrom: PChar;
pTo: PChar;
fFlags: Word; // FILEOP_FLAGS;
fAnyOperationsAborted: BOOL;
hNameMappings: HWND; // Pointer;
lpszProgressTitle: PChar; { only used if FOF_SIMPLEPROGRESS }
end;

const
// use in wFunc
{ $EXTERNALSYM FO_MOVE }
FO_MOVE = $0001;
{ $EXTERNALSYM FO_COPY }
FO_COPY = $0002;
{ $EXTERNALSYM FO_DELETE }
FO_DELETE = $0003;
{ $EXTERNALSYM FO_RENAME }
FO_RENAME = $0004;
// use in fFlags
{ $EXTERNALSYM FOF_MULTIDESTFILES }
FOF_MULTIDESTFILES = $0001;
{ $EXTERNALSYM FOF_CONFIRMMOUSE }
FOF_CONFIRMMOUSE = $0002;
{ $EXTERNALSYM FOF_SILENT }
FOF_SILENT = $0004; { don't create progress/report }
{ $EXTERNALSYM FOF_RENAMEONCOLLISION }
FOF_RENAMEONCOLLISION = $0008;
{ $EXTERNALSYM FOF_NOCONFIRMATION }
FOF_NOCONFIRMATION = $0010; { Don't prompt the user. }
{ $EXTERNALSYM FOF_WANTMAPPINGHANDLE }
FOF_WANTMAPPINGHANDLE = $0020; { Fill in
SHFILEOPSTRUCT.hNameMappings
Must be freed using
SHFreeNameMappings }
{ $EXTERNALSYM FOF_ALLOWUNDO }
FOF_ALLOWUNDO = $0040;
{ $EXTERNALSYM FOF_FILESONLY }
FOF_FILESONLY = $0080; { on *.*, do only files }
{ $EXTERNALSYM FOF_SIMPLEPROGRESS }
FOF_SIMPLEPROGRESS = $0100; { means don't show names of files }
{ $EXTERNALSYM FOF_NOCONFIRMMKDIR }
FOF_NOCONFIRMMKDIR = $0200; { don't confirm making any
needed dirs }
{ $EXTERNALSYM FOF_NOERRORUI }
FOF_NOERRORUI = $0400; { don't put up error UI }






procedure CurStepChanged(CurStep: TSetupStep);
var Comps1,Comps2,Comps3, TmpValue:cardinal;
FindHandle1,ColFiles1,CurIndex1,tmp:integer;
ExecError:boolean;
InFilePath,OutFilePath,OutFileName:PAnsiChar;
begin
if CurStep = ssInstall then begin //Если необходимо, можно поменять на ssPostInstall
TextTimer:= SetTimer(0, 0, 10, WrapTimerProc(@TextProc, 4));
WizardForm.ProgressGauge.Hide;
CreateControls;
WizardForm.CancelButton.OnClick:=@CancelButtonOnClick;
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');
ExtractTemporaryFile('Russian.ini');

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

TmpValue:=TmpValue*2;
if IsComponentSelected('text\rus') then Comps1:=Comps1+TmpValue; //компонент 5
TmpValue:=TmpValue*2;
if IsComponentSelected('text\eng') then Comps1:=Comps1+TmpValue; //компонент 6
TmpValue:=TmpValue*2;
if IsComponentSelected('text\ger') then Comps1:=Comps1+TmpValue; //компонент 7
TmpValue:=TmpValue*2;
if IsComponentSelected('text\ger') then Comps1:=Comps1+TmpValue; //компонент 8
TmpValue:=TmpValue*2;
if IsComponentSelected('text\fre') then Comps1:=Comps1+TmpValue; //компонент 9
TmpValue:=TmpValue*2;
if IsComponentSelected('text\ita') then Comps1:=Comps1+TmpValue; //компонент 10
TmpValue:=TmpValue*2;
if IsComponentSelected('text\pol') then Comps1:=Comps1+TmpValue; //компонент 11
TmpValue:=TmpValue*2;
if IsComponentSelected('text\por') then Comps1:=Comps1+TmpValue; //компонент 12
TmpValue:=TmpValue*2;
if IsComponentSelected('text\spa') then Comps1:=Comps1+TmpValue; //компонент 13

TmpValue:=TmpValue*2;
if IsComponentSelected('crack\rl') then Comps1:=Comps1+TmpValue; //компонент 14
TmpValue:=TmpValue*2;
if IsComponentSelected('crack\te') then Comps1:=Comps1+TmpValue; //компонент 15


// .....
// см. справку
#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
case ActiveLanguage of
'eng': ChangeLanguage('English');
'rus': ChangeLanguage('Russian');
end;
if not SrepInit(ExpandConstant('{app}'),128,0) then break;
if not PrecompInit(ExpandConstant('{app}'),128,PCFVer) then break;
if not FileSearchInit(true) then break;





// if not ISArcExtract ( 0, 0, ExpandConstant('{src}\data4.bin'), ExpandConstant('{app}'), '', false, '', '', 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;
LabelCurrFileName.Caption:= ExpandConstant('{cm:Error2}');
WizardForm.CancelButton.Visible:=true;
WizardForm.CancelButton.Enabled:=false;
end;
if (CurStep=ssPostInstall) and ISDoneError then begin
Exec2(ExpandConstant('{uninstallexe}'), '/VERYSILENT', false);
end;
end;

procedure DeinitializeSetup();
begin
DeinitializeSetup1();
DeinitializeSetup2();
If IsInit then begin
BGImageStream.Free;
BTNImageStream.Free;
end;
end;[/more]
Автор: Genri
Дата сообщения: 30.10.2013 11:31
Gourmet

Цитата:
в хелпе inno setup они все называются функциями, никакого различия нет
-- согласен. В твоем случае действительно функция. Но различия есть. GetEnv - это функция препроцессора. В хелпе ее описание находится в разделе Inno Setup Preprocessor. Функции препроцессора выполняются при компиляции. Т.е. когда ты запускаешь код на компиляцию, компилятор первым делом запускает препроцессор, который подготовливает код для компиляции. Например, если в коде есть строка:
Source: {#GetEnv("ENVVAR")}\MyProg.exe; DestDir: {app}
... препроцессор выполнит функцию GetEnv("ENVVAR") и заменит эту часть на результат функции GetEnv (напр. на: C:\MySoft). В результате строка примет вид:
Source: C:\MySoft\MyProg.exe; DestDir: {app}
... и именно в таком виде код будет передан на компиляцию.

В твоем же примере:
Source: "{#ExpandConstant('{userdocs}')}\Visual Studio 2005\Projects\SKIP.src\hlp\hlp.rus\kdstc.cnt"....
... ExpandConstant является функцией компилятора, а не препроцессора. Поэтому препроцессор ее проигнорирует и отдаст на компиляцию в исходном виде. Компилятор же при сборке функции не выполняет (функции компилятора выполняются при работе собранного инсталлятора на компьютере клиента). Соответственно, включить в инсталлятор файл с неизвестным расположением компилятор не сможет и выдаст ошибку. Что у тебя и происходит.

И я не совсем понимаю, зачем при сборке указывать динамический путь? Ведь путь к папке {userdocs} на компьютере где собирается инсталлятор самостоятельно поменяться не может. Или инсталлятор собирают разные люди на разных компах? Но тогда проще у каждого выставить свой путь. На результат это не повлияет.

Вот нашел в старых сезонах объяснение принципов работы препроцессора: http://forum.ru-board.com/topic.cgi?forum=5&topic=27438&start=300#16
Автор: Gourmet
Дата сообщения: 30.10.2013 14:55

Цитата:
В хелпе ее описание находится в разделе Inno Setup Preprocessor.


если бы... никаких различий нигде не описано


Цитата:
я не совсем понимаю, зачем при сборке указывать динамический путь? Ведь путь к папке {userdocs} на компьютере где собирается инсталлятор самостоятельно поменяться не может. Или инсталлятор собирают разные люди на разных компах?


собирать могут разные люди на разных компах в разное время потом, и менять в исходнике инсталлятора маршруты - категорически не приемлемо, надо описывать в документации, чревато ошибками и т.д.

про препроцессинг ТТТ мне известно лет десятки еще после первого прчтения K&R "Язык Си", но не очевидно, почему ExpandConstant не может также подменяться препроцессором, как GetEnv - обе просто выдают значения своих параметров, и у обеих эти параметры и их значения известны на этапе компиляции, если и не все, но {userdocs} точно известно

тем более - почему нельзя просто подставлять значение константы в Source: "{userdocs}\.... поскольку оно при компиляции (а значит, и при сборке архива) известно??

и вообще, Inno Setup уже в печенках, проект сдадим, и больше этим инсталлятором упаси Боже пользоваться... лучше тогда свой написать, чем этот геморрой
Автор: Genri
Дата сообщения: 30.10.2013 16:08
Gourmet

Цитата:
никаких различий нигде не описано
-- вероятно, у нас разные хелпы


Цитата:
почему нельзя просто подставлять значение константы в Source
-- потому что так указано в хелпе (по крайней мере в моем):

Цитата:
Source (Required)
.....
Constants may only be used when the external flag is specified, because the compiler does not do any constant translating itself.



Цитата:
лучше тогда свой написать, чем этот геморрой
-- в некоторых случаях это действительно - более оптимальный вариант. Хотя в данном случае, я бы все-таки использовал возможности препроцессора. Например функцией ReadReg брать путь из реестра. Уж в реестре можно найти любой системный или пользовательский путь. Напр. в ветке: HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders
А так как ReadReg является функцией препроцессора, использовать ее можно по аналогии с GetEnv.

Автор: tuz1979
Дата сообщения: 30.10.2013 16:34
так че некто не поможет?
Автор: Gourmet
Дата сообщения: 31.10.2013 08:10
Genri

Цитата:
Например функцией ReadReg брать путь из реестра.


нет такой... я же версию написал - 5.4.2, мы с ним делаем с самого начала проект, а под конец менять версию нельзя, мало ли что по-другому работать будет

сделали иначе - из-за многочисленных внешних привязок и сложной инфраструктуры, у нас технологически необходима полная установка продукта перед тем, как собирается новый с изменениями, поэтому проще при установке завести переменную среды %MYDOCUMENTSPATH% в которую прописать в скрипте маршрут при помощи RegQueryStringValue/RegWriteStringValue, а когда происходит сборка инсталлятора, то из этой переменной брать его с помощью GetEnv

через ж... конечно, но работает
Автор: dragon1000
Дата сообщения: 02.11.2013 20:34
Привет форумчане вот такой вопрос у меня:

Задача состоит в том чтобы инсталятор работал как распаковщик, т.е мне нужно чтобы при указании папки инсталятор распаковывал туда файлы.

проблема в том что он распаковывает файлы не непосредственно в выбранную папку а создает новую в ней и туда помещает файлы.

Если прописать параметр в секции setup:

CreateAppDir=no

То он в процессе все равно создает папку с именем новая папка и туда помещает файлы

Помогите мне советом )
Автор: Scorpio_1986
Дата сообщения: 02.11.2013 20:58
Здравствуйте. Можете подсказать как сделать удаление компонента если убрать галочку при последующей установке.
Автор: log1stable
Дата сообщения: 03.11.2013 05:06
Такой вопрос: возможно ли сменить язык установщика из секции [languages] прямо во время процесса. Тобишь, не сообщением в начале, мол, выберите язык установки, а, например, кнопкой [En] на wizardform'e? Не нашёл ни одной схожей процедуры. Видимо, встроенных нету.

Добавлено:
dragon1000, может, usepreviousdir работает? Или в архиве как раз папка "Новая папка". Вообще, скрипт покажи.

Добавлено:
Не знаю, может, тут на форуме уже залили эту информацию. В общем, Inno Setup теперь и c AlphaSkins работает. Знающие люди поймут, а не знающие могут загуглить. Для скинизации исользовать следующий код:

Код:
[Files]
Source: "Skin.asz"; Flags: dontcopy

[Сode]
procedure InitializeWizard;
begin
ExtractTemporaryFile('Skin.asz');
WizardForm.SkinManager.SkinDirectory := ExpandConstant('{tmp}');
WizardForm.SkinManager.SkinName := 'Skin.asz';
end;
Автор: dragon1000
Дата сообщения: 03.11.2013 07:36

Цитата:
может, usepreviousdir работает? Или в архиве как раз папка "Новая папка". Вообще, скрипт покажи.


http://rghost.ru/49898853
Автор: Zorbbb
Дата сообщения: 03.11.2013 08:11
Наверное избитый вопрос:
Как в секции Run задать параметры запуска экзешника с правами Администратора под 7 и 8 виндой?
Автор: sjwrec
Дата сообщения: 03.11.2013 11:07
log1stable

Цитата:
Ссылка для скачивания студии:

Ну и зачем в архиве компилятор Inno - он и так есть у пользователей?
Вот за сами скины спасибо!
И да кстати студии там нет, чем редактировать скины?
Автор: log1stable
Дата сообщения: 03.11.2013 12:50
Думаешь, тот компилятор поддерживает skinmanager? Это - скомпиленный из общедоступного кода в гугле. Редактировать можно AlphaSkinEditor'ом или как там его. На сайте AlphaSkins.com в разделе Downloads ты найдешь.

Добавлено:
Zorbbb, сомневаюсь, что это можно сделать секцией Run. Лучше программно через присвоение флагов и ShellExec.
Автор: sjwrec
Дата сообщения: 03.11.2013 16:50
log1stable
У меня расширенная версия Inno 5.5.1 - ругается на SkinManager

Если из-за этого нужно перейти на другую версию Inno - да ещё и Unicode, тогда этот вариант не для меня.

Буду юзать привычный IsSkin.

Страницы: 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758

Предыдущая тема: Только инсталлятор


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.