2017-02-11 9 views
2

Я застрял в простой ситуации с OnClickCheck. Проблема в том, что я вижу каждый раз при включении задачи backup, но также (пока он включен) OnClickCheck появился при нажатии uninst задачи тоже! Кажется, что OnClickCheck проверяет все клики, но мне нужно проверить только на первую задачу.Inno Setup Обнаруживает измененную задачу/элемент в TasksList.OnClickПроверьте событие

Логично добавить к «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

Возможный дубликат [Установка Inno ComponentsList OnClick событие] (http://stackoverflow.com/questions/36989349/inno-setup-componentslist-onclick-event) –

+0

Смотрите также http://stackoverflow.com/ q/32698111/850848 и http://stackoverflow.com/q/39297075/850848 и многие другие. –

+0

Хм, да, http://stackoverflow.com/questions/36989349/inno-setup-componentslist-onclick-event - это именно то, что мне нужно, спасибо! –

ответ

0

Там никакого способа не точно сказать, что задача (элемент списка) был изменен в 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; 

 Смежные вопросы

  • Нет связанных вопросов^_^