Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Программы » Inno Setup - создание инсталляционных пакетов (Часть 15)

Модерирует : gyra, Maz

 Версия для печати • ПодписатьсяДобавить в закладки
На первую страницук этому сообщениюк последнему сообщению

Открыть новую тему     Написать ответ в эту тему

tuz1979

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
;Название приложения
#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;

Всего записей: 69 | Зарегистр. 20-04-2010 | Отправлено: 11:11 30-10-2013 | Исправлено: tuz1979, 20:13 30-10-2013
Открыть новую тему     Написать ответ в эту тему

На первую страницук этому сообщениюк последнему сообщению

Компьютерный форум Ru.Board » Компьютеры » Программы » Inno Setup - создание инсталляционных пакетов (Часть 15)


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru