2017-02-11 50 views
2

我陷於簡單情況OnClickCheck屬性。問題是我看到一個Msgbox每次我打開backup任務,但也(當它打開時)OnClickCheck出現在按uninst任務呢!似乎OnClickCheck檢查所有的點擊,但我只需要檢查點擊第一個任務。Inno Setup在TasksList.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

[創新安裝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;