在先前的问题中,我询问如何使用三个可选组件,用户还可以单独指定每个组件的位置(例如代码部分和两个
HTML Web应用程序). @Miral给了我一个很好的答案,我现在已经实施了:
three components in three user defined locations
three components in three user defined locations
我还有一个小小的审美问题.我在向导中总是创建并询问用户CreateInputDirPage.问题出现在wpSelectComponents之后.
问题:如果未选择组件,我如何跳过页面.也就是说,如何跳过自定义页面?
我有一种感觉,它与ShouldSkipPage()有关.但我不知道我的自定义页面的PageID是什么,以及如何测试以查看选择了哪些组件.
function ShouldSkipPage(PageID: Integer): Boolean;
The wizard calls this event function to determine whether or not a particular page (specified by PageID) should be shown at all. If you return True,the page will be skipped; if you return False,the page may be shown.
我的脚本如下:
[Components] Name: "Watson"; Description: "Watson Component"; Types: onlywatson full Name: "Toby"; Description: "Toby Component"; Types: onlytoby full Name: "Sherlock"; Description: "Sherlock Component"; Types: onlysherlock full [Code] var TobyDirPage: TInputDirWizardPage; SherlockDirPage: TInputDirWizardPage; procedure InitializeWizard; begin TobyDirPage := CreateInputDirPage(wpSelectComponents,'Select Location for Toby Web Pages','Where should we store the sample Toby application files?','The sample Toby stand-alone map application will be saved in the following folder.'#13#10#13#10 + 'To continue,click Next. If you would like to select a different folder,click Browse.',False,'New Folder'); { Add item (with an empty caption) } TobyDirPage.Add(''); { Set initial value (optional) } TobyDirPage.Values[0] := ExpandConstant('c:\wwwroot\Toby'); SherlockDirPage := CreateInputDirPage(wpSelectComponents,'Select Location for Sherlock Web Pages','Where should we store the Sherlock Catalog Search Tool?','Sherlock.html and it'#39 + 's associated files will be saved in the following folder.'#13#10#13#10 + 'To continue,'New Folder'); { Add item (with an empty caption) } SherlockDirPage.Add(''); { Set initial value (optional) } SherlockDirPage.Values[0] := ExpandConstant('c:\wwwroot\Sherlock'); end; function GetTobyDir(Param: String): String; begin { Return the selected TobyDir } Result := TobyDirPage.Values[0]; end; function GetSherlockDir(Param: String): String; begin { Return the selected TobyDir } Result := SherlockDirPage.Values[0]; end;
解决方法
正如您正确地提到,您需要使用
ShouldSkipPage
事件处理程序来有条件地跳过页面.要检查是否选择某个组件使用
IsComponentSelected
功能,最后获取您需要存储其
ID
的自定义页面的ID.将所有组合放在一起可能会提供以下示例脚本:
[Setup] AppName=My Program AppVersion=1.5 DefaultDirName={pf}\My Program OutputDir=userdocs:Inno Setup Examples Output [Components] Name: "help"; Description: "Help File"; [Code] var CustomPageID: Integer; procedure InitializeWizard; var CustomPage: TInputDirWizardPage; begin CustomPage := CreateInputDirPage(wpSelectComponents,'Caption','Description','SubCaption','NewFolderName'); CustomPage.Add('Input'); { store your custom page ID to further use in the ShouldSkipPage event } CustomPageID := CustomPage.ID; end; function ShouldSkipPage(PageID: Integer): Boolean; begin { initialize result to not skip any page (not necessary,but safer) } Result := False; { if the page that is asked to be skipped is your custom page,then... } if PageID = CustomPageID then { if the component is not selected,skip the page } Result := not IsComponentSelected('help'); end;