Inno setup Inno设置-按组件定义磁盘空间

Inno setup Inno设置-按组件定义磁盘空间,inno-setup,pascalscript,Inno Setup,Pascalscript,默认情况下,在components(组件)页面上,Inno Setup会将其中所有文件的大小添加到所选组件的大小中(显示在页面底部) 现在,我特别需要Inno设置所需的量与当前组件的大小完全相同。我怎样才能做到这一点 新代码: [Setup] AppName=Dagon Video Tools AppVersion=1.0 AppVerName=Dagon Video Tools DefaultDirName={sd}\Tools\Dagon Video Tools VersionInfoPro

默认情况下,在components(组件)页面上,Inno Setup会将其中所有文件的大小添加到所选组件的大小中(显示在页面底部)

现在,我特别需要Inno设置所需的量与当前组件的大小完全相同。我怎样才能做到这一点

新代码:

[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小时后回来。

您使用的安装组件不正确。您的“完整包装”组件不是组件。它是两个组件的组合(“第1部分”+“第2部分”)。因此,内置的Inno设置逻辑与安装程序不匹配,现在您要问如何解决这个问题。不要试图解决这个问题,请正确使用Inno安装程序

您需要的是两个组件:

  • 第一部分
  • 第二部分
和三种设置类型:

  • 完整包(安装“第1部分”和“第2部分”组件)
  • 第1部分(仅安装“第1部分”组件)
  • 第2部分(仅安装“第2部分”组件)

如果您使用组件而不是类型,因为您更喜欢“单选按钮”选择而不是组合框(下拉菜单),请参阅

这样,您可以获得与屏幕截图相同的GUI,但工作正常

在您的情况下,显示组件列表可能根本没有意义。确保没有类型具有隐藏组件列表的
iscustom
标志,并确保它选择了正确的组件(
iscustom
类型不选择其组件)

如果仍要显示尺寸标签,请显式显示:

procedure InitializeWizard();
开始
WizardForm.ComponentDiskSpaceLabel.Visible:=True;
结束;
如果要显示没有自定义类型的组件列表,请执行以下操作:

procedure InitializeWizard();
开始
WizardForm.ComponentsList.Visible:=True;
WizardForm.ComponentDiskSpaceLabel.Visible:=True;
结束;

OK,我定义了每个组件的大小(
ExtraDiskSpaceRequired
),但对于Inno来说,它是额外的空间,因此,当显示所需的磁盘空间时,Inno实际上显示了打包在组件内的所有文件的大小+组件的大小。我需要Inno忽略其中文件的大小,并需要与当前组件一样多的磁盘空间。因此,为什么不将
ExtraDiskSpaceRequired
设置为字节数,以将文件大小增加到所需的大小?实际上,这就是参数的作用。好的,问题是它是一个由两部分组成的程序。安装程序应只允许安装一个程序、另一个程序或“完整包”。因此,其中2个组件的大小小于所有文件。而“全套”已经是全部尺寸了。显然,选择“完整包”会显示所需磁盘空间的两倍。因此,任何组件的大小都不会“加满”,应该降低。它是一个组件,但所有三个组件都是独占的,仍然没有显示正确的文件大小。。。在这种情况下,我可以禁用磁盘空间需求吗?虽然,这仍然不理想。从使用Inno的第一天起,我就远离那些可怕的类型。“完整”类型不显示组合文件大小,如果我切换到其他类型,然后返回“完整”…是的,对不起。我要去上班了不,所以我有点赶时间。我也不知道关于类型的第一件事。我会在下班后回来,发布截图(不知道如何在评论中发布代码,所以这也是截图)非常感谢你,Martin。当然,它是有效的,我只需要读一点关于类型和它们是如何工作的。