Alloc,
saurn, текущее кол-во требуемого места можно выдрать из текста в WizardForm.ComponentsDiskSpaceLabel (да не быть мне извращенцем

)
при помощи самопальной function GetFloatFormText(const UndefText: String): String;
тк инсталл даже без секции файлов по дефолту всегда требует минимум 0.9 мб, то можно смело использовать функцию преобразования строки в Extended ( StrToFloat(...) )
для последующего сравнения свободного и требуемого места без боязни получить исключение конвертации нечисел в числа
вот полный пример динамичной(тк во время/в зависимости от выбора компонентов и текущего харда) проверки свободного места:
читать дальше »
Код:

[Setup]
AppName=My Program
AppVersion=1.5
DefaultDirName={pf}\My Program
DefaultGroupName=My Program
[Components]
// пусть этот клмпонент занимает много места для теста :)
Name: A; Description: 1; Flags: disablenouninstallwarning; ExtraDiskSpaceRequired: 564591185599
Name: B; Description: 2; Flags: disablenouninstallwarning; ExtraDiskSpaceRequired: 564591185
Name: C; Description: 2; Flags: disablenouninstallwarning; ExtraDiskSpaceRequired: 564591185
Name: D; Description: 4; Flags: disablenouninstallwarning; ExtraDiskSpaceRequired: 564591185
[Code]
var
OldCompListOnClickCheckProc: TNotifyEvent;
function GetFloatFormText(const UndefText: String): String; // число из строки
var
i: Integer;
begin
for i := 1 to Length(UndefText) do
case UndefText[i] of
'0','1','2','3','4','5','6','7','8','9': Result := Result + UndefText[i];
',': Result := Result + '.';
end;
end;
function GetFreeDriveSpace(const UndefInstallPath: String): Cardinal; // упрощённая функция получения свободного места из входного аргумента (из пути)
var
TotalMB: Cardinal;
begin
GetSpaceOnDisk(ExtractFileDrive(UndefInstallPath), True, Result, TotalMB);
end;
function ComapreSpace(): Boolean; // проверяем свободное место
var
UndefNeedSize, UndefFreeSize: Extended;
begin
UndefNeedSize := StrToFloat( GetFloatFormText(WizardForm.ComponentsDiskSpaceLabel.Caption) );
UndefFreeSize := Extended( GetFreeDriveSpace( WizardDirValue() ) );
Result := UndefFreeSize > UndefNeedSize;
if not Result then if MsgBox('На выбранном Вами жёстком диске не хватает' + #32 + FloatToStr(UndefNeedSize-UndefFreeSize) + #32 + 'MB' + #13#10 +
'Изменить директорию установки?', mbError, MB_YESNO) = IDYES then
begin
WizardForm.BackButton.OnClick(nil);
WizardForm.DirBrowseButton.OnClick(nil);
Result := True;
end;
end;
procedure ComponentsListOnClickCheck(Sender: TObject);
begin
OldCompListOnClickCheckProc( TNewCheckListBox(Sender) );
WizardForm.NextButton.Enabled := ComapreSpace();
//WizardForm.Caption := GetFloatFormText(WizardForm.ComponentsDiskSpaceLabel.Caption); // debug
end;
procedure InitializeWizard();
begin
OldCompListOnClickCheckProc := WizardForm.ComponentsList.OnClickCheck; // пишем указатель на старую/родную процедуру в переменную, чтоб делать с чеклистбоксом то что делает инно по умолчению в строке 61
WizardForm.ComponentsList.OnClickCheck := @ComponentsListOnClickCheck;
end;
procedure CurPageChanged(CurPageID: Integer);
begin
if CurPageID = wpSelectComponents then WizardForm.NextButton.Enabled := ComapreSpace();
end;