2013-04-01 6 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 or parent2 or 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를 설치해야합니다.

이러한 배열이 주어지면 사용자는 원하는 경우 A 또는 B를 스스로 선택할 수 있습니다. 그들은 또한 C 또는 D를 추가 할 것인지 선택할 수 있습니다. 그러나 C 또는 D를 선택하면 B도 선택하게됩니다.

(참고 :. 이것은 당신이 그 자체로 B에, 특히 이러한 모든 조건으로 다른 항목을 가지고 있다고 가정 그냥 스스로 체크 박스를 테스트하고 아직 Components: 조건문을 추가하지 않은 경우에 당신이해야합니다 . 원하는 동작을 얻기 위해 B에 Flags: checkablealone을 추가)

를 귀하의 예제의 근사치를 들어 위,이 시도 :

[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이 포함됩니다. d도. (그리고 네, 보이는 계층 구조로 나타납니다 -하지만 어쨌든 사용자가 자신의 선택이 이런 식으로 강요당하는 이유를 알 수 있도록 표시해야합니다.)

다른 가능성 : 사용자에게 이유가없는 경우 app1 만 설치해야하는 경우 구성 요소에서 app1을 완전히 제거 할 수 있습니다. 조건을 Components: app1에서 Components: app2 or app3으로 변경하면됩니다. (또는 app2와 app3만이 유일한 대안이고 둘 다 app1이 필요한 경우 완전히 제거하십시오.)

+0

예, 이런 식으로 생각했습니다. 그러나 잘 확장되지는 않습니다. 뒤죽박죽이됩니다. 간단한 예제를 통해 큰 문제를 해결하려고합니다. – Ioan

관련 문제