Вопрос Как переназначить единицу измерения?

Natrix

Новичок
Всем доброго времени суток.
Подскажите пожалуйста как в данном скрипте назначить за единицу измерения ГБ вместо МБ?
И как отображать не только целые числа но и скажем до сотых.
т.е. не Free: 150250МB а Free: 150.25GB

Код:
const
NeedSize = add size to MB;
DRIVE_UNKNOWN = 0;
DRIVE_NO_ROOT_DIR = 1;
DRIVE_REMOVEABLE = 2;
DRIVE_FIXED = 3;
DRIVE_REMOTE = 4;
    
DRIVE_CDROM = 5;
DRIVE_RAMDISK = 6;
function GetLogicalDrives: DWORD;
external 'GetLogicalDrives@kernel32.dll stdcall';
function GetDriveType(nDrive: String): Longint;
external 'GetDriveTypeA@kernel32.dll stdcall';
procedure InitializeWizard();
var
Path: String;
FreeMB, TotalMB: Cardinal;
ListBox: TListBox;
drives: DWORD;
i: integer;
begin
ListBox:= TListBox.Create(WizardForm);
ListBox.Top:= 120;
ListBox.Width:= 300;
ListBox.Height:= ScaleY(90);
ListBox.Parent:= WizardForm.SelectDirPage;
drives:= GetLogicalDrives();
for i:= 0 to 31 do
begin
if (drives and (1 shl i)) > 0 then
begin
Path:= chr(ord('A')+i)+':';
if GetDriveType(Path) = DRIVE_FIXED then
begin
GetSpaceOnDisk(Path, True, FreeMB, TotalMB);
    
ListBox.Items.Add(Path + ' - Total: ' + IntToStr(TotalMB) +
'MB - Free: ' + IntToStr(FreeMB) + 'MB');
end;
end;
end;
end;
function NextButtonClick(CurPageID: Integer): Boolean;
var
Path: 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
MsgBox('Alarm info', mbInformation, MB_OK)
Result:= False;
end;
end;
end;
 
Последнее редактирование:

Ramiro Cruzo

Новичок
Natrix, Используйте следующую функцию...

Код:
Function MbOrTb(Byte: Extended): String;
begin
if Byte < 1024 then Result:= NumToStr(Byte) + ' Ìá' else
  if Byte/1024 < 1024 then Result:= NumToStr(round(Byte/1024*100)/100) + ' Gb' else
     Result:= NumToStr(round((Byte/(1024*1024))*100)/100) + ' Òá'
end;
 

Natrix

Новичок
Natrix, Используйте следующую функцию...

Код:
Function MbOrTb(Byte: Extended): String;
begin
if Byte < 1024 then Result:= NumToStr(Byte) + ' Ìá' else
  if Byte/1024 < 1024 then Result:= NumToStr(round(Byte/1024*100)/100) + ' Gb' else
     Result:= NumToStr(round((Byte/(1024*1024))*100)/100) + ' Òá'
end;
Код:
function MbOrTb(Byte: Extended): String;
Ошибка: Identifier expected.
Можно пожалуйста в виде вставки в скрипт, т.е. как правильно применить?
 
Последнее редактирование:

Ramiro Cruzo

Новичок
Код:
GetSpaceOnDisk(Drive, True, FreeMB, TotalMB);
TotalSpaceLabel.Caption:= ExpandConstant('{cm:TotalSpace} ')+MbOrTb(TotalMB);
FreeSpaceLabel.Caption:= ExpandConstant('{cm:FreeSpace} ') + MbOrTB(FreeMb) + ' (' + IntToStr((FreeMb*100) div TotalMB) + ' %)';
NeedSpaceLabel.Caption := ExpandConstant('{cm:NeedSpace} ') + MbOrTb(SizeInt);
 

Natrix

Новичок
Код:
GetSpaceOnDisk(Drive, True, FreeMB, TotalMB);
TotalSpaceLabel.Caption:= ExpandConstant('{cm:TotalSpace} ')+MbOrTb(TotalMB);
FreeSpaceLabel.Caption:= ExpandConstant('{cm:FreeSpace} ') + MbOrTB(FreeMb) + ' (' + IntToStr((FreeMb*100) div TotalMB) + ' %)';
NeedSpaceLabel.Caption := ExpandConstant('{cm:NeedSpace} ') + MbOrTb(SizeInt);
Спасибо, но вы даёте "часть рассказа тому кто не умеет читать".
Можно пожалуйста в виде откорректированного скрипта из первого сообщения, если конечно у вас будет время и желание?
 
Последнее редактирование:

Ramiro Cruzo

Новичок
Haha...Простите меня ... Вот, попробуйте это:

