在不使用全局变量的情况下从自定义 Inno Setup 向导页面读取值

Reading values from custom Inno Setup wizard pages without using global variables

在这个用于创建自定义 CreateInputOptionPage 的支持页面上,他们建议通过将页面值分配给变量来存储页面值。然而,目前还不清楚这项任务应该在什么时候进行。'

据我所知,如果您在创建页面时分配此权限,您将获得默认值。这是有道理的,因为在创建页面时,用户还没有输入任何 "Input Query"。

因此,我想在单击 'Next' 按钮时使用 function NextButtonClick(CurPageID: Integer): Boolean;

将页面中的值分配给变量

为此,我需要在 NextButtonClick 函数中访问页面的变量 (Page.Values[0])。由于 Page 是在不同的函数中定义的,访问这些值的唯一方法是让 Page 成为全局变量吗?这就是我决心要做的,但我想知道是否有人可以替代全局变量。

到目前为止我的代码存根。

[Code]

var
  Page: TInputOptionWizardPage;
  InstallationTypeIsClient: boolean;

procedure InitializeWizard();
begin
  Page := CreateInputOptionPage(wpWelcome,'Installation Type', 'Select Installation Type', 'No really, do some selecting', True, False)
  Page.Add('Server Install');
  Page.Add('Client Install');
  Page.Values[1] := True;
end;

function NextButtonClick(CurPageID: Integer): Boolean;
begin
  if CurPageID=100 then
  begin
    InstallationTypeIsClient := Page.Values[1];
    MsgBox('InstallationTypeIsClient value is ' + Format('%d', [InstallationTypeIsClient]), mbInformation, MB_OK);
  end;
  Result := True;
end;

使用全局变量来存储对自定义页面的引用是正确且最简单的方法。

相关问题:.

尽管是否真的需要将用户值存储到另一个变量是值得怀疑的。只需在需要时从自定义页面读取值即可。

一般来说,使用全局变量确实不受欢迎。但那是在您开发独立代码时。在这种情况下,您只是为现有应用程序实现事件挂钩,因此您别无选择。


唯一的其他方法是在 WizardForm 的子控件中递归查找自定义页面。代码很多,效率很低。

有关递归组件迭代的示例,请参阅我对 的回答。