4

我想在我的设置中将 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 之前,我对这些消息框没有任何问题。

4

2 回答 2

7

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

话虽如此,可以通过将其中一个或另一个重新创建为自定义页面来呈现交换页面的外观。但是,这样做您将丧失与该页面相关的所有内置功能 - 例如。如果替换组件页面,则不能使用 [Components] 部分或参数,如果替换目录页面,则不能使用 {app}(即使在隐式使用它的那些地方,例如 UninstallFilesDir)。

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

于 2012-11-14T20:13:37.277 回答
0

添加到米拉尔所说的:

[Setup]
DisableDirPage=yes // disable the built-in page

[Code]
var
  ApacheDirPage: TInputDirWizardPage;
  ApacheDir: AnsiString;

procedure InitializeWizard;
begin
  { Create the custom wizard pages }
    ApacheDirPage := 
       CreateInputDirPage( wpSelectComponents,  // display AFTER select Type/Components page
                           'Select Apache Directory', 
                           'Select the Apache x.x Directory' + #13#10 + '(the one that contains the BIN folder)',
                           'Select the Apache directory, then click Next.',
                           False, '' );
   ApacheDirPage.Add( '');           
   ApacheDirPage.Values[0] := csApacheLocation;
end;
于 2021-07-21T22:10:51.670 回答