2011-05-01 25 views
5

我添加了一個InputOptionWizardPage用於選擇任務。這工作正常,但我想添加一些自定義功能。一個任務是依賴於另一個,所以如果第二個複選框被選中,第一個應該被檢查並變灰。鉤標準Inno Setup複選框

爲此,我需要訪問複選框的屬性。我找到了使用完全自定義頁面的方法,我將自己明確地創建複選框,但這將是很多工作,因爲我迄今爲止的大部分內容都令人滿意。

如何掛鉤由Inno Setup創建的複選框,使用MyInputOptionWizardPage.Add('This will add a checkbox with this caption')

回答

0

你也可以通過父母關係來控制任務,它給你一個類似的行爲,你要求但不是100%相同。我知道這並不直接回答你的問題,但打算給你一個可能更容易實現的選項。這樣做,您根本不必擔心管理自定義對話框。

[Setup] 
;This allows you to show Lines showing parent/Child Relationships 
ShowTasksTreeLines=yes 

[Tasks] 
;Parent Tasks don't use "\" 
Name: p1; Description: P1 Test; 
;Child Tasks are named ParentTaskName\ChildTaskName 
;Flag don't inheritcheck:Specifies that the task 
;should not automatically become checked when its parent is checked 
Name: p1\c1; Description: C1 Test; Flags: dontinheritcheck; 
Name: p1\c2; Description: C2 Test; 
;Default behavior is that child must be selected 
;when a parent is selected 
;this can be overridden using the: 
;doninheritcheck flag and the checkablealone flag. 
Name: p2; Description: P2 Test; Flags: checkablealone; 
Name: p2\c1; Description: P2-C1 Test; Flags: dontinheritcheck; 
Name: p2\c2; Description: P2-C2 Test; Flags: dontinheritcheck; 
10

試圖直接回答你的問題。

我懷疑你已經使用CreateInputOptionPage()它返回一個TInputOptionWizardPage

這具有這樣的」。新增(‘實施例’)`方法你提到。

TInputOptionWizard下降TWizardPageTComponent下降,其中有你需要的方法。

更新:替換原來的代碼,這個例子是基於我以爲 是TRadioButtonTCheckBox,其中個別控制在ScriptClasses_C.pas我原來的例子的InnoSetup源代碼可用的選項進行審查。他們改爲其一個控制名爲TNewCheckListBox。有幾種方法可以解決這個問題,但最安全的方法是使用。

這個例子是一個完整的Inno安裝腳本。

[Setup] 
AppName='Test Date Script' 
AppVerName='Test Date Script' 
DefaultDirName={pf}\test 
[Code] 

const 
cCheckBox = false; 
cRadioButton = true; 


var 
    Opt : TInputOptionWizardPage; 

function BoolToStr(Value : Boolean) : String; 
begin 
    if Value then 
    result := 'true' 
    else 
    result := 'false'; 
end; 

procedure ClickEvent(Sender : TObject); 
var 
Msg : String; 
I : Integer; 
begin 
    // Click Event, allowing inspection of the Values. 
    Msg := 'The Following Items are Checked' +#10#13; 
    Msg := Msg + 'Values[0]=' + BoolToStr(Opt.Values[0]) +#10#13; 
    Msg := Msg + 'Values[1]=' + BoolToStr(Opt.Values[1]) +#10#13; 
    Msg := Msg + 'Values[2]=' + BoolToStr(Opt.Values[2]); 

    MsgBox(Msg,mbInformation,MB_OK); 
end; 
procedure InitializeWizard(); 
var 
    I : Integer; 
    ControlType : Boolean; 
begin 
    ControlType := cCheckBox; 
    Opt := CreateInputOptionPage(1,'Caption','Desc','SubCaption',ControlType, false); 
    Opt.Add('Test1'); 
    Opt.Add('Test2'); 
    Opt.Add('Test3'); 

    // Assign the Click Event. 
    Opt.CheckListBox.OnClickCheck := @ClickEvent; 
end; 
+0

@Robert - 感謝。在這一行我得到一個類型不匹配的錯誤:'Radio:=(InputOptionPage as TRadioButton);'。代碼如下:'For CompIndex:= 0 to InputOptionPage.ComponentCount -1 do begin if(InputOptionPage is TRadioButton)then begin Radio:=(InputOptionPage as TRadioButton); Radio.OnClick:= RadioButtonClick; \t end; 結束; ' – rossmcm 2011-05-03 21:03:41

+0

...我希望我知道如何在評論中正確地格式化代碼。嘆。 – rossmcm 2011-05-03 21:04:53

+0

我看到了錯誤......這就是我沒有編譯/測試代碼的原因。注意添加.components [I] – 2011-05-03 21:12:24