2012-11-11 75 views
1

我需要計算我的安裝程序中所有組件的總大小。由於一些自定義代碼,我無法使用Inno的內部功能。如何在Inno Setup中定義Single-Type變量中的小數位數量?

問題在於組件共享大量文件。所以我爲包含它們使用的文件變量的每個組件定義了一個字符串。然後我將這些字符串添加到單個字符串中,如果在此字符串中找到某個變量,則以字節爲單位的文件大小將添加到類型爲「single」的變量「size」中。 最後,「尺寸」顯示安裝需要多少空間。

其實這個工作得很好,但我想在下一頁顯示GB的大小。 但是函數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; 

正如你所看到的,我試過幾件事情來擺脫的數字。問題是MsgBox中的FloatToStr函數,它會自動添加所有數字。如果我爲「大小」選擇Integer類型,它仍然會顯示長數字,但是我不能在MsgBox中使用Integer和IntToStr(這可以解決問題),因爲這裏處理的數字太大,我想要兩位小數在點之後。

我也嘗試將格式化功能放入MsgBox,但我也遇到類型不匹配錯誤。

Inno不支持FloatToStrF。

事先使用FloatToStr轉換「size」並截斷它並不能很好地工作,因爲編譯器會檢查Type「size」被聲明爲,並堅持在MsgBox中再次使用FloatToStr。

我不知道如何將這個數字加起來。也許一些不同的方法可以幫助?

我期待着您的回答!

回答

1

您可以使用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; 

我改變了從單一到擴展數據類型,把它作爲一個個人的選擇。

或使用該功能作爲聰明選擇添加正確的尺寸取決於字節數:

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將被顯示

+0

哇,非常感謝!我錯誤地使用了格式化功能,但現在起作用了!但我仍在努力理解第二個函數是如何工作的......請你解釋一下這個問題嗎? – user1662035

+0

@ user1662035對不起,我認爲代碼本身就是可以說明的。如果你想弄明白這是如何工作的,你可能需要調試它並逐步運行它。在第一行放置breakpint(F5),一旦它停止安裝程序的執行,您可以繼續執行(F8),同時通過將鼠標光標懸停在腳本的名稱上來檢查變量值。 – jachguate

+0

經過第二次瞥見我得到它,但什麼是KFactor?它沒有被聲明... – user1662035

相關問題