在我的 Inno Setup 脚本中,有一个任务可以在由代码确定的某些条件下使用。在任何其他情况下都不应执行此任务。事实上,整个任务页面都会被跳过。不幸的是,即使该页面根本不可见,Inno Setup 也会记住任务选择,并在每次后续更新设置时恢复。
我现在通常需要在每次设置初始化时取消选中该任务,以便忘记最后选择的状态。但我无法让它发挥作用。这是我最近的尝试:
[Tasks]
Name: DeleteConfig; Description: "{cm:Task_DeleteConfig}"; Flags: unchecked
#define Task_DeleteConfig_Index 0
[InstallDelete]
; Delete user configuration files if the task is selected
Type: files; Name: "{userappdata}\...\App.conf"; Tasks: DeleteConfig
[Code]
var
IsDowngradeSetup: Boolean;
function InitializeSetup: Boolean;
begin
// More code not shown here, but the following may be set under certain conditions
IsDowngradeSetup := true;
end;
procedure InitializeWizard;
begin
// Clear possibly remembered value from previous downgrade install
WizardForm.TasksList.Checked[{#Task_DeleteConfig_Index}] := false;
end;
function ShouldSkipPage(PageID: Integer): Boolean;
begin
// Make upgrade install quicker
Result := ((PageID = wpSelectTasks) or ((PageID = wpReady) and (GetArrayLength(products) = 0))) and PrevInstallExists;
end;
procedure CurPageChanged(CurPageID: Integer);
begin
if CurPageID = wpWelcome then
begin
if PrevInstallExists then
begin
// Change "Next" button to "Upgrade" on the first page, because it won't ask any more
WizardForm.NextButton.Caption := ExpandConstant('{cm:Upgrade}');
WizardForm.FinishedHeadingLabel.Caption := ExpandConstant('{cm:UpdatedHeadingLabel}');
end;
end;
if CurPageID = wpSelectTasks then
begin
if IsDowngradeSetup then
begin
// Pre-select task to delete existing configuration on downgrading (user can deselect it again)
// (Use the zero-based index of all rows in the tasks list GUI)
// Source: http://stackoverflow.com/a/10490352/143684
WizardForm.TasksList.Checked[{#Task_DeleteConfig_Index}] := true;
end;
end;
end;
这给了我一个
运行时错误(85:77):列表索引超出范围(0)。
我不知道“85:77”应该在哪里,但从最近的唯一更改来看,它只能是上面引用的代码。
我首先在
InitializeSetup
函数中有这个功能,但这也不起作用。
我应该把这段代码放在哪里,以便它可以工作并找到完全初始化的任务列表?任务页面可能不会显示,所以我认为等待页面变得可见已经太晚了。事实上,代码曾经在那里,并且在页面被跳过时没有被调用。
我不明白,为什么你需要重置任务。我的印象是,您对任务的条件跳过执行不正确。
这只是一个猜测,但我假设您使用
ShouldSkipPage
跳过任务页面。因此,如果在之前的安装中启用了该任务,则该任务将保持选中状态。
请勿为此使用
ShouldSkipPage
,而是使用 Check
参数。如果仅使用 Check
参数有条件地禁用单个任务,则会跳过整个任务页面。
[Tasks]
Name: DeleteConfig; Description: "{cm:Task_DeleteConfig}"; Flags: unchecked; \
Check: UseDeleteConfig
[Code]
function UseDeleteConfig: Boolean;
begin
Result := IsDowngradeSetup;
end;
要回答您的实际问题,您可以这样做:
procedure CurPageChanged(CurPageID: Integer);
begin
if CurPageId = wpReady then
begin
if PrevInstallExists then
begin
// In Inno Setup 6, you can use WizardSelectTasks
WizardForm.TasksList.Checked[0] := False;
end;
end;
end;
function UpdateReadyMemo(
Space, NewLine, MemoUserInfoInfo, MemoDirInfo, MemoTypeInfo, MemoComponentsInfo,
MemoGroupInfo, MemoTasksInfo: String): String;
begin
if PrevInstallExists then
begin
MemoTasksInfo := '';
end;
end;
尽管如此,我不认为这是一个好的解决方案。
UsePreviousTasks
:
[Setup]
UsePreviousTasks=no
checkedonce
标志:
[Tasks]
Name: DeleteConfig; Description: "{cm:Task_DeleteConfig}"; \
Flags: unchecked checkedonce