在我的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
函数中使用了它,但这也没有用。
我应该在哪里放置此代码以使其工作并找到完全初始化的任务列表?任务页面可能没有显示,所以我认为等待页面变得可见为时已晚。事实上,代码曾经在那里,并且在跳过页面时没有被调用。
答案 0 :(得分:1)
我不明白,为什么你需要重置任务。我的印象是你有条件跳过任务执行错误。
这只是猜测,但我假设您使用ShouldSkipPage
跳过任务页面。因此,如果在先前的安装中启用了该任务,则该任务将保持检查状态。
请勿使用ShouldSkipPage
,而是使用Check
parameter。如果只有使用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
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
flag:
[Tasks]
Name: DeleteConfig; Description: "{cm:Task_DeleteConfig}"; Flags: unchecked checkedonce