Код:
const
NeedSize = add size to MB;
DRIVE_UNKNOWN = 0;
DRIVE_NO_ROOT_DIR = 1;
DRIVE_REMOVEABLE = 2;
DRIVE_FIXED = 3;
DRIVE_REMOTE = 4;
   
DRIVE_CDROM = 5;
DRIVE_RAMDISK = 6;
function GetLogicalDrives: DWORD;
external 'GetLogicalDrives@kernel32.dll stdcall';
function GetDriveType(nDrive: String): Longint;
external 'GetDriveTypeA@kernel32.dll stdcall';
procedure InitializeWizard();
var
Path: String;
FreeMB, TotalMB: Cardinal;
ListBox: TListBox;
drives: DWORD;
i: integer;
begin
ListBox:= TListBox.Create(WizardForm);
ListBox.Top:= 120;
ListBox.Width:= 300;
ListBox.Height:= ScaleY(90);
ListBox.Parent:= WizardForm.SelectDirPage;
drives:= GetLogicalDrives();
for i:= 0 to 31 do
begin
if (drives and (1 shl i)) > 0 then
begin
Path:= chr(ord('A')+i)+':';
if GetDriveType(Path) = DRIVE_FIXED then
begin
GetSpaceOnDisk(Path, True, FreeMB, TotalMB);
   
ListBox.Items.Add(Path + ' - Total: ' + MbOrTb(TotalMB) +
' Free: ' + MbOrTb(FreeMB));
end;
end;
end;
end;
function NextButtonClick(CurPageID: Integer): Boolean;
var
Path: 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
MsgBox('Alarm info', mbInformation, MB_OK)
Result:= False;
end;
end;
end;
Кроме того, убедитесь, что вы используете Inno Enhanced :)
 

Natrix

Новичок
... Вот, попробуйте это:
Код:
const
NeedSize = add size to MB;
DRIVE_UNKNOWN = 0;
DRIVE_NO_ROOT_DIR = 1;
DRIVE_REMOVEABLE = 2;
DRIVE_FIXED = 3;
DRIVE_REMOTE = 4;

DRIVE_CDROM = 5;
DRIVE_RAMDISK = 6;
function GetLogicalDrives: DWORD;
external 'GetLogicalDrives@kernel32.dll stdcall';
function GetDriveType(nDrive: String): Longint;
external 'GetDriveTypeA@kernel32.dll stdcall';
procedure InitializeWizard();
var
Path: String;
FreeMB, TotalMB: Cardinal;
ListBox: TListBox;
drives: DWORD;
i: integer;
begin
ListBox:= TListBox.Create(WizardForm);
ListBox.Top:= 120;
ListBox.Width:= 300;
ListBox.Height:= ScaleY(90);
ListBox.Parent:= WizardForm.SelectDirPage;
drives:= GetLogicalDrives();
for i:= 0 to 31 do
begin
if (drives and (1 shl i)) > 0 then
begin
Path:= chr(ord('A')+i)+':';
if GetDriveType(Path) = DRIVE_FIXED then
begin
GetSpaceOnDisk(Path, True, FreeMB, TotalMB);

