我坚持使用OnClickCheck
属性的简单情况。问题是,每次打开Msgbox
任务时,我都会看到backup
,而且(当它已打开时)OnClickCheck
也会在按uninst
任务时出现!似乎OnClickCheck
检查所有点击,但我需要检查仅点击第一个任务。
添加到“WizardForm.TasksList.OnClickCheck
”确切的任务数(WizardForm.TasksList.OnClickCheck[0]
)是合乎逻辑的,但编译器不同意。
[Tasks]
Name: backup; Description: do backup
Name: uninst; Description: do not create uninstaller
[Code]
procedure TaskOnClick(Sender: TObject);
begin
if IsTaskSelected('backup') then
begin
MsgBox('backup task has been checked.', mbInformation, MB_OK)
end;
end;
procedure InitializeWizard();
begin
WizardForm.TasksList.OnClickCheck := @TaskOnClick;
end;
答案 0 :(得分:1)
在OnClickChange
事件中,无法准确说明更改了哪个任务(列表项)。
要告知用户检查了哪个项目,您可以使用ItemIndex
属性。用户只能检查所选项目。
虽然如果您有任务层次结构,但由于子/父项目的更改,安装程序可以自动切换未选择的任务。因此,要告诉所有更改,您可以做的就是记住以前的状态,并在调用OnClickCheck
时将其与当前状态进行比较。
var
TasksState: array of TCheckBoxState;
procedure TasksClickCheck(Sender: TObject);
var
I: Integer;
begin
for I := 0 to WizardForm.TasksList.Items.Count - 1 do
begin
if TasksState[I] <> WizardForm.TasksList.State[I] then
begin
Log(Format('Task %d state changed from %d to %d',
[I, TasksState[I], WizardForm.TasksList.State[I]]));
TasksState[I] := WizardForm.TasksList.State[I];
end;
end;
end;
procedure CurPageChanged(CurPageID: Integer);
var
I: Integer;
begin
if CurPageID = wpSelectTasks then
begin
{ Only now is the task list initialized (e.g. based on selected setup }
{ type and components). Remember what is the current/initial state. }
SetArrayLength(TasksState, WizardForm.TasksList.Items.Count);
for I := 0 to WizardForm.TasksList.Items.Count - 1 do
TasksState[I] := WizardForm.TasksList.State[I];
end;
end;
procedure InitializeWizard();
begin
WizardForm.TasksList.OnClickCheck := @TasksClickCheck;
end;