2013-04-01 82 views
2

我有三個組件。其中兩個都取決於第三個。當檢查其他兩個組件中的任何一個時,是否有編程方式來自動檢查第三個組件的方框?Inno Setup組件之間的動態依賴關係

此行爲類似於嵌套組件的行爲,但這些行爲處於同一級別,我無法使用該功能。將是很好,如果英諾可供組件間依賴性的方式,但在那之前......

UPDATE
也許是我設想一個虛擬的例子會幫助:

[Components] 
Name: "parent1"; Description: "app 1" 
Name: "parent2"; Description: "app 2"; Depends: parent1 
Name: "parent2\child"; Description: "feature" 
Name: "parent3"; Description: "app 3"; Depends: parent1 
Name: "parent3\child"; Description: "feature" 
+0

父母1是否需要是可選的?並且檢查狀態是否需要實際更改? Inno可以在執行安裝時處理表達式,例如:'Components:parent1或parent2或parent3'這將導致它安裝該組件。也許你可以在「parent1」上調整任何UI /圖標。 – Deanna

+0

@Deanna是的,它確實需要單獨選擇。爲了清楚起見,該軟件包是一個包含各種庫的SDK。其中一些取決於其他人。你可以想象這會產生複雜性。 – Ioan

+0

@TLama我希望你保持你的答案,因爲這是幫助我達到這個近似解決方案。 – Ioan

回答

0
procedure InitializeWizard(); 
begin 
    WizardForm.ComponentsList.OnClickCheck := @ComponentsClickCheck; 
end; 

procedure ComponentsClickCheck(Sender: TObject); 
var 
    ListBox: TNewCheckListBox; 
    parent1_top: Integer; 
    parent2_top: Integer; 
    parent3_top: Integer; 
begin 
    ListBox := TNewCheckListBox(Sender); 
    parent1_top := 0; 
    parent2_top := 1; 
    parent3_top := 3; 
    (* Check if parent2_top was selected. *) 
    if (ListBox.State[parent2_top] = cbChecked) or 
    (ListBox.State[parent2_top] = cbGrayed) then begin 
    (* Check a dependent component. *) 
    ListBox.CheckItem(parent1_top, coCheckWithChildren); 
    end; 
    (* Check if parent3_top was selected. *) 
    if (ListBox.State[parent3_top] = cbChecked) or 
    (ListBox.State[parent3_top] = cbGrayed) then begin 
    (* Check a dependent component. *) 
    ListBox.CheckItem(parent1_top, coCheckWithChildren); 
    end; 
end; 

有一方面的影響是「取決於」組件被取消選擇之前,「依賴關係」變得不可改變。更改依賴關係的啓用狀態以進行視覺澄清也會有所幫助。

1

選擇一個子組件也會默認自動選擇其父組件(雖然你可以禁用它)。這聽起來像你想要的行爲,但你只是想着它。

說你有組件A和組件B,它們是獨立的。您還有組件C和組件D,每個組件可以彼此分開安裝,但需要安裝組件B.

[Components] 
Name: "A"; Description: "app 1" 
Name: "B"; Description: "app 2" 
Name: "B\C"; Description: "feature C of app 2" 
Name: "B\D"; Description: "feature D of app 2" 

考慮到這種安排,如果用戶願意,用戶可以自己選擇A或B;他們也可以選擇添加C或D(或不)。但選擇C或D會強制B被選中。 (注意:這裏假設你還有其他條目是有條件的,尤其是在B本身上。如果你只是自己測試複選框,還沒有添加​​條件,那麼你會有要以獲得所需的行爲增加Flags: checkablealone到B)

對於示例的更接近於上面,試試這個:

[Components] 
Name: "app1"; Description: "app 1" 
Name: "app1\app2"; Description: "app 2" 
Name: "app1\app2\child"; Description: "feature" 
Name: "app1\app3"; Description: "app 3" 
Name: "app1\app3\child"; Description: "feature" 

應用1可以單獨安裝,並且應用程序2可與應用程序3分開安裝 - 但選擇應用程序2或應用程序3將強制應用程序1包含在內也是。 (是的,這將看起來像一個可見的層次 - 但你可能應該表明,無論如何,讓用戶知道爲什麼他們的選擇被迫以這種方式。)

另一種可能性:如果沒有理由的用戶需要自己安裝app1,那麼你可以完全從組件中刪除它。只需將條件從Components: app1更改爲Components: app2 or app3即可。 (或者,如果app2和app3是唯一的替代品,並且它們都需要app1,則完全刪除該條件。)

+0

是的,我想過這樣做,但它不能很好地擴展,它變得複雜。我舉了一個簡單的例子來說明問題,我試圖解決一個更大的問題。 – Ioan