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

问题描述 投票:0回答:1

在我的 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
函数中有这个功能,但这也不起作用。

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

inno-setup pascalscript
1个回答
2
投票

我不明白,为什么你需要重置任务。我的印象是,您对任务的条件跳过执行不正确。

这只是一个猜测,但我假设您使用

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
© www.soinside.com 2019 - 2024. All rights reserved.