在设置初始化时取消选中任务复选框

时间:2016-01-27 13:16:04

标签: inno-setup pascalscript

在我的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函数中使用了它,但这也没有用。

我应该在哪里放置此代码以使其工作并找到完全初始化的任务列表?任务页面可能没有显示,所以我认为等待页面变得可见为时已晚。事实上,代码曾经在那里,并且在跳过页面时没有被调用。

1 个答案:

答案 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