Мне нужно рассчитать общий размер всех компонентов в моей установке. Из-за некоторого специального кода я не могу использовать для этого внутреннюю функцию Inno Setup.
Проблема заключалась в том, что компоненты совместно используют множество файлов. Поэтому я определил строку для каждого компонента, содержащую переменные для файлов, которые они используют. Затем я добавляю эти строки в одну строку, и если в этой строке обнаруживается определенная переменная, то размер файла в байтах добавляется к переменной «size» типа Single
. В конце «размер» показывает, сколько места необходимо для установки.
На самом деле это работает очень хорошо, но затем я хочу показать размер в ГБ на следующей странице. Но функция FloatToStr
добавляет много чисел после десятичной запятой, тогда как мне просто нужно два.
Вот сценарий (проблема возникает в самых последних строках):
function NextButtonClick(CurPageID: Integer): Boolean;
var
size: Single;
if (CurPageID = wpSelectDir) then { I have swapped the Components and SelectDir pages }
begin
size := 0; { this will contain the size in the end }
xg := ''; { this is the string which contains the list of files needed by every single component }
for I := 0 to GetArrayLength(ComponentArray) - 1 do
if IsComponentSelected(ComponentArray[I].Component) then
begin
xg := xg + ComponentArray[I].GCF;
end;
{ here the files are being added to the string, everything's working as intended.. }
MsgBox(xg, mbInformation, MB_OK); { this is for testing if the string has been created correctly }
if Pos('gcf1', xg) > 0 then size := size + 1512820736; { here the Pos-function searches for the given string and if it is found it adds the value to "size", ok... }
if Pos('gcf2', xg) > 0 then size := size + 635711488;
if Pos('gcf3', xg) > 0 then size := size + 286273536;
size := size / 1024 / 1024 / 1024; { now all sizes have been added and the number is converted to be displayed GB, not bytes }
{ Format('%.2n', [size]); }
{ size := (round(size * 10) / 10); }
{ size := Format('%.2n', [size]); }
{ FloatToStr(size); }
MsgBox(FloatToStr(size), mbInformation, MB_OK); { Here the size is shown but with several unneeded places after the decimal point (2.267589569092) }
end;
end;
Как видите, я попробовал несколько вещей, чтобы избавиться от чисел. Проблема в функции FloatToStr
в MsgBox
, она автоматически складывает все числа. Если я выберу тип Integer
для "размера", он по-прежнему показывает это длинное число, но я не могу использовать Integer
и IntToStr
в MsgBox
(что решило бы проблему), потому что обрабатываемые здесь числа слишком велики, и я хочу иметь два десятичных знака. после точки.
Я также попытался поместить функцию Format
в MsgBox
, но тоже получил ошибку «Несоответствие типов».
FloatToStrF
не поддерживается Inno Setup.
Преобразование «размера» с использованием FloatToStr
заранее и его усечение также не сработало, потому что компилятор проверяет, какой тип «размер» был объявлен как, и снова настаивает на использовании FloatToStr
в MsgBox
.
Я понятия не имею, как округлить это число. Может, поможет какой-нибудь другой подход?
Жду ваших ответов!