在代码部分使用任务结果
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
参数,您可以使用这种方法。
根据“任务向导”页面上的用户选择,我需要能够使用答案创建 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
参数,您可以使用这种方法。