Inno setup 如何在InnoSetup中更改页面顺序?

Inno setup 如何在InnoSetup中更改页面顺序?,inno-setup,pascal,swap,Inno Setup,Pascal,Swap,我想在我的设置中将SelectDir页面与Components页面交换 我找到了一个解决方案,将另一个页面的内容分配给当前页面 Procedure CurPageChanged(CurPageID: Integer); Begin Case CurPageID of wpSelectDir: begin WizardForm.SelectDirPage.Notebook.ActivePage:= WizardForm.SelectComponentsPage;

我想在我的设置中将SelectDir页面与Components页面交换

我找到了一个解决方案,将另一个页面的内容分配给当前页面

Procedure CurPageChanged(CurPageID: Integer);
Begin
  Case CurPageID of
  wpSelectDir:
    begin
      WizardForm.SelectDirPage.Notebook.ActivePage:= WizardForm.SelectComponentsPage;
      WizardForm.PageNameLabel.Caption:= SetupMessage(msgWizardSelectComponents)
      WizardForm.Hint:= WizardForm.PageDescriptionLabel.Caption;
      WizardForm.PageDescriptionLabel.Caption:= SetupMessage(msgSelectComponentsDesc)
    end;
  wpSelectComponents:
    begin
      WizardForm.SelectComponentsPage.Notebook.ActivePage:= WizardForm.SelectDirPage;
      WizardForm.DiskSpaceLabel.Caption:= WzardForm.ComponentsDiskSpaceLabel.Caption;
      WizardForm.PageNameLabel.Caption:= SetupMessage(msgWizardSelectDir)
      WizardForm.PageDescriptionLabel.Caption:= WizardForm.Hint
    end;
  end;
End;
使用此方法的问题是,只更改内容,而不更改实际页面。消息框和错误消息不受影响。我写了很多行代码来解决这些问题,但是我遇到了越来越多的问题

有更好的解决办法吗?我希望你能帮助我

编辑:经过一点实验后,我得出了以下结论:

procedure RedesignWizard;
var
  Page: TWizardPage;
begin
  Page := CreateCustomPage(wpWelcome, 'bla', 'bla');
  WizardForm.ComponentsList.Parent := Page.Surface;
  //Here  I am changing the layout of the pages...
end;

procedure InitializeWizard;
begin
  RedesignWizard;
end;

procedure CurPageChanged(CurPageID: Integer);
begin
  if (CurPageID = Page.ID) then
  begin
  //perform your actions specific to the Custom page here.
  end;
end;

这样,组件列表就会出现在SelctDirPage之前,我对这些消息框没有任何问题。

绝对没有办法安全地交换任何内置页面的顺序。(通常,当人们试图复制不同安装系统的流程时,他们才会问。放松,放手;Inno的工作方式不同,拥抱它而不是对抗它。)

话虽如此,通过将一个或另一个页面重新创建为自定义页面,可以提供交换页面的外观。但是,这样做将丧失与该页面相关的所有内置功能——例如,如果替换组件页面,则无法使用[components]部分或参数;如果替换目录页面,则无法使用{app}(即使在隐式使用它的地方,如卸载文件目录),也不能


如果你愿意投入大量的时间和精力(特别是测试),这是可以做到的。但结果一切都变得更糟了——所以通常情况下,你最好不要这样做。

简而言之,不要这样做。有绑定到“下一步”按钮单击的检查,这些检查由页面ID常量驱动,您不能覆盖这些常量。想象一下,当用户单击“下一步”按钮可以看到“组件”页面,并且(在特定情况下)目录编辑框中的默认目录已经存在时,会发生什么情况。是的,“文件夹:c:\something已经存在。是否仍要安装到该文件夹?”消息对话框从组件页面弹出,这是胡说八道。我知道这一点,因此写了一些检查,在页面上使用TLabel显示消息,并禁用上面解决方案中的“下一步”按钮。我真的需要交换这些页面,如果有更简单的解决方案,我想知道。我可以自己处理剩下的事情。如果我们彼此误解。。。。使用上述方法时会出现您提到的问题。我禁用了所有消息框,并试图解决错误页面上消息框的问题,但我遇到了越来越多的问题。这就是为什么我想使用另一种方法,因为我真的需要交换这些页面。是否可以创建自定义页面并为其分配SelectComponents页面的值?或者其他什么方式?否则,我将不得不解决每个问题。只有一种方法可以避免麻烦-模拟“下一步”和“上一步”按钮的单击,这是不可能的。难道我不能创建一个带有TNewCheckListBox的自定义页面,并将其分配给WizardForm.ComponentsList和一个分配给WizardForm.ComponentsDiskSpaceLabel的TNewStaticText吗?或者笔记本电脑上的什么东西?在最近的INNO版本中是否添加了此功能?我只想让“选择位置”页面显示是否正在安装某些组件。否则,我不需要显示该页面。但在选择组件之前,我无法判断是否需要显示它。@Toby Nope。我的答案仍然适用。