Автор: Chanka
Дата сообщения: 28.06.2007 13:56
Люди добрые, пожалуйста, помогите. В этом коде на странице выбора директории отображаются локальные диски и количество свободного места. Так вот если места мало появляется сообщение типа установки требуется не менее столько-то мегабайт, а на выбранном диске доступно столько-то мегабайт. Дело в том, что количество мегабайт не совпадает. На странице установки показывает, допустим, 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;