2016-03-01 41 views
1

默認情況下,在組件頁面上,Inno Setup會將所有文件的大小添加到所選組件的大小(顯示在頁面底部)。Inno Setup - 按組件定義磁盤空間

現在,我特別需要Inno Setup來精確地滿足當前組件的尺寸要求。我怎樣才能做到這一點?

新代碼:

[Setup] 
AppName=Dagon Video Tools 
AppVersion=1.0 
AppVerName=Dagon Video Tools 
DefaultDirName={sd}\Tools\Dagon Video Tools 
VersionInfoProductName=Dagon Video Tools 
WizardImageFile=Include\WizardImage.bmp 
WizardSmallImageFile=Include\WizardSmallImage.bmp 
SetupIconFile=Include\Icon.ico 

[Files] 
..... 

[ThirdParty] 
UseRelativePaths=True 

[Components] 
Name: "Slasher"; Description: "Dagon Slasher"; Types: Slasher Full 
Name: "Frankenstein"; Description: "Dagon Frankenstein"; Types: Frankenstein Full 

[Types] 
Name: "Full"; Description: "Full" 
Name: "Slasher"; Description: "Dagon Slasher" 
Name: "Frankenstein"; Description: "Dagon FrankenStein" 

[Icons] 
Name: "{group}\{cm:UninstallProgram,Dagon Slasher}"; Filename: "{uninstallexe}"; Components: Slasher 
Name: "{group}\{cm:UninstallProgram,Dagon Frankenstein}"; Filename: "{uninstallexe}"; Components: Frankenstein 
Name: "{group}\{cm:UninstallProgram,Dagon Video Tools}"; Filename: "{uninstallexe}"; Components: Slasher and Frankenstein 


[Code] 
procedure CurPageChanged(CurPageID: Integer); 
Begin 
if (CurPageID=wpSelectProgramGroup) then 
    begin 
    if IsComponentSelected('Slasher') then 
    begin 
     WizardForm.DirEdit.Text := ExpandConstant('{sd}\Tools\Dagon Slasher'); 
     WizardForm.GroupEdit.Text := 'Dagon Slasher'; 
    end; 
    if IsComponentSelected('Frankenstein') then 
    begin 
     WizardForm.DirEdit.Text := ExpandConstant('{sd}\Tools\Dagon FrankenStein'); 
     WizardForm.GroupEdit.Text := 'Dagon FrankenStein'; 
    end; 
    if IsComponentSelected('Slasher') and IsComponentSelected('Frankenstein') then 
    begin 
     WizardForm.GroupEdit.Text := 'Dagon Video Tools'; 
    end 
    end; 
End; 

procedure OnTypeChange(Sender: TObject); 
begin 
    // set the item index in hidden TypesCombo 
    WizardForm.TypesCombo.ItemIndex := TNewCheckListBox(Sender).ItemIndex; 
    // notify TypesCombo about the selection change 
    WizardForm.TypesCombo.OnChange(nil); 
end; 

procedure InitializeWizard; 
var 
    I: Integer; 
    CheckListBox: TNewCheckListBox; 
begin 
    // create the TNewCheckListBox object and set the basic properties 
    CheckListBox := TNewCheckListBox.Create(WizardForm); 
    CheckListBox.Parent := WizardForm.SelectComponentsPage; 
    CheckListBox.Left := WizardForm.TypesCombo.Left; 
    CheckListBox.Top := WizardForm.TypesCombo.Top; 
    CheckListBox.Width := WizardForm.TypesCombo.Width; 
    CheckListBox.Height := CheckListBox.MinItemHeight * 
    WizardForm.TypesCombo.Items.Count + 4; 
    CheckListBox.TabOrder := 0; 
    // assign the selection change event 
    CheckListBox.OnClickCheck := @OnTypeChange; 
    // add radio buttons from all TypesCombo items, select the first item 
    for I := 0 to WizardForm.TypesCombo.Items.Count - 1 do 
    CheckListBox.AddRadioButton(WizardForm.TypesCombo.Items[I], 
     '', 0, I = 0, True, nil); 
    // hide the TypesCombo combo box 
    WizardForm.TypesCombo.Visible := False; 
    WizardForm.ComponentsList.Visible := False; 
    WizardForm.ComponentsDiskSpaceLabel.Visible := True; 
end; 

發佈完整的代碼,因爲你可以看到,我的代碼更改{app}{group}取決於組件。我現在得去上班了,所以我會在下半天離線。此代碼似乎顯示正確的文件大小,我正在去附加組件選擇的一些其他功能,所以,如果這個工程,我將不得不張貼另一個問題。回到〜8小時。

+0

OK,我定義了每個組件的大小('ExtraDiskSpaceRequired'),但對於Inno而言,它是額外空間,因此,當顯示所需的磁盤空間時,Inno實際顯示組件內大小+所有文件的大小。我需要Inno忽略它裏面的文件的大小,並且需要與當前組件一樣多的磁盤空間。 –

+0

那麼,爲什麼不只是將'ExtraDiskSpaceRequired'設置爲字節數來將文件的大小填充到所需的大小呢?那麼,實際上這就是參數的用途。 –

+0

好的,這是一個2部分的程序。安裝程序應只允許安裝一個程序,或者另一個程序或「完整軟件包」。因此,其中2個組件的大小比所有文件都小。而「全包」已經是整個尺寸。顯然,選擇「Full Pack」會顯示所需磁盤空間的兩倍。因此,沒有任何組件的尺寸「高於」任何東西,它應該下降。 –

回答

2

您正在使用安裝組件不正確。您的「全包」組件不是組件。它是兩個組件的組合(「第1部分」 + 「第2部分」)。因此,內置的Inno Setup邏輯與您的安裝程序不匹配,現在您需要了解如何解決該問題。不要試圖解決這個問題,而應該正確使用Inno Setup。

你想要的是兩個部分:

  • 第1部分
  • 第2部分

和三種設置類型:

  • 全包(同時安裝「第1部分」「第2部分」組件)
  • 第1部分(安裝「第1部分」 僅成分)
  • 第2部分(安裝「第2部分「組件只)

如果您使用的組件,而不是類型,因爲你喜歡」無線電-b utton「選擇多於組合框(下拉菜單),請參閱Replace installation types Dropdown list by radio buttons

這樣你就可以得到與截圖一樣的GUI,但工作正常。

在你的情況下,根本沒有意義顯示組件列表。確保沒有類型具有iscustom標誌來隱藏組件列表,並且確保它選擇正確的組件(iscustom類型不選擇它們的組件)。

。如果你想顯示的尺寸標籤,明確地表現出來:

procedure InitializeWizard(); 
begin 
    WizardForm.ComponentsDiskSpaceLabel.Visible := True; 
end; 

如果你想顯示連組件列表沒有自定義類型:

procedure InitializeWizard(); 
begin 
    WizardForm.ComponentsList.Visible := True; 
    WizardForm.ComponentsDiskSpaceLabel.Visible := True; 
end; 
+0

這仍然不顯示正確的文件大小......我可以在這種情況下禁用磁盤空間要求嗎?儘管如此,這仍然不理想。 –

+0

從使用Inno的第一天起,我就遠離那些可怕的類型。如果我切換到另一種類型,然後返回到「全部」,則「完整」類型不顯示組合文件大小... –

+0

是的,對不起。我得去上班了,所以我很匆忙。我並不關心類型的第一件事。我會在下班後回來,併發布截圖(不知道如何在評論中發佈代碼,所以這也是一個截圖) –