在代码部分使用任务结果

Using TASK Results in code section

根据“任务向导”页面上的用户选择,我需要能够使用答案创建 5 个不同的 variables/variant 以在“文件”和“图标”部分中使用。

例子; 1.- 结果将指示将文件放入哪个目录。 2.- 结果还将指示参数中的文本是什么。

上面的每个例子都是不同的variable/variant

这些变体基本上会取代我当前使用的#define(s) 变量。

我的应用程序是一个多状态应用程序,每个状态都有不同的支持文件内容,我希望能够使用 TASK 选项,而不是每个状态都有一个单独的 exe 文件。

你的问题太笼统了,我就尽量给你展示一个从脚本代码中获取[Files]入口DestDir参数的原理,你也可以申请[Icons] 参数。关键是使用 {code:...} 常量,您可以在其中指定脚本的 [Code] 部分中声明的 getter 函数。以下示例显示了如何根据所选任务将文件安装到 4 个不同的目录中:

#define PathNone "None"
#define PathBoth "Both"
#define PathFirst "First"
#define PathSecond "Second"

[Setup]
AppName=My Program
AppVersion=1.5
DefaultDirName={pf}\My Program

[Tasks]
Name: TaskFirst; Description: "First task"
Name: TaskSecond; Description: "Second task"

[Files]
Source: "MyApp.exe"; DestDir: "{code:GetMyAppDir}"

[Code]
function GetMyAppDir(Param: string): string;
begin
  // check if both tasks are selected; if yes, then assign a subfolder path defined
  // by the PathBoth preprocessor variable to the Result
  if IsTaskSelected('TaskFirst') and IsTaskSelected('TaskSecond') then
    Result := '{#PathBoth}'
  else
  // both tasks are not selected, so let's check if the first one is; if yes, then
  // assign the PathFirst preprocessor variable to the Result
  if IsTaskSelected('TaskFirst') then
    Result := '{#PathFirst}'
  else
  // first task nor both are selected, so let's check if the second one is; if so,
  // assign the PathSecond preprocessor variable to the Result
  if IsTaskSelected('TaskSecond') then
    Result := '{#PathSecond}'
  else
    // no task is selected (this is the last possible situation), let's assign the
    // PathNone preprocessor variable to the Result
    Result := '{#PathNone}';

  // finally prepend to the Result the {app} constant and expand all the constants
  Result := ExpandConstant('{app}\' + Result);
end;

类似的,您可以使用许多部分参数,但不是全部(这是一个相当广泛的话题)。还要注意,一些参数是较早评估的(当用户尚未看到任务时),其中一些较晚。此外,一些参数被评估不止一次(分配的 getter 函数可能会执行不止一次)。

所以这取决于您要指定哪些参数。对于您提到的 [Files] 部分 DestDir 参数和 [Icons] 部分 Parameters 参数,您可以使用这种方法。