Chanka
Member | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору Люди добрые, пожалуйста, помогите. В этом коде на странице выбора директории отображаются локальные диски и количество свободного места. Так вот если места мало появляется сообщение типа установки требуется не менее столько-то мегабайт, а на выбранном диске доступно столько-то мегабайт. Дело в том, что количество мегабайт не совпадает. На странице установки показывает, допустим, C:\ 17% 3.232 GB, а если появляется сообщение о нехватке места то там 3310. Как это исправить? [Setup] AppName=SystemTest AppVerName=SystemTest <Version> DefaultDirName={pf32}\System Check [Files] Source: get_hw_caps.dll; Flags: dontcopy [Languages] Name: russian; MessagesFile: compiler:Languages\Russian.isl [Code] const oneMB = 1024*1024; BufferLen = 50; NeedSize = 20000; type TMemoryStatus = record dwLength, dwMemoryLoad, dwTotalPhys, dwAvailPhys, dwTotalPageFile, dwAvailPageFile, dwTotalVirtual, dwAvailVirtual: Longint; end; var Memory: TMemoryStatus; FreeMB, TotalMB: Cardinal; VolumeSerialNo, MaxComponentLength, FileSystemFlags: Longint; i: Integer; VolumeName, FileSystemName: String; ListBox: TListBox; hWnd: Integer; function MessageBox(hWnd: Integer; lpText, lpCaption: String; uType: Cardinal): Integer; external 'MessageBoxA@user32.dll stdcall'; function GetHardDriveFreeSpace(hdd: integer): Integer; external 'hwc_GetHardDriveFreeSpace@files:get_hw_caps.dll stdcall'; function GetHardDriveName(hdd: Integer): PChar; external 'hwc_GetHardDriveName@files:get_hw_caps.dll stdcall'; function GetHardDriveTotalSpace(hdd: integer): Integer; external 'hwc_GetHardDriveTotalSpace@files:get_hw_caps.dll stdcall'; function GetHardDrivesCount(): Integer; external 'hwc_GetHardDrivesCount@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 MorG(MB, onlyMB: Integer): String; // Значение в строку объёма Мб/Гб (Гб округлим до 3-ёх знаков после запятой) begin if (MB < 1000) or (onlyMB > 0) then Result:= IntToStr(MB)+ 'MB' else Result:= FloatToStr(round(MB/1024*1000)/1000)+ ' GB'; StringChange(Result, ',', '.') 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 InitializeWizard(); begin ListBox:= TListBox.Create(WizardForm) with ListBox do begin Color:= $EEEEEE; Font.Size:= 10; Font.Name:= 'Courier New'; Font.Style:=[fsBold]; Parent:= WizardForm.SelectDirPage; OnClick:= @ListBoxOnClick; Top:= WizardForm.DirEdit.Top +WizardForm.DirEdit.Height +ScaleY(30); Width:= WizardForm.DirEdit.Left + WizardForm.DirEdit.Width - WizardForm.DirEdit.Left; Height:= WizardForm.DiskSpaceLabel.Top -Top -9; FileSystemName:= StringOfChar(' ', BufferLen); VolumeName:= StringOfChar(' ', BufferLen); for i:=0 to GetHardDrivesCount-1 do begin GetSpaceOnDisk(GetHardDriveName(i), True, FreeMB, TotalMB); GetVolumeInformation(GetHardDriveName(i), VolumeName, BufferLen-1, VolumeSerialNo, MaxComponentLength, FileSystemFlags, FileSystemName, BufferLen-1); Items.Add(Copy(Uppercase(GetHardDriveName(i)),0,2) + '\' + Copy('',0,0-Length(MorG(TotalMB,0))) + Copy(' ',0,4-Length(IntToStr(round(FreeMB/TotalMB*100)))) + FloatToStr(round(FreeMB/TotalMB*100)) + '%' + Copy(' ',0,10-Length(MorG(FreeMB,0)))+ MorG(FreeMB,0)); end; end; with TNewStaticText.Create(WizardForm) do begin Top:= WizardForm.DirEdit.Top +WizardForm.DirEdit.Height +ScaleY(8); Caption:='Список локальных дисков, присутствующих в системе:'; Parent:= WizardForm.SelectDirPage; end; end; function NextButtonClick(CurPageID: Integer): Boolean; var Path,s: String; FreeMB, TotalMB: Cardinal; begin Result:= True; if CurPageID = wpSelectDir then begin Path:= ExtractFileDrive(WizardForm.DirEdit.Text); GetSpaceOnDisk(Path, True, FreeMB, TotalMB); if FreeMB < NeedSize then begin s:='Установка требует не менее '+ IntTostr(NeedSize)+ ' GB свободного места, а на '#13+' выбранном Вами диске доступно только '+ + IntToStr(FreeMB)+' MB'; hWnd := StrToInt(ExpandConstant('{wizardhwnd}')); MessageBox(hWnd, s, 'Недостаточно места на диске', MB_OK or $10) Result := False; end; end; end; |