Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  

Показать сообщение отдельно

Аватара для Johny777

Ветеран


Сообщения: 649
Благодарности: 444

Профиль | Отправить PM | Цитировать


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;
Это сообщение посчитали полезным следующие участники:

Отправлено: 07:01, 30-03-2013 | #26