Зачем добавлять нули? У меня в старом тесте на странице wpSelectDir выравниваются строки:
[more=Inno Check System Requirements (старая версия)]
#expr Exec("cmd /c echo #define DateTime '%DATE%' > DateTime.iss")
#include "DateTime.iss"
#expr DeleteFile("DateTime.iss")
#define VersionInfoTextVersion "сборка от "+ DateTime
[Setup]
AppName=Inno System Test by Dobrov
AppVerName=Inno System Test (old version!)
DefaultDirName={pf}\{#SetupSetting("AppName")}
VersionInfoTextVersion={#VersionInfoTextVersion}
[Files]
Source: compiler:get_hw_caps.dll; Flags: dontcopy
[Messages]
BeveledLabel=© Виктор Добров
FinishedHeadingLabel=Завершение установки [name]
RunEntryShellExec=Прочитать краткую справку.
AboutSetupMenuItem=Краткая справка...
AboutSetupNote=ПАРАМЕТРЫ КОМАНДНОЙ СТРОКИ:%n%n/SAVEINF="filename%n Сохранить параметры установки в файл%n/LOADINF="filename%n Загрузить параметры установки из файла%n/SILENT - ускоренный режим установки%n/NORESTART - Не выполнять перезагрузку
ExitSetupMessage=%nУстановка приостановлена. Если сейчас закрыть программу,%nвозможны непредсказуемые системные ошибки.%n%nВы действительно желаете прервать установку программы?
ComponentsDiskSpaceMBLabel=Текущий выбор требует не менее [mb] Мб
[CustomMessages]
ClickNext=Нажмите «Далее» для продолжения установки, или «Выход», чтобы выйти из программы установки.
[Languages]
Name: Russian; MessagesFile: compiler:Languages\Russian.isl
[LangOptions]
DialogFontName=Tahoma
DialogFontSize=9
WelcomeFontName=Arial
WelcomeFontSize=12
[Code]
const SmallBitmapWidth= 170; oneMB= 1024*1024; LightColor= $EEEEEE; GreenColor= $C0DCC0; RedColor= $CCCCFF; BufferLen= 32;
NeedMB= 100; NeedMHZ= 3500; NeedRAM= 128; NeedVRAM= 64; NeedSys= 5.0; NeedSp= 0; NeedSwap= 256; NeedProgram= 'Software\Microsoft\.NETFramework';
type TMemoryStatus = record dwLength, dwMemoryLoad, dwTotalPhys, dwAvailPhys, dwTotalPageFile, dwAvailPageFile, dwTotalVirtual, dwAvailVirtual: Longint; end;
var Check: Boolean; Memory: TMemoryStatus; FreeMB, TotalMB: Cardinal; VolumeSerialNo, MaxComponentLength, FileSystemFlags: Longint; i, CurPage, errorCode: Integer; VolumeName, FileSystemName, UpdateHint, UserSelectDir: String; CancelButton, InfoButton, UpdateButton: TButton; ListBox: TListBox; InfoPage: TWizardPage; CheckFolders: TCheckBox; System, SystemNamePanel, Processor, ProcessorName, VideoCardPanel, VideoCardName, AudioCardPanel, AudioCardName, RAMPanel, RAMSize, PageFilePanel, PageFileSize, NeedSoft, NeedSoftName, Hdd, HddSize, Folders, FoldersSize: TPanel;
procedure GlobalMemoryStatus(var lpBuffer: TMemoryStatus); external 'GlobalMemoryStatus@kernel32.dll';
function GetSystemMetrics(nIndex: Integer):Integer; external 'GetSystemMetrics@user32.dll stdcall';
function sndPlaySound(lpszSoundName: string; uFlags: cardinal):integer; external 'sndPlaySoundA@winmm.dll stdcall';
function GetHardDrivesCount: Integer; external 'hwc_GetHardDrivesCount@files:get_hw_caps.dll stdcall';
function GetHardDriveName(hdd: Integer): PChar; external 'hwc_GetHardDriveName@files:get_hw_caps.dll stdcall';
function GetSoundCards: Integer; external 'hwc_GetSoundCards@files:get_hw_caps.dll stdcall';
function GetSoundCardName: PChar; external 'hwc_GetSoundCardName@files:get_hw_caps.dll stdcall';
function GetSystemPage: Integer; external 'hwc_GetSystemPage@files:get_hw_caps.dll stdcall';
function GetVideoCardName: PChar; external 'hwc_GetVideoCardName@files:get_hw_caps.dll stdcall';
function GetVidMemLocal: Integer; external 'hwc_GetVidMemLocal@files:get_hw_caps.dll stdcall';
function GetVolumeInformation(PathName,VolumeName: PChar; VolumeNameSize,VolumeSerialNumber,MaxComponentLength,FileSystemFlags: Longint; FileSystemName: PChar; FileSystemNameSize: Longint): Longint; external 'GetVolumeInformationA@kernel32.dll stdcall';
Function CalcDirSize(const fromDir, fileMask: string; SubDirsAllow: Boolean): Extended; Var FSR, DSR: TFindRec; FindResult: Boolean;
Begin
FindResult:= FindFirst(AddBackslash(fromDir) + fileMask, FSR);
Try
while FindResult do
begin
if FSR.Attributes and FILE_ATTRIBUTE_DIRECTORY = 0 then if FSR.SizeLow > $7FFFFFFF then Result:= Result + FSR.SizeLow + $7FFFFFFF + $7FFFFFFF + 2 else Result:= Result + FSR.SizeLow
FindResult:= FindNext(FSR)
end;
FindResult:= FindFirst(AddBackslash(fromDir) + '*.*', DSR)
While FindResult and SubDirsAllow do
begin
if ((DSR.Attributes and FILE_ATTRIBUTE_DIRECTORY) = FILE_ATTRIBUTE_DIRECTORY) and not ((DSR.Name = '.') or (DSR.Name = '..')) then {Recursion} Result:= Result + CalcDirSize(AddBackslash(fromDir) + DSR.Name, fileMask, SubDirsAllow)
FindResult:= FindNext(DSR)
end;
Finally
FindClose(FSR); FindClose(DSR); end;
End;
Function MorG(MB: Integer; autoGB: Boolean): string; {Перевод числа в строку объёма Мб/Гб (до 3х знаков после запятой)}
Begin If (MB < 1000) or not autoGB then Result:= IntToStr(MB)+ 'Мб' else Result:= FloatToStr(round(MB/1024*1000)/1000)+ 'Гб'; StringChange(Result, ',', '.') End;
Procedure CheckFoldersOnClick(Sender: TObject);
Begin
if CheckFolders.State= cbChecked then begin
if (UpdateHint = '') or (InfoButton.Tag= 1) then begin
InfoButton.Caption:= 'Подсчёт папок...'; InfoButton.Cursor:= crAppStart; UpdateButton.Cursor:= crAppStart; CheckFolders.Cursor:= crAppStart;
if UserSelectDir='' then FoldersSize.Caption:=' Система: '+ MorG(Trunc(CalcDirSize(ExpandConstant('{%windir}'),'*',True)/oneMB),True) +' ('+ MorG(Trunc(CalcDirSize(ExpandConstant('{%windir}\Temp'),'*',True)/oneMB + CalcDirSize(ExpandConstant('{reg:HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders,Local Settings}\Temp'),'*',True)/oneMB),True) +' Temp), Браузер: ' + MorG(Trunc(CalcDirSize(ExpandConstant('{reg:HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders,Cache}'),'*',True)/oneMB),True)
else FoldersSize.Caption:=' ' +MorG(Trunc(CalcDirSize(UserSelectDir,'*',True)/oneMB),True)+ ' ...' +Copy(UserSelectDir, Length(UserSelectDir)-46, 46)
UpdateHint:=FoldersSize.Caption
end else FoldersSize.Caption:=UpdateHint;
InfoButton.Caption:= 'Скрыть сведения'; InfoButton.Cursor:= crDefault; UpdateButton.Cursor:= crDefault; UpdateButton.Hint:=UserSelectDir; CheckFolders.Cursor:= crHand;
CancelButton.Tag:= 1
end else
CancelButton.Tag:= 0
End;
Procedure UpdateButtonOnClick(Sender: TObject); var Version: TWindowsVersion; NoPass: Boolean; CpuMHZ: Cardinal;
Begin
Check:=True; RegQueryDWordValue(HKLM,'Hardware\Description\System\CentralProcessor\0','~MHz',CpuMHZ); GetWindowsVersionEx(Version); GlobalMemoryStatus(Memory); GetSpaceOnDisk(ExpandConstant('{sd}'),True,FreeMB,TotalMB); VolumeName:= StringOfChar(' ', BufferLen); FileSystemName:= StringOfChar(' ', BufferLen); GetVolumeInformation(ExpandConstant('{sd}\'), VolumeName, BufferLen-1, VolumeSerialNo, MaxComponentLength, FileSystemFlags, FileSystemName, BufferLen-1);
with System do begin
Caption:= ' О системе'; Color:= LightColor; Parent:= InfoPage.Surface;
Top:= ScaleY(12); Width:= ScaleX(114); Height:= ScaleY(24); BevelOuter:= bvLowered; end;
with SystemNamePanel do begin //Windows versions
Caption:=ExpandConstant('{reg:HKLM\Software\Microsoft\Windows NT\CurrentVersion,ProductName} ') + ExpandConstant('{reg:HKLM\Software\Microsoft\Windows NT\CurrentVersion,CSDVersion} ') +'сборка ' +IntToStr(Version.Major) +'.' +IntToStr(Version.Minor);
If Pos('Microsoft', Caption) > 0 Then Caption:=Copy(Caption, 10, 45);
Top:= System.Top; Left:= System.Left + System.Width -2; Width:= ScaleX(305); Height:= System.Height; Parent:= InfoPage.Surface; BevelOuter:= bvLowered; Alignment:=taLeftJustify; Color:= GreenColor; Hint:='Свойства системы'; ShowHint:=True; Cursor:= crHand;
If (NeedSys*10 > (Version.Major*10 +Version.Minor)) or (NeedSp >Version.ServicePackMajor) then begin Caption:= Caption + ' (< ' +FloatToStr(NeedSys)+ ' SP' +IntToStr(NeedSp) + ')'; Color:= RedColor; NoPass:= True; end else Caption:= Caption + '.' + IntToStr(Version.Build); end;
with Processor do begin
Caption:= ' Процессор'; Color:= System.Color; Parent:= InfoPage.Surface;
Top:= System.Top + System.Height - 2; Left:= System.Left; Width:= System.Width; Height:= System.Height; BevelOuter:= bvLowered; end;
with ProcessorName do begin //CPU
Caption:=' '+ Trim(ExpandConstant('{reg:HKLM\Hardware\Description\System\CentralProcessor\0,ProcessorNameString}'))+ ' ' +FloatToStr(CpuMHZ/1000) +'GHz'
Top:= Processor.Top; Left:= SystemNamePanel.Left; Width:= SystemNamePanel.Width; Height:= System.Height; BevelOuter:= bvLowered; Parent:= InfoPage.Surface; Alignment:=taLeftJustify; Color:= GreenColor; Hint:='Управление компьютером'; ShowHint:=True; Cursor:= crHand;
if CpuMHZ < NeedMHZ then begin Caption:= Caption + ' (< ' + FloatToStr(round(NeedMHZ)/1000)+ ')'; Color:= RedColor; NoPass:= True; end; end;
with RAMPanel do begin
Caption:=' Объём памяти'; Color:= System.Color; Parent:= InfoPage.Surface;
Top:=Processor.Top + System.Height - 2; Left:= System.Left; Width:= System.Width; Height:= System.Height; BevelOuter:= bvLowered; end;
with RAMSize do begin //RAM
Caption:=' '+MorG(round(Memory.dwTotalPhys/oneMB/64)*64,False) +' всего, '+ MorG(Memory.dwAvailPhys/oneMB,False) +' свободно, '
Top:=RAMPanel.Top; Left:= SystemNamePanel.Left; Width:= SystemNamePanel.Width; Height:= System.Height; BevelOuter:= bvLowered; Parent:= InfoPage.Surface; Alignment:=taLeftJustify; Color:= GreenColor; Hint:='Учетные записи пользователей'; ShowHint:=True; Cursor:= crHand;
if round(Memory.dwTotalPhys/oneMB/64)*64 < NeedRAM then begin Caption:= Caption + 'требуется ' + MorG(NeedRAM,False); Color:= RedColor; NoPass:= True; end else Caption:= Caption +MorG((Memory.dwTotalPhys - Memory.dwAvailPhys)/oneMB,False) +' используется'; end;
with VideoCardPanel do begin
Caption:=' Видеоадаптер'; Color:= System.Color; Parent:= InfoPage.Surface;
Top:=RAMPanel.Top + System.Height - 2; Left:= System.Left; Width:= System.Width; Height:= System.Height; BevelOuter:= bvLowered; end;
with VideoCardName do begin //Video
Caption:= ' ' + Trim(GetVideoCardName)+ ', '+ MorG(round(GetVidMemLocal/oneMB/64)*64,False);
Top:=VideoCardPanel.Top; Left:= SystemNamePanel.Left; Width:= SystemNamePanel.Width; Height:= System.Height; BevelOuter:= bvLowered; Parent:= InfoPage.Surface; Alignment:=taLeftJustify; Color:= GreenColor; Hint:='Свойства: Экран'; ShowHint:=True; Cursor:= crHand;
if round(GetVidMemLocal/oneMB/64)*64 < NeedVRAM then begin Caption:= Caption + ' (< ' + MorG(NeedVRAM,False)+ ')'; Color:= RedColor; NoPass:= True; end;
Caption:= Caption + ', '+ IntToStr(GetSystemMetrics(0)) + 'x' +IntToStr(GetSystemMetrics(1)); end;
with AudioCardPanel do begin
Caption:=' Звуковая карта'; Color:= System.Color; Parent:= InfoPage.Surface;
Top:=VideoCardPanel.Top + System.Height - 2; Left:= System.Left; Width:= System.Width; Height:= System.Height; BevelOuter:= bvLowered; end;
with AudioCardName do begin //Sound card
if Pos('SB', UpperCase(GetSoundCardName)) > 0 then Caption:=' Creative Sound Blaster ' +Copy(GetSoundCardName,Pos('SB', UpperCase(GetSoundCardName))+3,Length(GetSoundCardName)) else Caption:=' '+GetSoundCardName + ' (рекомендуется Creative X-Fi)'
Top:=AudioCardPanel.Top; Left:= SystemNamePanel.Left; Width:= SystemNamePanel.Width; Height:= System.Height; BevelOuter:= bvLowered; Parent:= InfoPage.Surface; Alignment:=taLeftJustify; Color:= GreenColor; Hint:='Звуки и аудиоустройства'; ShowHint:=True; Cursor:= crHand;
if GetSoundCards = 0 then begin Caption:=' Устройство не обнаружено'; Color:= RedColor; NoPass:= True; end; end;
with NeedSoft do begin
Caption:=' Программы'; Color:= System.Color; Parent:= InfoPage.Surface;
Top:=AudioCardPanel.Top + System.Height - 2; Left:= System.Left; Width:= System.Width; Height:= System.Height; BevelOuter:= bvLowered; end;
with NeedSoftName do begin //Check Registry key
Top:=NeedSoft.Top; Left:= SystemNamePanel.Left; Width:= SystemNamePanel.Width; Height:= System.Height; BevelOuter:= bvLowered; Parent:= InfoPage.Surface; Alignment:=taLeftJustify; Color:= GreenColor; Hint:='Установка и удаление программ'; ShowHint:=True; Cursor:= crHand;
if RegKeyExists(HKLM, NeedProgram)= true then Caption:=' Пакет Microsoft .NET Framework установлен' else begin Caption:=' Требуется установить Microsoft .NET Framework'; Color:= RedColor; NoPass:= True; end; end;
with PageFilePanel do begin
Caption:=' Файл подкачки'; Color:= System.Color; Parent:= InfoPage.Surface;
Top:=NeedSoft.Top + System.Height - 2; Left:= System.Left; Width:= System.Width; Height:= System.Height; BevelOuter:= bvLowered; end;
with PageFileSize do begin //Virtual memory
Caption:=' '+MorG(GetSystemPage,False)+' всего, ';
Top:=PageFilePanel.Top; Left:= SystemNamePanel.Left; Width:= SystemNamePanel.Width; Height:= System.Height; BevelOuter:= bvLowered; Parent:= InfoPage.Surface; Alignment:=taLeftJustify; Color:= GreenColor; Hint:='Быстродействие'; ShowHint:=True; Cursor:= crHand;
if GetSystemPage < NeedSwap then begin Caption:= Caption + 'требуется не менее '+ MorG(NeedSwap,False); Color:= RedColor; NoPass:= True; end else Caption:= Caption + MorG((Memory.dwTotalPageFile - Memory.dwAvailPageFile)/oneMB,True) +' занято системным кэшем'; end;
with Hdd do begin
Caption:=' Системный диск'; Color:= System.Color; Parent:= InfoPage.Surface;
Top:=PageFilePanel.Top + System.Height - 2; Left:= System.Left; Width:= System.Width; Height:= System.Height; BevelOuter:= bvLowered; end;
with HddSize do begin //System drive
Caption:=' '+ MorG(TotalMB,True)+ ' всего, '+ IntToStr(round((TotalMB-FreeMB)/TotalMB*100))+ '% занято, '+ MorG(FreeMB,True)+ ' свободно';
Top:=Hdd.Top; Left:= SystemNamePanel.Left; Width:= SystemNamePanel.Width; Height:= System.Height; BevelOuter:= bvLowered; Parent:= InfoPage.Surface; Alignment:=taLeftJustify; Color:= GreenColor; Hint:='Очистка диска'; ShowHint:=True; Cursor:= crHand;
if FreeMB < NeedMB then begin Caption:= Caption +' (< '+ MorG(NeedMB,True)+ ')'; Color:= RedColor; NoPass:= True; end else Caption:= Caption +', '+ Trim(FileSystemName); end;
with Folders do begin
Color:= System.Color; Parent:= InfoPage.Surface;
Top:=Hdd.Top + System.Height -2; Left:= System.Left; Width:= System.Width; Height:= System.Height; BevelOuter:= bvLowered; end;
CheckFolders:= TCheckBox.Create(InfoPage);
with CheckFolders do begin
OnClick:= @CheckFoldersOnClick; Hint:='Подсчёт размера папок займёт некоторое время...'; ShowHint:=True; if CancelButton.Tag= 0 then State:= cbUnChecked else State:= cbChecked;
Caption:='Объём папок'; Color:= System.Color; Parent:= InfoPage.Surface; BringToFront; Cursor:= crHand; Top:=Folders.Top +ScaleY(5); Left:= System.Left +ScaleX(10); Width:= System.Width -ScaleX(15); end;
with FoldersSize do begin //calculate Size of User Folders
if CheckFolders.State= cbUnChecked then if UserSelectDir='' then Caption:=' Система: '+ ExpandConstant('{%windir}') +', Temporary Internet Files' else Caption:=' ...' + Copy(UserSelectDir, Length(UserSelectDir)-50, 50)
Top:=Folders.Top; Left:= SystemNamePanel.Left; Width:= SystemNamePanel.Width; Height:= System.Height; BevelOuter:= bvLowered; Parent:= InfoPage.Surface; Alignment:=taLeftJustify; Color:= GreenColor; Hint:='Щёлкните здесь для подсчёта размера другой папки...'; ShowHint:=True; Cursor:= crHand; end;
with TPanel.Create(InfoPage) do begin Parent:= InfoPage.Surface; BevelOuter:= bvLowered; Top:=System.Top; Height:= (System.Height-2)*9+2; Left:= SystemNamePanel.Left + SystemNamePanel.Width -2; end; with TPanel.Create(InfoPage) do begin Parent:= InfoPage.Surface; BevelOuter:= bvLowered; Top:=Folders.Top + System.Height -2; Left:= System.Left - 25; Width:= WizardForm.ClientWidth; end; with TPanel.Create(InfoPage) do begin Parent:= InfoPage.Surface; BevelOuter:= bvNone; Top:=System.Top; Height:= (System.Height-2)*9+2; Left:= SystemNamePanel.Left + SystemNamePanel.Width-1; end;
with TPanel.Create(InfoPage) do begin Parent:= InfoPage.Surface; BevelOuter:= bvNone; Top:=System.Top; Left:= System.Left; Height:= 1; Width:= 1; end; with TPanel.Create(InfoPage) do begin Parent:= InfoPage.Surface; BevelOuter:= bvNone; Top:=System.Top; Left:= SystemNamePanel.Left + SystemNamePanel.Width -2; Height:= 1; Width:= 1; end; with TPanel.Create(InfoPage) do begin Parent:= InfoPage.Surface; BevelOuter:= bvNone; Top:=Folders.Top + System.Height -2; Left:= System.Left; Height:= 1; Width:= 1; end; with TPanel.Create(InfoPage) do begin Parent:= InfoPage.Surface; BevelOuter:= bvNone; Top:=Folders.Top + System.Height -2; Left:= SystemNamePanel.Left + SystemNamePanel.Width -2; Height:= 1; Width:= 1; end;
if NoPass then begin WizardForm.PageDescriptionLabel.Font.Color:=$402080 InfoPage.Description:='Не все компоненты соответствуют требованиям программы, проверьте позиции, выделеные красным!' end;
End;
Procedure CloseInfo; Begin If InfoButton.Tag= 1 then InfoButton.OnClick(InfoButton) End;
Function BackButtonClick(CurPageID: Integer): Boolean; Begin Result:= True CloseInfo End;
Function NextButtonClick(CurPageID: Integer): Boolean;
Begin If InfoButton.Tag= 1 then else Result:= True
if (i =wpWelcome) and (InfoButton.Tag= 1) then Result:= True
CloseInfo
if (CurPageID = wpWelcome) and Not(Check) then begin InfoButton.OnClick(InfoButton) Result:= False end
End;
Procedure CancelButtonClick(CurPageID: Integer; var Cancel, Confirm: Boolean); //С началом установки включаем подтверждение при нажатии на кнопку 'Отмена'
Begin If CurPageID <> wpInstalling then Confirm:= False End;
procedure ListBoxOnClick(Sender: TObject);
Begin for i:= 0 to ListBox.Items.Count-1 do if ListBox.Selected[i] then WizardForm.DirEdit.Text:= Copy(ListBox.Items[i],1,1) +Copy(WizardForm.DirEdit.Text, 2, Length(WizardForm.DirEdit.Text)); End;
Procedure DirOnClick(Sender: TObject);
Begin UserSelectDir:= WizardForm.DirEdit.Text If BrowseForFolder('Выберите папку для установки или создайте новую', UserSelectDir, True) then WizardForm.DirEdit.Text:= UserSelectDir End;
Procedure SystemNamePanelOnClick(Sender: TObject);
Begin Exec(ExpandConstant('{sys}\rundll32.exe'), 'shell32.dll, Control_RunDLL sysdm.cpl', '', sw_Hide, ewWaitUntilTerminated, errorCode); UpdateButton.OnClick(UpdateButton); End;
Procedure ProcessorNameOnClick(Sender: TObject);
Begin ShellExec('open', ExpandConstant('{sys}\compmgmt.msc'), '', '', sw_Show, ewWaitUntilTerminated, errorCode); UpdateButton.OnClick(UpdateButton); End;
Procedure RAMSizeOnClick(Sender: TObject);
Begin Exec(ExpandConstant('{sys}\control.exe'), 'userpasswords2', '', sw_Hide, ewNoWait, errorCode) End;
Procedure VideoCardNameOnClick(Sender: TObject);
Begin Exec(ExpandConstant('{sys}\control.exe'), 'desk.cpl,,3', '', sw_Hide, ewWaitUntilTerminated, errorCode); UpdateButton.OnClick(UpdateButton); End;
Procedure AudioCardNameOnClick(Sender: TObject);
Begin Exec(ExpandConstant('{sys}\control.exe'), 'mmsys.cpl', '', sw_Hide, ewNoWait, errorCode) End;
Procedure NeedSoftNameOnClick(Sender: TObject);
Begin Exec(ExpandConstant('{sys}\control.exe'), 'appwiz.cpl', '', sw_Hide, ewNoWait, errorCode) End;
Procedure PageFileSizeOnClick(Sender: TObject);
Begin Exec(ExpandConstant('{sys}\rundll32.exe'), 'shell32.dll, Control_RunDLL sysdm.cpl,,3', '', sw_Hide, ewWaitUntilTerminated, errorCode); UpdateButton.OnClick(UpdateButton); End;
Procedure HddSizeOnClick(Sender: TObject);
Begin ShellExec('open', ExpandConstant('{sys}\cleanmgr.exe'), '', '', sw_Show, ewWaitUntilTerminated, errorCode); UpdateButton.OnClick(UpdateButton); End;
Procedure FoldersSizeOnClick(Sender: TObject);
Begin if BrowseForFolder('Выберите папку для подсчёта её размера:', UserSelectDir, False) then begin CheckFolders.State:= cbUnChecked; CheckFolders.State:= cbChecked; end End;
Procedure InfoButtonOnClick(Sender: TObject);
Begin
if InfoButton.Tag= 0 then begin
InfoPage:= CreateCustomPage(CurPage, 'Проверка системных требований', 'Все компоненты соответствуют требованиям программы')
System:=TPanel.Create(InfoPage); SystemNamePanel:=TPanel.Create(InfoPage); SystemNamePanel.OnClick:= @SystemNamePanelOnClick
Processor:=TPanel.Create(InfoPage); ProcessorName:=TPanel.Create(InfoPage); ProcessorName.OnClick:= @ProcessorNameOnClick
RAMPanel:=TPanel.Create(InfoPage); RAMSize:=TPanel.Create(InfoPage); RAMSize.OnClick:= @RAMSizeOnClick
VideoCardPanel:=TPanel.Create(InfoPage); VideoCardName:=TPanel.Create(InfoPage); VideoCardName.OnClick:= @VideoCardNameOnClick
AudioCardPanel:=TPanel.Create(InfoPage); AudioCardName:=TPanel.Create(InfoPage); AudioCardName.OnClick:= @AudioCardNameOnClick
NeedSoft:=TPanel.Create(InfoPage); NeedSoftName:=TPanel.Create(InfoPage); NeedSoftName.OnClick:= @NeedSoftNameOnClick
PageFilePanel:=TPanel.Create(InfoPage); PageFileSize:=TPanel.Create(InfoPage); PageFileSize.OnClick:= @PageFileSizeOnClick
Hdd:=TPanel.Create(InfoPage); HddSize:=TPanel.Create(InfoPage); HddSize.OnClick:= @HddSizeOnClick
Folders:=TPanel.Create(InfoPage); FoldersSize:=TPanel.Create(InfoPage); FoldersSize.OnClick:= @FoldersSizeOnClick;
UpdateButton:= TButton.Create(WizardForm);
with UpdateButton do begin Top:= CancelButton.Top; Left:= InfoButton.Left + InfoButton.Width; Width:= CancelButton.Width; Caption:= 'Обновить'; OnClick:= @UpdateButtonOnClick; Parent:= WizardForm; Hint:=UserSelectDir; ShowHint:=True; end;
UpdateButton.OnClick(UpdateButton);
WizardForm.NextButton.OnClick(WizardForm.NextButton);
InfoButton.Caption:= 'Скрыть сведения'; InfoButton.Cursor:= crDefault; InfoButton.Tag:= 1;
end else begin
InfoButton.Caption:= 'О системе'; InfoButton.Cursor:= crHelp; InfoButton.Tag:= 0;
WizardForm.BackButton.OnClick(WizardForm.BackButton);
WizardForm.PageDescriptionLabel.Font.Color:= WizardForm.PageNameLabel.Font.Color
UpdateButton.Free
InfoPage.Free
end
End;
Procedure CurPageChanged(CurPageID: Integer);
Begin
i:=CurPage; CurPage:= CurPageID
If WizardForm.FindComponent('CancelButton') is TButton then CancelButton.Caption:= 'Выход';
case CurPageID of
wpWelcome: sndPlaySound(ExpandConstant('{win}\Media\start.wav'), 1)
wpSelectDir: begin
with ListBox do begin Parent:= WizardForm.SelectDirPage; Items.Clear; Color:= $EEEEEE; Font.Size:= 9; Font.Name:= 'Courier New'; OnClick:= @ListBoxOnClick; Top:= WizardForm.DirEdit.Top +WizardForm.DirEdit.Height +ScaleY(30); Width:= WizardForm.DirBrowseButton.Left + WizardForm.DirBrowseButton.Width - WizardForm.DirEdit.Left; Height:= WizardForm.DiskSpaceLabel.Top -Top -9;
for i:=0 to GetHardDrivesCount-1 do begin VolumeName:= StringOfChar(' ', BufferLen); FileSystemName:= StringOfChar(' ', BufferLen); GetSpaceOnDisk(GetHardDriveName(i), True, FreeMB, TotalMB); GetVolumeInformation(GetHardDriveName(i), VolumeName, BufferLen-1, VolumeSerialNo, MaxComponentLength, FileSystemFlags, FileSystemName, BufferLen-1); if Trim(VolumeName)='' then VolumeName:='без метки';
Items.Add(Copy(Uppercase(GetHardDriveName(i)),0,2)+ PadL(MorG(TotalMB,True),11) +' всего| '+ PadL(MorG(FreeMB,True),9)+ PadL(FloatToStr(round(FreeMB/TotalMB*100)),4)+ '% своб| '+ PadL(Trim(FileSystemName),5)+ '| '+ Trim(VolumeName)); end; end; end
wpInstalling: begin CancelButton.Caption:= 'Прервать' InfoButton.Visible:= False end;
wpFinished: sndPlaySound(ExpandConstant('{win}\Media\tada.wav'), 1) end;
End;
Procedure InitializeWizard;
Begin
CancelButton:= WizardForm.CancelButton;
InfoButton:= TButton.Create(WizardForm);
with InfoButton do begin Left:= WizardForm.ClientWidth - CancelButton.Left - CancelButton.Width; Top:= CancelButton.Top; Width:= CancelButton.Width +ScaleX(20); Height:= CancelButton.Height; Caption:= 'О системе'; Hint:='Проверка системных требований'; ShowHint:=True; OnClick:= @InfoButtonOnClick; Parent:= WizardForm; end;
with WizardForm.PageNameLabel do begin Top:= Top - 2; Left:=Left - 4; Width:= Width -i + 16; end;
with WizardForm.PageDescriptionLabel do begin Top:= Top -2; Left:=Left -10; Width:= Width -i +24; end;
with WizardForm.TypesCombo do begin Width:= ScaleX(170); Top:= WizardForm.SelectComponentsLabel.Top; end;
with WizardForm.ComponentsList do begin Top:=1 + WizardForm.TypesCombo.Top + WizardForm.TypesCombo.Height; Height:=ScaleY(18) + WizardForm.ComponentsDiskSpaceLabel.Top -Top; end;
with WizardForm.ComponentsDiskSpaceLabel do begin Top:=3; Left:=ScaleX(20) + WizardForm.TypesCombo.Width; end;
WizardForm.SelectComponentsLabel.Visible:= False;
WizardForm.DirBrowseButton.OnClick:= @DirOnClick;
ListBox:= TListBox.Create(WizardForm)
with TNewStaticText.Create(WizardForm) do begin Top:= WizardForm.DirEdit.Top +WizardForm.DirEdit.Height +ScaleY(8); Font.Name:= 'Lucida Sans Unicode'; Caption:='Список локальных дисков, присутствующих в системе:'; Parent:= WizardForm.SelectDirPage; end;
End;
[/more]
Corona Skin & Check System Requirements - обложка для Inno Setup с проверкой системных требований.
Проверка оборудования, версий Windows и ServicePack, объёма папок, ключа реестра...
При несоответствии минимальным требованиям пользователю сообщается об этом после 'Приветствия'.
Дополнения: Автонастройка на приложение; Расширенная локализация; В инсталлятор вписывается дата сборки; Защита от многократного запуска и запрос деинсталляции установленного приложения (без диалогов в режиме /SILENT).
Управление: Путь установки и название группы можно сменить, щёлкнув значок на wpSelectDir и wpSelectProgramGroup. Клик по компоненту в таблице открывает его свойства; Клик на имени папки позволяет сменить текущую папку; Клик с нажатой Shift открывает текущую папку в Проводнике. Правый клик на кнопке 'О системе' показывает минимальные системные требования для данной программы; Правый клик на кнопке 'Закрыть' перезапускает тест. Правый клик на кнопке 'Выход' закрывает инсталлятор без подтверждения (кроме wpInstalling).
Данная обложка добавляет к объёму инсталлятора ~190 Кб (можно получить ~80Кб, удалив Copy.avi, ошибок не будет, но и анимации на wpInstalling тоже
).