duxa174
Junior Member | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору #define MyAppName "Zombie Driver" #define MyAppVerName "Zombie Driver" #define MyAppExeName "ZombieDriver.exe" #define PB_ImageFile "progress1.bmp" ;#define precomp GetEnv("ProgramFiles") + "\FreeArc\PowerPack\Max\*" ;если архивы созданы с PRECOMP, раскомментируйте строку и укажите папку с необходимыми для распаковки файлами (в общем случае это precomp04.exe, PPMonstr.exe, ecm.exe, unecm.exe, packjpg_dll.dll) #define Archives "{src}\data1.bin;DestDir:{app}\;Disk:1;Components:Russian|{src}\data2.bin;DestDir:{app}\data;Disk:1;Components:English|{src}\data3.bin;DestDir:{app}\data2;Disk:1|{src}\data4.bin;DestDir:{app}\data3;Disk:2" ;архивы указываются так {имя архива;DestDir:путь распаковки;Disk:диск на котором лежит} ;если есть компоненты то так {имя архива;DestDir:путь распаковки;Disk:диск на котором лежит;Components:название компонента} ;остальные архивы, где не указаны компоненты тоже будут распаковываться [Setup] AppName={#MyAppName} AppVerName={#MyAppVerName} DefaultDirName={pf}\Akella Games\Zombie Driver DefaultGroupName=Akella Games\Zombie Driver LicenseFile=C:\repack\Лицензионное соглашение.txt ;InfoAfterFile=C:\repack\Техподдержка.txt InfoBeforeFile=C:\repack\1.txt OutputDir=C:\repack OutputBaseFilename=setup SetupIconFile=C:\repack\ZD_icon.ico Compression=lzma/max SolidCompression=yes WizardSmallImageFile=WizardSmallImage.bmp WizardImageFile=WizardImage.bmp ;WizardImageStretch=yes AppPublisher=duxa [Types] ;Name: "polnaya"; Description: "Полная установка" Name: "viborochnaya"; Description: "Выборочная установка"; Flags: iscustom [Components] Name: "Fix"; Description: "Fix от KykyHe4ka"; Types: viborochnaya [Languages] Name: rus; MessagesFile: compiler:Languages\Russian.isl [Tasks] Name: desktopicon; Description: {cm:CreateDesktopIcon}; GroupDescription: {cm:AdditionalIcons}; Flags: unchecked [Files] ;Source: C:\Program Files\Akella Games\Zombie Driver\Release\ZombieDriver.exe; DestDir: {app}; Flags: ignoreversion ; ОТМЕТЬТЕ: Не используйте "Флажки: Проигнорировать версию" на любых общедоступных системных файлах Source: unarc.dll; DestDir: {tmp}; Flags: dontcopy deleteafterinstall Source: InnoCallback.dll; DestDir: {tmp}; Flags: dontcopy Source: papka.bmp; DestDir: {tmp}; Flags: dontcopy Source: logo.bmp; DestDir: {tmp}; Flags: dontcopy ;Source: button.bmp; DestDir: {tmp}; Flags: dontcopy ;Source: progress1.bmp; DestDir: {tmp}; Flags: dontcopy Source: gamestartup.mp3; DestDir:{tmp}; Flags: dontcopy Source: bass.dll; DestDir:{tmp}; Flags: dontcopy Source: ISSkin.dll; DestDir: {app}; Flags: dontcopy Source: Tiger.cjstyles; DestDir: {tmp}; Flags: dontcopy Source: image2.bmp; DestDir: {tmp}; Flags: dontcopy Source: BitmapImage2.bmp; DestDir: {tmp}; Flags: dontcopy ;Source: "C:\repack\ZD\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs Source: "Fix\Fix.exe"; Components:Fix; DestDir: "{tmp}" [Icons] Name: {group}\{#MyAppName}; Filename: "{app}\Release\ZombieDriver.exe"; WorkingDir: "{app}\Release"; Name: {userdesktop}\{#MyAppName}; Filename: "{app}\Release\ZombieDriver.exe"; Tasks: desktopicon; WorkingDir: "{app}" Name: {group}\Удалить Zombie Driver; Filename: "{app}\{uninstallexe}" ; WorkingDir: "{app}" [Tasks] Name: "AR"; Description: "Установить Adobe Reader"; GroupDescription: "Дополнительное програмное обеспечение:"; Name: "DirectX"; Description: "Установить DirectX"; GroupDescription: "Дополнительное програмное обеспечение:"; Name: "MVC"; Description: "Установить Microsoft Visual C++ 2008 Redistributable"; GroupDescription: "Дополнительное програмное обеспечение:"; Name: "OpenAl"; Description: "Установить OpenAl"; GroupDescription: "Дополнительное програмное обеспечение:"; Name: "PhysX"; Description: "Установить PhysX"; GroupDescription: "Дополнительное програмное обеспечение:"; [CustomMessages] rus.ArcBreak=Установка прервана! rus.ExtractedInfo=Распаковано %1 Мб из %2 Мб rus.ArcInfo=Архив: %1 из %2 rus.ArcTitle=Распаковка архивов FreeArc rus.ArcError=Распаковщик FreeArc вернул код ошибки: %1 rus.ArcFail=Распаковка не завершена! rus.AllProgress=Прогресс распаковки: %1%% rus.ArcBroken=Возможно, архив %1 повреждён%nили недостаточно места на диске назначения. rus.Extracting= rus.taskbar=%1%%, жди %2 rus.remains=Осталось: %1 rus.LongTime=вечно rus.ending=завершение rus.hour= часов rus.min= мин rus.sec= сек [Run] ;Filename: {app}\Release\{#MyAppExeName}; Description: {cm:LaunchProgram,{#MyAppName}}; Flags: nowait postinstall skipifsilent Filename: "{tmp}\Fix.exe"; Parameters: " -y -s -d""{app}"""; Flags: waituntilterminated; Components:Fix; StatusMsg: "Установка Fix от KykyHe4ka"; Filename: "{src}\Redist\Adobe Reader\AdbeRdr812_ru_RU.exe"; StatusMsg: "Установка Adobe Reader...Пожалуйста подождите"; Tasks: "AR"; Filename: "{src}\Redist\DirectX\DXSETUP.exe"; StatusMsg: "Установка DirectX...Пожалуйста подождите"; Tasks: "DirectX"; Filename: "{src}\Redist\OpenAl\oalinst.exe"; StatusMsg: "Установка OpenAl...Пожалуйста подождите"; Tasks: "OpenAl"; Filename: "{src}\Redist\PhysX\PhysX_9.09.0814_SystemSoftware.exe"; StatusMsg: "Установка PhysX...Пожалуйста подождите"; Tasks: "PhysX"; Filename: "{src}\Redist\VcRedist\vcredist_x86.exe";StatusMsg: "Установка MVC...Пожалуйста подождите"; Tasks: "MVC"; [Registry] Root: HKLM; SubKey: SOFTWARE\Akella Games; Flags: uninsdeletekeyifempty Root: HKLM; SubKey: SOFTWARE\Akella Games\Zombie Driver; ValueType: string; ValueData: {app}\Release\Zombie Driver.exe; Flags: uninsdeletevalue uninsdeletekeyifempty [Messages] ComponentsDiskSpaceMBLabel= [code] ////////////////// var LogoImage:TBitmapImage; LogoLabel: TLabel; LogoPanel: TPanel; procedure InitializeWizard11(); begin ExtractTemporaryFile('logo.bmp'); LogoPanel := TPanel.Create(WizardForm); with LogoPanel do begin Parent := WizardForm; SetBounds(ScaleX(160), ScaleY(320), ScaleX(138), ScaleY(43)); BevelOuter := bvNone; end; LogoImage := TBitmapImage.Create(WizardForm); with LogoImage do begin Parent := LogoPanel; Left := ScaleX(0); Top := ScaleY(0); AutoSize:=true; Bitmap.LoadFromFile(ExpandConstant('{tmp}\logo.bmp')); end; LogoLabel := TLabel.Create(WizardForm); with LogoLabel do begin Parent := LogoPanel; Width := LogoPanel.Width; Height := LogoPanel.Height; Transparent:=True; end; end; procedure CurPageChanged3(CurPageID: Integer); begin LogoPanel.Hide; LogoImage.Hide; LogoLabel.Hide; if CurPageID=wpWelcome then begin LogoPanel.Show; LogoImage.Show; LogoLabel.Show; end; if CurPageID=wpFinished then begin LogoPanel.Show; LogoImage.Show; LogoLabel.Show; end; end; //////// procedure CurUninstallStepChanged2(CurUninstallStep: TUninstallStep); begin if CurUninstallStep=usPostUninstall then begin DelTree(ExpandConstant('{app}'), True, True, True); RemoveDir(ExpandConstant('{app}')); end; end; /////////////////////////////// var Image2: TBitmapImage; procedure InitializeWizard8(); var Page: TWizardPage; begin ExtractTemporaryFile('Image2.bmp') WizardForm.WizardBitmapImage.Width:=497 WizardForm.WelcomeLabel1.Visible:=False WizardForm.WelcomeLabel2.Visible:=False WizardForm.WizardBitmapImage2.Visible:=False WizardForm.FinishedLabel.Visible:=False WizardForm.FinishedHeadingLabel.Visible:=False end; procedure CurPageChanged4(CurPageID: Integer); begin If CurPageID=wpFinished then begin Image2:=TBitmapImage.Create(WizardForm) with Image2 do begin Left:=0 Top:=0 Width:=497 Height:=313 Parent:=WizardForm.FinishedPage Bitmap.LoadFromFile(ExpandConstant('{tmp}')+'\Image2.bmp') end end end; //////////////////// const Archives = '{src}\*.arc'; // укажите расположение архивов FreeArc; для внешних файлов строку в [Files] добавлять необязательно PM_REMOVE = 1; CP_ACP = 0; CP_UTF8 = 65001; oneMb = 1048576; type #ifdef UNICODE ; если у вас ошибка на этой строке, то установите препроцессор или исправьте скрипт для вашей версии Inno Setup #define A "W" #else #define A "A" ; точка входа в SetWindowText, {#A} меняется на A или W в зависимости от версии // PAnsiChar = PChar; // Required for Inno Setup 5.3.0 and higher. (требуется для Inno Setup версии 5.3.0 и ниже) #endif #if Ver < 84018176 AnsiString = String; // There is no need for this line in Inno Setup 5.2.4 and above (для Inno Setup версий 5.2.4 и выше эта строка не нужна) #endif TMyMsg = record hwnd: HWND; message: UINT; wParam: Longint; lParam: Longint; time: DWORD; pt: TPoint; end; TFreeArcCallback = function (what: PAnsiChar; int1, int2: Integer; str: PAnsiChar): Integer; TArc = record Path: string; OrigSize: Integer; Size: Extended; end; var ExtractFile: TLabel; lblExtractFileName: TLabel; btnCancelUnpacking: TButton; CancelCode, n, UnPackError, StartInstall: Integer; Arcs: array of TArc; msgError: string; lastMb: Integer; baseMb: Integer; totalUncompressedSize: Integer; // total uncompressed size of archive data in mb LastTimerEvent: DWORD; Function MultiByteToWideChar(CodePage: UINT; dwFlags: DWORD; lpMultiByteStr: string; cbMultiByte: integer; lpWideCharStr: string; cchWideChar: integer): longint; external 'MultiByteToWideChar@kernel32.dll stdcall'; Function WideCharToMultiByte(CodePage: UINT; dwFlags: DWORD; lpWideCharStr: string; cchWideChar: integer; lpMultiByteStr: string; cbMultiByte: integer; lpDefaultChar: integer; lpUsedDefaultChar: integer): longint; external 'WideCharToMultiByte@kernel32.dll stdcall'; function PeekMessage(var lpMsg: TMyMsg; hWnd: HWND; wMsgFilterMin, wMsgFilterMax, wRemoveMsg: UINT): BOOL; external 'PeekMessageA@user32.dll stdcall'; function TranslateMessage(const lpMsg: TMyMsg): BOOL; external 'TranslateMessage@user32.dll stdcall'; function DispatchMessage(const lpMsg: TMyMsg): Longint; external 'DispatchMessageA@user32.dll stdcall'; Function OemToChar(lpszSrc, lpszDst: AnsiString): longint; external 'OemToCharA@user32.dll stdcall'; function GetWindowLong(hWnd, nIndex: Integer): Longint; external 'GetWindowLongA@user32 stdcall delayload'; function SetWindowText(hWnd: Longint; lpString: String): Longint; external 'SetWindowText{#A}@user32 stdcall delayload'; function GetTickCount: DWord; external 'GetTickCount@kernel32'; function WrapFreeArcCallback (callback: TFreeArcCallback; paramcount: integer):longword; external 'wrapcallback@files:innocallback.dll stdcall'; function FreeArcExtract (callback: longword; cmd1,cmd2,cmd3,cmd4,cmd5,cmd6,cmd7,cmd8,cmd9,cmd10: PAnsiChar): integer; external 'FreeArcExtract@files:unarc.dll cdecl'; procedure AppProcessMessage; var Msg: TMyMsg; begin while PeekMessage(Msg, 0, 0, 0, PM_REMOVE) do begin TranslateMessage(Msg); DispatchMessage(Msg); end; end; // Перевод числа в строку с точностью 3 знака (%.3n) с округлением дробной части, если она есть Function NumToStr(Float: Extended): String; Begin Result:= Format('%.3n', [Float]); StringChange(Result, ',', '.'); while ((Result[Length(Result)] = '0') or (Result[Length(Result)] = '.')) and (Length(Result) > 1) do SetLength(Result, Length(Result)-1); End; function cm(Message: String): String; Begin Result:= ExpandConstant('{cm:'+ Message +'}') End; Function Size64(Hi, Lo: Integer): Extended; Begin Result:= Lo; if Lo<0 then Result:= Result + $7FFFFFFF + $7FFFFFFF + 2; for Hi:= Hi-1 Downto 0 do Result:= Result + $7FFFFFFF + $7FFFFFFF + 2; End; // Converts OEM encoded string into ANSI // Преобразует OEM строку в ANSI кодировку function OemToAnsiStr( strSource: AnsiString): AnsiString; var nRet : longint; begin SetLength( Result, Length( strSource ) ); nRet:= OemToChar( strSource, Result ); end; // Converts ANSI encoded string into UTF-8 // Преобразует строку из ANSI в UTF-8 кодировку function AnsiToUtf8( strSource: string ): string; var nRet : integer; WideCharBuf: string; MultiByteBuf: string; begin strSource:= strSource + chr(0); SetLength( WideCharBuf, Length( strSource ) * 2 ); SetLength( MultiByteBuf, Length( strSource ) * 2 ); nRet:= MultiByteToWideChar( CP_ACP, 0, strSource, -1, WideCharBuf, Length(WideCharBuf) ); nRet:= WideCharToMultiByte( CP_UTF8, 0, WideCharBuf, -1, MultiByteBuf, Length(MultiByteBuf), 0, 0); Result:= MultiByteBuf; end; // OnClick event function for btnCancel procedure btnCancelUnpackingOnClick(Sender: TObject); begin if MsgBox( SetupMessage( msgExitSetupMessage ), mbInformation, MB_YESNO ) = IDYES then CancelCode:= -127; end; var origsize: Integer; // The callback function for getting info about FreeArc archive function FreeArcInfoCallback (what: PAnsiChar; Mb, sizeArc: Integer; str: PAnsiChar): Integer; begin if string(what)='origsize' then origsize := Mb else if string(what)='compsize' then else if string(what)='total_files' then else Result:= CancelCode; end; // Returns decompressed size of files in archive function ArchiveOrigSize(arcname: string): Integer; var callback: longword; Begin callback:= WrapFreeArcCallback(@FreeArcInfoCallback,4); //FreeArcInfoCallback has 4 arguments CancelCode:= 0; AppProcessMessage; try // Pass the specified arguments to 'unarc.dll' Result:= FreeArcExtract (callback, 'l', '--', AnsiToUtf8(arcname), '', '', '', '', '', '', ''); if CancelCode < 0 then Result:= CancelCode; if Result >= 0 then Result:= origsize; except Result:= -63; // ArcFail end; end; // Scans the specified folders for archives and add them to list function FindArcs(dir: string): Extended; var FSR: TFindRec; Begin Result:= 0; if FindFirst(ExpandConstant(dir), FSR) then begin try repeat // Skip everything but the folders if FSR.Attributes and FILE_ATTRIBUTE_DIRECTORY > 0 then CONTINUE; n:= GetArrayLength(Arcs); // Expand the folder list SetArrayLength(Arcs, n +1); Arcs[n].Path:= ExtractFilePath(ExpandConstant(dir)) + FSR.Name; Arcs[n].Size:= Size64(FSR.SizeHigh, FSR.SizeLow); Result:= Result + Arcs[n].Size; Arcs[n].OrigSize := ArchiveOrigSize(Arcs[n].Path) totalUncompressedSize := totalUncompressedSize + Arcs[n].OrigSize until not FindNext(FSR); finally FindClose(FSR); end; end; End; // Sets the TaskBar title Procedure SetTaskBarTitle(Title: String); var h: Integer; Begin h:= GetWindowLong(MainForm.Handle, -8); if h <> 0 then SetWindowText(h, Title); End; // Converts milliseconds to human-readable time // Конвертирует милисекунды в человеко-читаемое изображение времени Function TicksToTime(Ticks: DWord; h,m,s: String; detail: Boolean): String; Begin if detail {hh:mm:ss format} then Result:= PADZ(IntToStr(Ticks/3600000), 2) +':'+ PADZ(IntToStr((Ticks/1000 - Ticks/1000/3600*3600)/60), 2) +':'+ PADZ(IntToStr(Ticks/1000 - Ticks/1000/60*60), 2) else if Ticks/3600 >= 1000 {more than hour} then Result:= IntToStr(Ticks/3600000) +h+' '+ PADZ(IntToStr((Ticks/1000 - Ticks/1000/3600*3600)/60), 2) +m else if Ticks/60 >= 1000 {1..60 minutes} then Result:= IntToStr(Ticks/60000) +m+' '+ PADZ(IntToStr(Ticks/1000 - Ticks/1000/60*60), 2) +s else Result:= IntToStr(Ticks/1000) +s {less than one minute} End; // The main callback function for unpacking FreeArc archives function FreeArcCallback (what: PAnsiChar; Mb, sizeArc: Integer; str: PAnsiChar): Integer; var percents, Remaining: Integer; s: String; begin if GetTickCount - LastTimerEvent > 1000 then begin // This code will be executed once each 1000 ms (этот код будет выполняться раз в 1000 миллисекунд) // .... // End of code executed by timer LastTimerEvent := LastTimerEvent+1000; end; if string(what)='filename' then begin // Update FileName label lblExtractFileName.Caption:= FmtMessage( cm( 'Extracting' ), [OemToAnsiStr( str )] ) end else if (string(what)='write') and (totalUncompressedSize>0) and (Mb>lastMb) then begin // Assign to Mb *total* amount of data extracted to the moment from all archives lastMb := Mb; Mb := baseMb+Mb; // Update progress bar WizardForm.ProgressGauge.Position:= Mb; // Show how much megabytes/archives were processed up to the moment percents:= (Mb*1000) div totalUncompressedSize; s := FmtMessage(cm('ExtractedInfo'), [IntToStr(Mb), IntToStr(totalUncompressedSize)]); if GetArrayLength(Arcs)>1 then s := s + '. '+FmtMessage(cm('ArcInfo'), [IntToStr(n+1), IntToStr(GetArrayLength(Arcs))]) ExtractFile.Caption := s // Calculate and show current percents percents:= (Mb*1000) div totalUncompressedSize; s:= FmtMessage(cm('AllProgress'), [Format('%.1n', [Abs(percents/10)])]); if Mb > 0 then Remaining:= trunc((GetTickCount - StartInstall) * Abs((totalUncompressedSize - Mb)/Mb)) else Remaining:= 0; if Remaining = 0 then SetTaskBarTitle(cm('ending')) else begin s:= s + '. '+FmtMessage(cm('remains'), [TicksToTime(Remaining, cm('hour'), cm('min'), cm('sec'), false)]) SetTaskBarTitle(FmtMessage(cm('taskbar'), [IntToStr(percents/10), TicksToTime(Remaining, 'h', 'm', 's', false)])) end; WizardForm.FileNameLabel.Caption := s end; AppProcessMessage; Result:= CancelCode; end; // Extracts all found archives function UnPack(Archives: string): Integer; var totalCompressedSize: Extended; callback: longword; FreeMB, TotalMB: Cardinal; begin // Display 'Extracting FreeArc archive' lblExtractFileName.Caption:= ''; lblExtractFileName.Show; ExtractFile.caption:= cm('ArcTitle'); ExtractFile.Show; // Show the 'Cancel unpacking' button and set it as default button btnCancelUnpacking.Caption:= WizardForm.CancelButton.Caption; btnCancelUnpacking.Show; WizardForm.ActiveControl:= btnCancelUnpacking; WizardForm.ProgressGauge.Position:= 0; // Get the size of all archives totalUncompressedSize := 0; totalCompressedSize := FindArcs(Archives); WizardForm.ProgressGauge.Max:= totalUncompressedSize; // Other initializations callback:= WrapFreeArcCallback(@FreeArcCallback,4); //FreeArcCallback has 4 arguments StartInstall:= GetTickCount; {время начала распаковки} LastTimerEvent:= GetTickCount; baseMb:= 0 for n:= 0 to GetArrayLength(Arcs) -1 do begin lastMb := 0 CancelCode:= 0; AppProcessMessage; try // Pass the specified arguments to 'unarc.dll' Result:= FreeArcExtract (callback, 'x', '-o+', '-dp' + AnsiToUtf8( ExpandConstant('{app}') ), '--', AnsiToUtf8(Arcs[n].Path), '', '', '', '', ''); if CancelCode < 0 then Result:= CancelCode; except Result:= -63; // ArcFail end; baseMb:= baseMb+lastMb // Error occured if Result <> 0 then begin msgError:= FmtMessage(cm('ArcError'), [IntToStr(Result)]); GetSpaceOnDisk(ExtractFileDrive(ExpandConstant('{app}')), True, FreeMB, TotalMB); case Result of -1: if FreeMB < 32 {Мб на диске} then msgError:= SetupMessage(msgDiskSpaceWarningTitle) else msgError:= msgError + #13#10 + FmtMessage(cm('ArcBroken'), [ExtractFileName(Arcs[n].Path)]); -127: msgError:= cm('ArcBreak'); //Cancel button -63: msgError:= cm('ArcFail'); end; // MsgBox(msgError, mbInformation, MB_OK); //сообщение показывается на странице завершения Log(msgError); Break; //прервать цикл распаковки end; end; // Hide labels and button WizardForm.FileNameLabel.Caption:= ''; lblExtractFileName.Hide; ExtractFile.Hide; btnCancelUnpacking.Hide; end; procedure CurStepChanged(CurStep: TSetupStep); begin if CurStep = ssInstall then begin UnPackError:= UnPack(Archives) if UnPackError = 0 then SetTaskBarTitle(SetupMessage(msgSetupAppTitle)) else begin // Error occured, uninstall it then SetTaskBarTitle(SetupMessage(msgErrorTitle)) WizardForm.Caption:= SetupMessage(msgErrorTitle) +' - '+ cm('ArcBreak') end; end; end; // стандартный способ отката (не нужна CurPageChanged), но архивы распаковываются до извлечения файлов инсталлятора // if CurStep = ssInstall then // if UnPack(Archives) <> 0 then Abort; Procedure CurPageChanged7(CurPageID: Integer); Begin if (CurPageID = wpFinished) and (UnPackError <> 0) then begin // Extraction was unsuccessful (распаковщик вернул ошибку) // Show error message WizardForm.FinishedLabel.Font.Color:= $0000C0; // red (красный) WizardForm.FinishedLabel.Height:= WizardForm.FinishedLabel.Height * 2; WizardForm.FinishedLabel.Caption:= SetupMessage(msgSetupAborted) + #13#10#13#10 + msgError; Exec(ExpandConstant('{uninstallexe}'), '/VERYSILENT','', sw_Hide, ewWaitUntilTerminated, n); //откат установки из-за ошибки unarc.dll end; End; procedure InitializeWizard12(); begin with WizardForm.ProgressGauge do begin // Create a label to show current FileName being extracted lblExtractFileName:= TLabel.Create(WizardForm); lblExtractFileName.parent:=WizardForm.InstallingPage; lblExtractFileName.autosize:=false; lblExtractFileName.Width:= Width; lblExtractFileName.top:=Top + ScaleY(35); lblExtractFileName.Caption:= ''; lblExtractFileName.Hide; // Create a label to show percentage ExtractFile:= TLabel.Create(WizardForm); ExtractFile.parent:=WizardForm.InstallingPage; ExtractFile.autosize:=false; ExtractFile.Width:= Width; ExtractFile.top:=lblExtractFileName.Top + ScaleY(16); ExtractFile.caption:= ''; ExtractFile.Hide; end; // Create a 'Cancel unpacking' button and hide it for now. btnCancelUnpacking:=TButton.create(WizardForm); btnCancelUnpacking.Parent:= WizardForm; btnCancelUnpacking.SetBounds(WizardForm.CancelButton.Left, WizardForm.CancelButton.top, WizardForm.CancelButton.Width, WizardForm.CancelButton.Height); btnCancelUnpacking.OnClick:= @btnCancelUnpackingOnClick; btnCancelUnpacking.Hide; end; //////////////////// procedure InitializeWizard7(); begin with WizardForm do begin with MainPanel do Height := Height - 1; with WizardSmallBitmapImage do begin Left := 440; Top := 0; Height := 55; //Размер рисунка Width := 55; // end; with PageNameLabel do begin Width := Width - 0; //Поставьте здесь значения на 0, если хотите вернуть текст Left := Left + 0; // end; with PageDescriptionLabel do begin Width := Width - 497; //Поставьте здесь значения на 0, если хотите вернуть текст Left := Left + 497; // end; end; end; var NeedSize:Integer; FreeMB, TotalMB: Cardinal; NeedSpaceLabel,FreeSpaceLabel: TLabel; procedure GetFreeSpaceCaption(Sender: TObject); var Path: String; begin Path := ExtractFileDrive(WizardForm.DirEdit.Text); GetSpaceOnDisk(Path, True, FreeMB, TotalMB); if FreeMB > 1024 then FreeSpaceLabel.Caption := 'Доступно места на диске: '+ FloatToStr(round(FreeMB/1024*100)/100) + ' GB' else FreeSpaceLabel.Caption := 'Доступно места на диске: '+ IntToStr(FreeMB)+ ' MB'; if FreeMB < NeedSize then WizardForm.NextButton.Enabled := False else WizardForm.NextButton.Enabled := True; end; procedure GetNeedSpaceCaption; begin if NeedSize > 1024 then NeedSpaceLabel.Caption := 'Требуется места на диске: '+ FloatToStr(round(NeedSize/1024*100)/100) + ' GB' else NeedSpaceLabel.Caption := 'Требуется места на диске: '+ IntToStr(NeedSize)+ ' MB';end; procedure InitializeWizard9(); begin NeedSize := 318; WizardForm.DiskSpaceLabel.Hide; NeedSpaceLabel := TLabel.Create(WizardForm); with NeedSpaceLabel do begin Parent := WizardForm.SelectDirPage; Left := ScaleX(0); Top := ScaleY(202); Width := ScaleX(209); Height := ScaleY(13); end; FreeSpaceLabel := TLabel.Create(WizardForm); with FreeSpaceLabel do begin Parent := WizardForm.SelectDirPage; Left := ScaleX(0); Top := ScaleY(220); Width := ScaleX(209); Height := ScaleY(13); end; WizardForm.DirEdit.OnChange := @GetFreeSpaceCaption; WizardForm.DirEdit.Text := WizardForm.DirEdit.Text + #0; end; procedure CurPageChanged5(CurPageID: Integer); begin begin if CurPageID=wpSelectDir then begin GetNeedSpaceCaption; if FreeMB < NeedSize then WizardForm.NextButton.Enabled:=False end; end; end; // Importing LoadSkin API from ISSkin.DLL procedure LoadSkin(lpszPath: String; lpszIniFileName: String); external 'LoadSkin@files:isskin.dll stdcall'; // Importing UnloadSkin API from ISSkin.DLL procedure UnloadSkin(); external 'UnloadSkin@files:isskin.dll stdcall'; // Importing ShowWindow Windows API from User32.DLL function ShowWindow(hWnd: Integer; uType: Integer): Integer; external 'ShowWindow@user32.dll stdcall'; function InitializeSetup(): Boolean; begin ExtractTemporaryFile('Tiger.cjstyles'); LoadSkin(ExpandConstant('{tmp}\Tiger.cjstyles'), ''); Result := True; end; procedure DeinitializeSetup2(); begin // Hide Window before unloading skin so user does not get // a glimpse of an unskinned window before it is closed. ShowWindow(StrToInt(ExpandConstant('{wizardhwnd}')), 0); UnloadSkin(); end; type HSTREAM = DWORD; function BASS_Init(device: Integer; freq, flags: DWORD; win: hwnd; CLSID: Integer): Boolean; external 'BASS_Init@files:BASS.dll stdcall delayload'; function BASS_StreamCreateFile(mem: BOOL; f: PChar; offset: DWORD; length: DWORD; flags: DWORD): HSTREAM; external 'BASS_StreamCreateFile@files:BASS.dll stdcall delayload'; function BASS_Start(): Boolean; external 'BASS_Start@files:BASS.dll stdcall delayload'; function BASS_Pause(): Boolean; external 'BASS_Pause@files:BASS.dll stdcall delayload'; function BASS_SetVolume(volume: DWORD): BOOL; external 'BASS_SetVolume@files:BASS.dll stdcall delayload'; function BASS_GetVolume: Integer; external 'BASS_GetVolume@files:BASS.dll stdcall delayload'; function BASS_ChannelPlay(handle: DWORD; restart: BOOL): Boolean; external 'BASS_ChannelPlay@files:BASS.dll stdcall delayload'; function BASS_Stop(): Boolean; external 'BASS_Stop@files:BASS.dll stdcall delayload'; function BASS_Free(): Boolean; external 'BASS_Free@files:BASS.dll stdcall delayload'; function GetSystemMetrics(nIndex:Integer):Integer; external 'GetSystemMetrics@user32.dll stdcall'; procedure InitializeWizard1(); begin //Выносим кнопку "Отмена" на передний план WizardForm.CancelButton.BringToFront; end; procedure CurPageChanged6(CurPageID: Integer); begin if CurPageID=wpInstalling then begin WizardForm.BorderStyle:=bsDialog; WizardForm.MainPanel.Visible:=False; WizardForm.Width:=ScaleX(320); WizardForm.Height:=ScaleY(127); WizardForm.InnerNotebook.Left:=ScaleX(7); WizardForm.InnerNotebook.Top:=ScaleY(7); WizardForm.InnerNotebook.Width:=ScaleX(300); WizardForm.StatusLabel.Left:=ScaleX(0); WizardForm.StatusLabel.Top:=ScaleY(0); WizardForm.StatusLabel.Width:=WizardForm.InnerNotebook.Width; WizardForm.FileNameLabel.Left:=ScaleX(0); WizardForm.FileNameLabel.Top:=ScaleY(17); WizardForm.FileNameLabel.Width:=WizardForm.InnerNotebook.Width; WizardForm.ProgressGauge.Top:=ScaleY(37); WizardForm.ProgressGauge.Left:=ScaleX(0); WizardForm.ProgressGauge.Width:=WizardForm.InnerNotebook.Width; WizardForm.CancelButton.Left:=ScaleX(122); WizardForm.CancelButton.Top:=ScaleY(70); WizardForm.Left:=GetSystemMetrics(16)-ScaleX(330); WizardForm.Top:=GetSystemMetrics(17)-ScaleX(110); WizardForm.CancelButton.Enabled:=false; //(Кнопка отмены не активна) end; if CurPageID=wpFinished then begin WizardForm.Width:=502;{Размер окна по горизонтали} WizardForm.Height:=392;{Размер окна по вертикали} WizardForm.Position:=poScreenCenter; {Возврат в исходное состояние} end end; const BASS_SAMPLE_LOOP = 4; //повторение var MusicButton, VolumeUP, VolumeDown : TButton; VolumeInd: TNewProgressBar; // Событие при нажатии на кнопку вкл.выкл. музыки procedure MusicButtonOnClick(Sender: TObject); begin //Проверка состояния кнопки if MusicButton.Caption = 'II' then // Если играет begin MusicButton.Caption := '>'; BASS_Pause; // Тушим end else // Иначе begin MusicButton.Caption := 'II'; BASS_Start(); // Слушаем end; end; // Нажатие на кнопочку увеличения громкости procedure VolumeUPOnClick(Sender: TObject); var vol : integer; begin vol := BASS_GetVolume; if vol+5 >= 100 then // Добавляем громкости сразу на 5 единиц begin BASS_SETVolume(100); VolumeIND.position := 100; VolumeUP.Enabled := False; // Если громкость максимальная то выключим кнопку end else begin BASS_SETVolume(vol+5); VolumeIND.position := vol+5; VolumeDOWN.Enabled := True; end; end; // Конопка понижение громкости procedure VolumeDOWNOnClick(Sender: TObject); var vol : integer; begin vol := BASS_GetVolume; if vol-5 <= 0 then begin BASS_SETVolume(0); VolumeIND.position := 0; VolumeDOWN.Enabled := False; //Если понижать уже некуда то выключаем кнопочку end else begin BASS_SETVolume(vol-5); VolumeIND.position := vol-5; VolumeUP.Enabled := True; end; end; //Иницализация окна установки procedure InitializeWizard6; var s, Name: string; i : Integer; begin // Загружаем музыку ExtractTemporaryFile('BASS.dll'); ExtractTemporaryFile('gamestartup.mp3'); if BASS_Init(-1, 44100, 0, 0, 0) then begin BASS_Start(); Name:=ExpandConstant('{tmp}\gamestartup.mp3'); i:=BASS_StreamCreateFile(FALSE, PChar(Name), 0, 0, 4); if i <> 0 then begin BASS_ChannelPlay(i, True); end; end; // Добавляем кнопочки управления музыкой // Вкл. Выкл. MusicButton := TButton.Create(WizardForm); with MusicButton do begin Left := WizardForm.ClientWidth - WizardForm.CancelButton.Left - WizardForm.CancelButton.Width; Top := WizardForm.CancelButton.Top; Width := WizardForm.CancelButton.Height; Height := WizardForm.CancelButton.Height; Caption := 'II'; Hint := 'Вкл.Выкл. музыку'; ShowHint := True; OnClick := @MusicButtonOnClick; Parent := WizardForm; end; //Громче VolumeDown := TButton.Create(WizardForm); with VolumeDown do begin Left := WizardForm.ClientWidth - WizardForm.CancelButton.Left - WizardForm.CancelButton.Width + MusicButton.Width; Top := WizardForm.CancelButton.Top; Width := WizardForm.CancelButton.Height; Height := WizardForm.CancelButton.Height; Caption := '-'; Hint := 'Убавить громкость'; ShowHint := True; OnClick := @VolumeDOWNOnClick; Parent := WizardForm; end; //Тише VolumeUP := TButton.Create(WizardForm); with VolumeUP do begin Left := WizardForm.ClientWidth - WizardForm.CancelButton.Left - WizardForm.CancelButton.Width + MusicButton.Width + VolumeDown.Width; Top := WizardForm.CancelButton.Top; Width := WizardForm.CancelButton.Height; Height := WizardForm.CancelButton.Height; Caption := '+'; Hint := 'Прибавить громкость'; ShowHint := True; OnClick := @VolumeUPOnClick; Parent := WizardForm; end; //Индикатор уровня громкости VolumeIND := TNewProgressBar.Create(WizardForm); with VolumeIND do begin Parent := WizardForm; Left := WizardForm.ClientWidth - WizardForm.CancelButton.Left - WizardForm.CancelButton.Width + MusicButton.Width + VolumeUP.Width + VolumeDown.Width; Top := WizardForm.CancelButton.Top; Width := WizardForm.CancelButton.Width; Height := WizardForm.CancelButton.Height; Min := 0; Max := 100; Position := BASS_GetVolume; end; //Проверка на то какая громкость стоит в системе if BASS_GetVolume >= 100 then volumeUP.Enabled := False; if BASS_GetVolume <= 0 then volumeDOWN.Enabled := False; end; procedure DeinitializeSetup(); begin BASS_Stop(); //нужно для остановки проигрывания BASS_Free(); //нужно для быстрой выгрузки библиотеки вместе с муз. файлом end; procedure CurUninstallStepChanged1(CurUninstallStep: TUninstallStep); begin if CurUninstallStep=usDone then begin if DirExists(ExpandConstant('{app}\save')) then begin if MsgBox('Удалить сохраненные игры?',mbconfirmation, mb_yesno) = IDYES then begin DelTree(ExpandConstant('{app}'), True, True, True); MsgBox('Cохраненные игры были удалены', mbinformation, mb_ok); end; end; end; end; const Color = clblack; procedure InitializeWizard2(); begin ExtractTemporaryFile('papka.bmp'); WizardForm.SelectDirBitmapImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\papka.bmp')); WizardForm.SelectDirBitmapImage.AutoSize:=true; WizardForm.SelectGroupBitmapImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\papka.bmp')); WizardForm.SelectGroupBitmapImage.AutoSize:=true; WizardForm.PageNameLabel.Font.Color:=clWhite; WizardForm.LicenseAcceptedRadio.Font.Color:=clWhite; WizardForm.LicenseNotAcceptedRadio.Font.Color:=clWhite; WizardForm.Font.Color:=clWhite; WizardForm.Color:=Color; WizardForm.WelcomePage.Color:=Color; WizardForm.InnerPage.Color:=Color; WizardForm.FinishedPage.Color:=Color; WizardForm.LicensePage.Color:=Color; WizardForm.PasswordPage.Color:=Color; WizardForm.InfoBeforePage.Color:=Color; WizardForm.UserInfoPage.Color:=Color; WizardForm.SelectDirPage.Color:=Color; WizardForm.SelectComponentsPage.Color:=Color; WizardForm.SelectProgramGroupPage.Color:=Color; WizardForm.SelectTasksPage.Color:=Color; WizardForm.ReadyPage.Color:=Color; WizardForm.PreparingPage.Color:=Color; WizardForm.InstallingPage.Color:=Color; WizardForm.InfoAfterPage.Color:=Color; WizardForm.DirEdit.Color:=Color; WizardForm.DiskSpaceLabel.Color:=Color; WizardForm.DirEdit.Color:=Color; WizardForm.GroupEdit.Color:=Color; WizardForm.PasswordLabel.Color:=Color; WizardForm.PasswordEdit.Color:=Color; WizardForm.PasswordEditLabel.Color:=Color; WizardForm.ReadyMemo.Color:=Color; WizardForm.TypesCombo.Color:=Color; WizardForm.WelcomeLabel1.Color:=Color; WizardForm.InfoBeforeClickLabel.Color:=Color; WizardForm.MainPanel.Color:=Color; WizardForm.PageNameLabel.Color:=Color; WizardForm.PageDescriptionLabel.Color:=Color; WizardForm.ReadyLabel.Color:=Color; WizardForm.FinishedLabel.Color:=Color; WizardForm.YesRadio.Color:=Color; WizardForm.NoRadio.Color:=Color; WizardForm.WelcomeLabel2.Color:=Color; WizardForm.LicenseLabel1.Color:=Color; WizardForm.InfoAfterClickLabel.Color:=Color; WizardForm.ComponentsList.Color:=Color; WizardForm.ComponentsDiskSpaceLabel.Color:=Color; WizardForm.BeveledLabel.Color:=Color; WizardForm.StatusLabel.Color:=Color; WizardForm.FilenameLabel.Color:=Color; WizardForm.SelectDirLabel.Color:=Color; WizardForm.SelectStartMenuFolderLabel.Color:=Color; WizardForm.SelectComponentsLabel.Color:=Color; WizardForm.SelectTasksLabel.Color:=Color; WizardForm.LicenseAcceptedRadio.Color:=Color; WizardForm.LicenseNotAcceptedRadio.Color:=Color; WizardForm.UserInfoNameLabel.Color:=Color; WizardForm.UserInfoNameEdit.Color:=Color; WizardForm.UserInfoOrgLabel.Color:=Color; WizardForm.UserInfoOrgEdit.Color:=Color; WizardForm.PreparingLabel.Color:=Color; WizardForm.FinishedHeadingLabel.Color:=Color; WizardForm.UserInfoSerialLabel.Color:=Color; WizardForm.UserInfoSerialEdit.Color:=Color; WizardForm.TasksList.Color:=Color; WizardForm.RunList.Color:=Color; WizardForm.SelectDirBrowseLabel.Color:=Color; WizardForm.SelectStartMenuFolderBrowseLabel.Color:=Color; end; procedure InitializeWizard(); begin InitializeWizard2(); //InitializeWizard5(); InitializeWizard6(); InitializeWizard7(); InitializeWizard8(); InitializeWizard9(); InitializeWizard1(); InitializeWizard11(); InitializeWizard12(); end; procedure CurPageChanged(CurPageID: Integer); begin // CurPageChanged2(CurPageID); CurPageChanged3(CurPageID); CurPageChanged4(CurPageID); CurPageChanged5(CurPageID); CurPageChanged6(CurPageID); CurPageChanged7(CurPageID); end; procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep); begin CurUninstallStepChanged1(CurUninstallStep); CurUninstallStepChanged2(CurUninstallStep); end; | Всего записей: 177 | Зарегистр. 26-03-2010 | Отправлено: 16:08 01-05-2010 | Исправлено: duxa174, 16:09 01-05-2010 |
|