2

セットアップ内のすべてのコンポーネントの合計サイズを計算する必要があります。一部のカスタム コードが原因で、Inno Setup の内部機能を使用できません。

問題は、コンポーネントが多くのファイルを共有することでした。そのため、使用するファイルの変数を含むすべてのコンポーネントの文字列を定義しました。次に、これらの文字列を単一の文字列に追加し、この文字列に特定の変数が見つかった場合、ファイルのサイズ (バイト単位) が type の変数「サイズ」に追加されますSingle。最後に、「サイズ」は、インストールに必要なスペースを示します。

実際、これはうまく機能しますが、次のページでサイズを GB で示したいと思います。しかし、関数FloatToStrは小数点の後に多くの数字を追加しますが、私は2つだけにしたいのです。

スクリプトは次のとおりです (問題は最後の行で発生します)。

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「サイズ」のタイプを選択しても、長い数値が表示されますが、ここで処理される数値が大きすぎて、ポイントの後に小数点以下 2 桁が必要なため、IntegerandIntToStrを使用できません (問題を解決するもの)。MsgBox

Format関数も入れようとしましたMsgBoxが、「タイプの不一致」エラーも発生しました。

FloatToStrFInno Setup ではサポートされていません。

コンパイラは、「サイズ」が宣言された型をチェックし、再び使用することを主張するため、事前に使用して「サイズ」を変換FloatToStrして切り捨ててもうまくいきませんでした。FloatToStrMsgBox

この数を切り上げる方法がわかりません。たぶん、いくつかの異なるアプローチが役立つでしょうか?

あなたの答えを楽しみにしています!

4

1 に答える 1

2

機能を使用できますFormat

次の例を見てください。

procedure TestClick(Sender: TObject);
var
  Size: Extended;
begin
  Size := 0;
  Size := Size + 1512820736
  Size := Size + 635711488;
  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 }
  MsgBox(Format('%.2f Gb.', [Size]), mbInformation, MB_OK); 
end;

個人的な選択として、データ型を から に変更していますSingleExtended

または、この関数をより賢明な選択として使用して、バイト数に応じて正しい次元を追加します。

const
  KFactor = 1024;

function FormatBytes(const Bytes: Extended): string;
var
  Amount: Extended;
  Idx: Byte;
  Dms: array[1..5] of string;
  FmtStr: string;
begin
  Dms[1] := 'B'; Dms[2] := 'KB'; Dms[3] := 'MB'; Dms[4] := 'GB'; Dms[5] := 'TB';
  Amount := Bytes;
  Idx := 1;
  while Amount > (0.9 * KFactor) do
  begin
    Idx := Idx + 1;
    Amount := Amount / KFactor;
  end;
  if Abs(Amount - Trunc(Amount)) < 0.07 then
    FmtStr := '%.0f %s'
  else
    FmtStr := '%.2f %s';
  Result := Format(FmtStr, [Amount, Dms[Idx]]);
end;

KB / MB / GB / TBのほぼ正確な量が表示される場合に備えて、小数点以下の桁数を調整するために編集された回答。

于 2012-11-12T06:40:15.270 に答える