ListBox.Items.Add(Path + ' - Total: ' + MbOrTb(TotalMB) +
' Free: ' + MbOrTb(FreeMB));
end;
end;
end;
end;
function NextButtonClick(CurPageID: Integer): Boolean;
var
Path: 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
MsgBox('Alarm info', mbInformation, MB_OK)
Result:= False;
end;
end;
end;
ListBox.Items.Add(Path + ' - Total: ' + MbOrTb(TotalMB) +
Ошибка: Unknown identifier 'MbOrTb'
Может такой вариант будет для редактирования проще. Надо только что бы сокращал не до десятых, а до сотых и всё.
Код:
var
TotalSpaceLabel, FreeSpaceLabel, NeedSpacelabel, InstallSpaceLabel: TLabel;
FreeMB, TotalMB: Cardinal;

function NumToStrHDD(Float: Extended): String;
begin
Result:= format('%.2n', [Float]); StringChange(Result, ',', '.');
while (Result[Length(Result)] = '0')or((Result[Length(Result)] = '.')and(Pos('.', Result) > 0)) do
SetLength(Result, Length(Result)-1);
end;

function MbOrTb(Float: Extended): String;
begin
if Float < 1024 then Result:= NumToStr(Float)+' MB' else
if Float/1024 < 1024 then Result:= NumToStr(Float/1024)+' GB' else
Result:= NumToStr(Float/(1024*1024))+' TB';
end;

procedure DirEditOnChange(Sender: TObject);
var Drive: String;
begin
Drive:= ExtractFileDrive(WizardForm.DirEdit.Text);
GetSpaceOnDisk(Drive, True, FreeMB, TotalMB);
TotalSpaceLabel.Caption:= ExpandConstant('{cm:TotalSpace} ')+MbOrTb(TotalMB);
FreeSpaceLabel.Caption:= ExpandConstant('{cm:FreeSpace} ')+MbOrTb(FreeMB)+' ('+IntToStr(round(FreeMB*100/TotalMB))+'% )';
InstallSpacelabel.Caption:= ExpandConstant('{cm:InstallSpace} ')+MbOrTb({#NeedInstallSize});
NeedSpaceLabel.Caption:= ExpandConstant('{cm:NeedSpace} ')+MbOrTb({#NeedSize});
 
Последнее редактирование:

Nemko

Дилетант
Модератор
Измени строку на:

Result:= format('%.0n', [Float]); StringChange(Result, ',', '.'); Целые
Result:= format('%.1n', [Float]); StringChange(Result, ',', '.'); Десятые
Result:= format('%.2n', [Float]); StringChange(Result, ',', '.'); Сотые
Result:= format('%.3n', [Float]); StringChange(Result, ',', '.'); Тысячные

Или я не туда попал :D.

P.S. Да кстати в коде в function MbOrTb идет строка if Float/1024 < 1024 then Result:= NumToStr(Float/1024)+' GB' else, а функции такой нет NumToStr. Зато есть function NumToStrHDD мне кажется надо переименовать ее в NumToStr.
 
Последнее редактирование:

SBalykov

Старожил
Измени строку на:

Result:= format('%.0n', [Float]); StringChange(Result, ',', '.'); Целые
Result:= format('%.1n', [Float]); StringChange(Result, ',', '.'); Десятые
Result:= format('%.2n', [Float]); StringChange(Result, ',', '.'); Сотые
Result:= format('%.3n', [Float]); StringChange(Result, ',', '.'); Тысячные

Или я не туда попал :D.
Все правильно попал ...
Nemko написал(а):
P.S. Да кстати в коде в function MbOrTb идет строка if Float/1024 < 1024 then Result:= NumToStr(Float/1024)+' GB' else, а функции такой нет NumToStr. Зато есть function NumToStrHDD мне кажется надо переименовать ее в NumToStr.
Для понимания, лучше всего исправлять скрипт, чем указывать на ошибки
Код:
function NumToStr(Float: Extended): String; // исправлено "NumToStrHDD" 
begin
Result:= format('%.2n', [Float]); StringChange(Result, ',', '.');
while (Result[Length(Result)] = '0') or ((Result[Length(Result)] = '.') and (Pos('.', Result) > 0)) do
SetLength(Result, Length(Result)-1);
end;
Дали бы уже ссылку просто:
FAQ по Inno Setup
По-моему, может и не понять какой именно пример.
Так все-таки лучше будет:
Как добавить проверку свободного/необходимого места на жестком диске?
 
Последнее редактирование:

Natrix

Новичок
...
Для понимания, лучше всего исправлять скрипт, чем указывать на ошибки
Код:
function NumToStr(Float: Extended): String; // исправлено "NumToStrHDD"
begin
Result:= format('%.2n', [Float]); StringChange(Result, ',', '.');
while (Result[Length(Result)] = '0') or ((Result[Length(Result)] = '.') and (Pos('.', Result) > 0)) do
SetLength(Result, Length(Result)-1);
end;
Спасибо.
По-моему, может и не понять какой именно пример.
Так все-таки лучше будет:
Как добавить проверку свободного/необходимого места на жестком диске?
Дали бы уже ссылку просто:
FAQ по Inno Setup
По второму вопросу код имеющийся в F.A.Q идентичен., а так как в нём нет подсказок, толку от него мало, особенно если для тебя это просто набор символов. Даже логически, если человек только начал вникать то по какому признаку в этом F.A.Q., он понял бы, что строка в коде Result:= format('%.2n',..., это и есть искомое? ))) Но благодаря помощи, разобрался, спасибо.
Измени строку на:
Result:= format('%.0n', [Float]); StringChange(Result, ',', '.'); Целые
Result:= format('%.1n', [Float]); StringChange(Result, ',', '.'); Десятые
Result:= format('%.2n', [Float]); StringChange(Result, ',', '.'); Сотые
Result:= format('%.3n', [Float]); StringChange(Result, ',', '.'); Тысячные
Или я не туда попал :D.

P.S. Да кстати в коде в function MbOrTb идет строка if Float/1024 < 1024 then Result:= NumToStr(Float/1024)+' GB' else, а функции такой нет NumToStr. Зато есть function NumToStrHDD мне кажется надо переименовать ее в NumToStr.
Почему не туда? В яблочко. Спасибо большое.
 
Последнее редактирование:
Сверху