Raf_SE
Advanced Member | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору Код: #define TIME_FOR_VIEW 10 [C0de] procedure ChangeCaption(str: string); begin WizardForm.StatusLabel.Caption:= str; end; function enabledesc(ComponentsListHandle: HWND; DescLabelHandle: HWND; DescStrings: PChar): BOOL; external 'enabledesc@files:descctrl.dll stdcall'; function disabledesc(): BOOL; external 'disabledesc@files:descctrl.dll stdcall'; var Info: TNewStaticText; InfoCaption: TNewStaticText; InfoPanel: TPanel; NeedSize:Integer; FreeMB, TotalMB: Cardinal; NeedSpaceLabel: TLabel; n: Integer; VolumeName, FileSystemName: String; VolumeSerialNo, MaxComponentLength, FileSystemFlags: Longint; ListBox: TListBox; StartMenuTreeView: TStartMenuFolderTreeView; procedure GetFreeSpaceCaption(Sender: TObject); var Path: String; begin Path := ExtractFileDrive(WizardForm.DirEdit.Text); GetSpaceOnDisk(Path, True, FreeMB, TotalMB); 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) + ' Гб свободного дискового пространства.' else NeedSpaceLabel.Caption := 'Требуется как минимум '+ IntToStr(NeedSize)+ ' Мб свободного дискового пространства.';end; const oneMB= 1024*1024; function GetLogicalDrives: DWord; external 'GetLogicalDrives@kernel32.dll stdcall'; function GetDriveType(nDrive: String): Longint; external 'GetDriveTypeA@kernel32.dll stdcall'; function GetVolumeInformation(PathName,VolumeName: PChar; VolumeNameSize,VolumeSerialNumber,MaxComponentLength,FileSystemFlags: Longint; FileSystemName: PChar; FileSystemNameSize: Longint): Longint; external 'GetVolumeInformationA@kernel32.dll stdcall'; function MessageBox(hWnd: Integer; lpText, lpCaption: String; uType: Cardinal): Integer; external 'MessageBoxA@user32.dll stdcall'; Function ByteOrTB(Bytes: Extended; noMB: Boolean): String; { Перевод числа в значение бт/Кб/Мб/Гб/Тб (до 3х знаков после запятой)} Begin if not noMB then Result:= FloatToStr(Int(Bytes)) +' Мб' else if Bytes < 1024 then Result:= FloatToStr(Int(Bytes)) +' Бт' else if Bytes/1024 < 1024 then Result:= FloatToStr(round((Bytes/1024)*10)/10) +' Кб' else If Bytes/oneMB < 1024 then Result:= FloatToStr(round(Bytes/oneMB*100)/100) +' Мб' else If Bytes/oneMB/1000 < 1024 then Result:= FloatToStr(round(Bytes/oneMB/1024*1000)/1000) +' Гб' else Result:= FloatToStr(round(Bytes/oneMB/oneMB*1000)/1000) +' Тб' StringChange(Result, ',', '.') End; Function DelSP(String: String): String; { Удаление начальных, конечных и повторных пробелов } Begin while (Pos(' ', String) > 0) do Delete(String, Pos(' ', String), 1); Result:= Trim(String); End; Function CutString(String: String; MaxLength: Longint): String; { Обрезать строку до заданного кол-ва символов} Begin if Length(String) > MaxLength then Result:= Copy(String, 1, 6) +'...'+ Copy(String, Length(String) - MaxLength +9, MaxLength) else Result:= String; End; Procedure GetDiskInfo(Disk: String); Begin FileSystemName:= StringOfChar(' ', 32); VolumeName:= StringOfChar(' ', 256); GetVolumeInformation(Disk, VolumeName, 255, VolumeSerialNo, MaxComponentLength, FileSystemFlags, FileSystemName, 31); FileSystemName:= DelSp(FileSystemName); VolumeName:= DelSp(VolumeName); if VolumeName='' then VolumeName:='без метки'; End; Procedure ListBoxRefresh; var FreeB, TotalB: Cardinal; Path, String: string; Begin ListBox.Items.Clear for n:= 1 to 31 do // диск 'А' пропустить if (GetLogicalDrives and (1 shl n)) > 0 then if (GetDriveType(Chr(ord('A') + n) +':\') = 2) or (GetDriveType(Chr(ord('A') + n) +':\') = 3) then if GetSpaceOnDisk(Chr(ord('A') + n) +':\', True, FreeMB, TotalMB) then ListBox.Items.Add(Chr(ord('A') + n) +':'); for n:= 0 to ListBox.Items.Count -1 do begin Path:= Copy(ListBox.Items[n],1,2) +'\' { если в накопителе нет диска, пропустить обновление } if GetSpaceOnDisk(Path, False, FreeB, TotalB) and GetSpaceOnDisk(Path, True, FreeMB, TotalMB) then begin GetDiskInfo(Path); if FreeB >= $7FFFFFFF then String:= PadL(ByteOrTB(FreeMB*oneMB, true),10) else String:= PadL(ByteOrTB(FreeB, true),10); if TotalB >= $7FFFFFFF then begin TotalB:= TotalMB; FreeB:= FreeMB; String:= PadL(ByteOrTB(TotalMB*oneMB, true),11) +' всего -'+ String end else String:= PadL(ByteOrTB(TotalB, true),11) +' всего| '+ String; ListBox.Items[n]:= Copy(Path,1,2) + String + PadL(FloatToStr(round(FreeB/TotalB*100)),3)+ '% своб|'+ PadL(FileSystemName,5)+ '| '+ CutString(VolumeName,9); end; end; End; Procedure ObjectOnClick(Sender: TObject); Begin Case TObject(Sender) of ListBox: for n:= 0 to ListBox.Items.Count-1 do if ListBox.Selected[n] then WizardForm.DirEdit.Text:= Copy(ListBox.Items[n],1,1) +Copy(WizardForm.DirEdit.Text, 2, Length(WizardForm.DirEdit.Text)) StartMenuTreeView: if StartMenuTreeView.Directory <> '' then WizardForm.GroupEdit.Text:= StartMenuTreeView.Directory else WizardForm.GroupEdit.Text:= '{#SetupSetting("DefaultGroupName")}' WizardForm.NoIconsCheck: begin WizardForm.GroupEdit.Enabled:= not(WizardForm.GroupEdit.Enabled); StartMenuTreeView.Enabled:= WizardForm.GroupEdit.Enabled; WizardForm.GroupBrowseButton.Enabled:= WizardForm.GroupEdit.Enabled end; end; End; procedure InitializeWizard1(); begin with WizardForm do begin with MainPanel do Height := Height - 1; with WizardSmallBitmapImage do begin Left := 0; Top := 0; Height := 58; //Размер рисунка Width := 497; // end; with PageNameLabel do begin Width := Width - 497; //Поставьте здесь значения на 0, если хотите вернуть текст Left := Left + 497; // end; with PageDescriptionLabel do begin Width := Width - 497; //Поставьте здесь значения на 0, если хотите вернуть текст Left := Left + 497; // end; end; end; procedure InitializeWizard2(); begin NeedSize := 2500; //Здесь указывается место для приложения WizardForm.DiskSpaceLabel.Hide; NeedSpaceLabel := TLabel.Create(WizardForm); with NeedSpaceLabel do begin Parent := WizardForm.SelectDirPage; Left := ScaleX(0); Top := ScaleY(220); Width := ScaleX(209); Height := ScaleY(13); end; ListBox:= TListBox.Create(WizardForm) ListBox.SetBounds(WizardForm.DirEdit.Left, WizardForm.DirEdit.Top + WizardForm.DirEdit.Height + 8, WizardForm.DirBrowseButton.Left + WizardForm.DirBrowseButton.Width - WizardForm.DirEdit.Left, WizardForm.DiskSpaceLabel.Top - (WizardForm.DirEdit.Top + WizardForm.DirEdit.Height + 12)) ListBox.Font.Size:= 9 ListBox.Font.Style:= [] ListBox.Font.Name:= 'Courier New'; ListBox.OnClick:= @ObjectOnClick; ListBox.Parent:= WizardForm.SelectDirPage; WizardForm.DirEdit.OnChange := @GetFreeSpaceCaption; WizardForm.DirEdit.Text := WizardForm.DirEdit.Text + #0; end; procedure CurPageChanged1(CurPageID: Integer); begin if CurPageID=wpSelectDir then begin GetNeedSpaceCaption; if FreeMB < NeedSize then WizardForm.NextButton.Enabled:=False ListBoxRefresh end; end; procedure InitializeWizard3(); begin WizardForm.TYPESCOMBO.Visible:= false; WizardForm.ComponentsList.Height := WizardForm.ComponentsList.Height + WizardForm.ComponentsList.Top - WizardForm.TYPESCOMBO.Top; WizardForm.ComponentsList.Top := WizardForm.TYPESCOMBO.Top; WizardForm.ComponentsList.Width := ScaleX(200); InfoPanel := TPanel.Create(WizardForm); InfoPanel.Parent := WizardForm.SelectComponentsPage; InfoPanel.Caption := ''; InfoPanel.Top := WizardForm.ComponentsList.Top; InfoPanel.Left := ScaleX(216); InfoPanel.Width := ScaleX(200); InfoPanel.Height := WizardForm.ComponentsList.Height; InfoPanel.BevelInner := bvRaised; InfoPanel.BevelOuter := bvLowered; InfoCaption := TNewStaticText.Create(WizardForm); InfoCaption.Parent := WizardForm.SelectComponentsPage; InfoCaption.Caption := 'Описание'; InfoCaption.Left := ScaleX(224); InfoCaption.Top := InfoPanel.Top - ScaleY(5); InfoCaption.Font.Color := clActiveCaption; Info := TNewStaticText.Create(WizardForm); Info.Parent := InfoPanel; Info.AutoSize := False; Info.Left := ScaleX(6); Info.Width := ScaleX(188); Info.Top := ScaleY(12); Info.Height := WizardForm.ComponentsList.Height - ScaleY(18); Info.Caption := 'Переместите ваш указатель мыши на компоненты чтобы увидеть их описание.'; Info.WordWrap := true; //Впишыте описание компонентов enabledesc(WizardForm.ComponentsList.Handle,Info.Handle, 'Выберите язык внутриигрового текста;'+ //Text 'Немецкий текст;'+ 'Испанский текст;'+ 'Французский текст;'+ 'Итальянский текст;'+ 'Польский текст;'+ 'Выберите этот пункт, если вы хотите установить внутриигровую музыку. Учтите, что её можно отключить даже после инсталляции, в меню опций игры.;' // Music ); end; function ShouldSkipPage(CurPage: Integer): Boolean; begin if Pos('/SP-', UpperCase(GetCmdTail)) > 0 then case CurPage of wpLicense, wpPassword, wpInfoBefore, wpUserInfo, wpSelectDir, wpSelectProgramGroup, wpInfoAfter: Result := True; end; end; const WM_LBUTTONDOWN = 513; WM_LBUTTONUP = 514; procedure InitializeWizard4(); begin if (Pos('/SP-', UpperCase(GetCmdTail)) > 0) then begin PostMessage(WizardForm.NextButton.Handle,WM_LBUTTONDOWN,0,0); PostMessage(WizardForm.NextButton.Handle,WM_LBUTTONUP,0,0); end; end; procedure CurPageChanged2(CurPageID: Integer); begin if (Pos('/SP-', UpperCase(GetCmdTail)) > 0) and (CurPageID = wpSelectComponents) then WizardForm.BackButton.Visible := False; end; //Проверка на оставшыеся файлы procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep); var Res: Integer; begin case CurUninstallStep of usPostUninstall: begin if DirExists(ExpandConstant('{app}')) then if ExpandConstant('{language}') = 'ua' then case MsgBox('Папка "' + ExpandConstant('{app}') + '" не порожня.'#13#13 + '"Так" – повне видалення всіх файлів у папці, включаючи саму папку.' #13#13 + '"Ні" – відкрити папку в провіднику, щоб вручну видалити файли.'#13#13 + '"Скасувати" – нічого не робити, видалити папку пізніше самостійно.', mbInformation, MB_YESNOCANCEL) of IDYES: if not DelTree(ExpandConstant('{app}'), True, True, True) then MsgBox('Папка не видалена.' #13#13 'Папка або один з файлів у ній задіяні іншою програмою.', mbError, MB_OK); IDNO: if not ShellExec('open', ExpandConstant('{app}'), '', '', SW_SHOWMAXIMIZED, ewNoWait, Res) then MsgBox('Помилка відкриття.' #13#13 'Папка не знайдена.', mbError, MB_OK); IDCANCEL:; end else if ExpandConstant('{language}') = 'ru' then case MsgBox('Папка "' + ExpandConstant('{app}') + '" не пуста.'#13#13 + '"Да" – полное удаление всех файлов в папке, включая саму папку.' #13#13 + '"Нет" – открыть папку в проводнике, чтобы вручную удалить файлы.'#13#13 + '"Отмена" – ничего не делать, удалить папку позже самостоятельно.', mbInformation, MB_YESNOCANCEL) of IDYES: if not DelTree(ExpandConstant('{app}'), True, True, True) then MsgBox('Папка не удалена.' #13#13 'Папка или один из файлов в ней задействованы другим приложением.', mbError, MB_OK); IDNO: if not ShellExec('open', ExpandConstant('{app}'), '', '', SW_SHOWMAXIMIZED, ewNoWait, Res) then MsgBox('Ошибка открытия.' #13#13 'Папка не найдена.', mbError, MB_OK); IDCANCEL:; end else case MsgBox('Directory "' + ExpandConstant('{app}') + '" is not empty.'#13#13 + '"Yes" to delete all of the files in the directory, including the directory itself.' #13#13 + '"No" to open the directory with explorer to delete the files manually.'#13#13 + '"Cancel" to do nothing and delete the directory later manually.', mbInformation, MB_YESNOCANCEL) of IDYES: if not DelTree(ExpandConstant('{app}'), True, True, True) then MsgBox('Directory is not deleted.' #13#13 'Directory or one of the files are used by the other application.', mbError, MB_OK); IDNO: if not ShellExec('open', ExpandConstant('{app}'), '', '', SW_SHOWMAXIMIZED, ewNoWait, Res) then MsgBox('Error opening the directory.' #13#13 'Directory is not found.', mbError, MB_OK); IDCANCEL:; end end end end; const n1=28; //количество слайдов type TProc = procedure(HandleW, msg, idEvent, TimeSys: LongWord); TRandNumbers = array[1..N1] of byte; function WrapTimerProc(callback:TProc; paramcount:integer):longword; external 'wrapcallback@files:InnoCallback.dll stdcall'; function SetTimer(hWnd: LongWord; nIDEvent, uElapse: LongWord; lpTimerFunc: LongWord): LongWord; external 'SetTimer@user32.dll stdcall'; function KillTimer(hWnd: LongWord; nIDEvent: LongWord): LongWord; external 'KillTimer@user32.dll stdcall'; function get_unique_random_number(X:byte):TRandNumbers; var A,b,c: string; i,j,k:byte; begin For i:=1 to X do A:=A+chr(i); B:=''; For i:=1 to X do begin j:=Random(Length(A)-1)+1; C:=''; B:=B + A[j]; for k:=1 to Length(A) do if k<>j then C:=C+A[k]; A:=C; end; for i:=1 to X do Result[i]:=ord(B[i]); end; var TimerID: LongWord; currTime: Integer; SplashImage: TBitmapImage; StatusMessages: TNewStaticText; bmp: TRandNumbers; z:byte; procedure OnTimer(HandleW, msg, idEvent, TimeSys: LongWord); begin currTime := currTime + 1; if (currTime mod {#TIME_FOR_VIEW} = 0) then begin SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_'+inttostr(bmp[currTime/{#TIME_FOR_VIEW}])+'.bmp')); if (currTime/{#TIME_FOR_VIEW} = N1) then currTime:=0; end; end; procedure InitializeWizard5; begin bmp:=get_unique_random_number(N1); ExtractTemporaryFile('Image_'+inttostr(bmp[1])+'.bmp'); currTime := 0; WizardForm.ProgressGauge.Parent := WizardForm; WizardForm.ProgressGauge.Top := WizardForm.CancelButton.Top + ScaleY(12); WizardForm.ProgressGauge.Left := ScaleX(10); WizardForm.ProgressGauge.Width := WizardForm.MainPanel.Width - ScaleX(20); WizardForm.ProgressGauge.Height := 16; WizardForm.ProgressGauge.Hide; WizardForm.StatusLabel.Parent := WizardForm; WizardForm.StatusLabel.Top := WizardForm.ProgressGauge.Top - ScaleY(18); WizardForm.StatusLabel.Left := ScaleX(10); WizardForm.StatusLabel.Width := ScaleX(397); WizardForm.StatusLabel.Hide; SplashImage := TBitmapImage.Create(WizardForm); SplashImage.Top := 0; SplashImage.Left := 0; SplashImage.Width := WizardForm.MainPanel.Width; SplashImage.Height := WizardForm.Bevel.Top; SplashImage.Parent := WizardForm.InnerPage; SplashImage.Stretch := True; SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_'+inttostr(bmp[1])+'.bmp')); SplashImage.Hide; end; procedure CurStepChanged(CurStep: TSetupStep); begin if CurStep = ssInstall then begin WizardForm.StatusLabel.Caption := 'Распаковка слайдов...'; for z:=2 to N1 do ExtractTemporaryFile('Image_'+inttostr(bmp[z])+'.bmp'); end; end; procedure CurPageChanged3(CurPageID: Integer); var pfunc: LongWord; begin if (CurPageID = wpInstalling) then begin pfunc := WrapTimerProc(@OnTimer, 5); TimerID := SetTimer(0, 0, 1000, pfunc); WizardForm.PageNameLabel.Visible := False; WizardForm.PageDescriptionLabel.Visible := False; WizardForm.InnerNotebook.Hide; WizardForm.Bevel1.Hide; WizardForm.MainPanel.Hide; WizardForm.PageNameLabel.Hide; WizardForm.PageDescriptionLabel.Hide; WizardForm.ProgressGauge.Show; WizardForm.StatusLabel.Show; SplashImage.Show; WizardForm.CancelButton.Enabled := True; WizardForm.CancelButton.Top := WizardForm.Bevel.Top + ScaleY(100); end else begin WizardForm.ProgressGauge.Hide; SplashImage.Hide; WizardForm.FileNameLabel.Hide; WizardForm.StatusLabel.Hide; if (CurPageID > wpInstalling) and (CurPageID < wpFinished) then begin WizardForm.InnerNotebook.Show; WizardForm.Bevel1.Show; WizardForm.MainPanel.Show; WizardForm.PageNameLabel.Show; WizardForm.PageDescriptionLabel.Show; end; If CurPageID = wpFinished then end; end; procedure CurPageChanged4(CurPageID: Integer); begin if CurPageID = wpInstalling then WizardForm.BeveledLabel.hide; if CurPageID = wpInfoAfter then WizardForm.BeveledLabel.show; end; procedure InitializeWizard; begin InitializeWizard1(); InitializeWizard2(); InitializeWizard3(); InitializeWizard4(); InitializeWizard5(); end; procedure CurPageChanged(CurPageID: Integer); begin CurPageChanged1(CurPageID); CurPageChanged2(CurPageID); CurPageChanged3(CurPageID); CurPageChanged4(CurPageID); end; procedure DeinitializeSetup(); begin disabledesc(); KillTimer(0, TimerID); end; |
| Всего записей: 1143 | Зарегистр. 06-08-2006 | Отправлено: 15:47 30-08-2011 | Исправлено: Raf_SE, 15:50 30-08-2011 |
|