Пропуск специальных страниц на основе дополнительных компонентов в Inno Setup
В предыдущем вопросе я спросил, как иметь три необязательных компонента, где пользователь может также указать места для каждого компонента отдельно (например, часть кода и два веб-приложения HTML). @Miral дал мне отличный ответ, который я сейчас реализовал:
три компонента в трех пользовательских местах
У меня осталась небольшая эстетическая проблема. Я всегда создаю и спрашиваю пользователя о CreateInputDirPage
в мастере. Вопрос возникает после wpSelectComponents
.
Вопрос. Как пропустить страницу, если компонент не был выбран. То есть, как пропустить мою пользовательскую страницу?
У меня такое чувство, что оно связано с ShouldSkipPage()
. Но я не знаю, что такое PageID
для моей пользовательской страницы, и как проверить, какие компоненты были выбраны.
function ShouldSkipPage (PageID: Integer): Boolean;
Мастер вызывает эту функцию, чтобы определить, должна ли вообще отображаться конкретная страница (заданная PageID). Если вы вернете True, страница будет пропущена; если вы вернете False, страница может быть показана.
Мой script приведен ниже:
[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 + associated files 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) }
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;
Ответы
Ответ 1
Как вы правильно указали, вам необходимо использовать ShouldSkipPage
обработчик событий, чтобы условно пропустить страницу. Чтобы проверить, выбран ли какой-либо компонент, используйте функцию IsComponentSelected
и, наконец, чтобы получить идентификатор вашей пользовательской страницы, вам необходимо сохранить ее ID
. Объединение вместе может привести к следующему примеру script:
[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', False, '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;
Ответ 2
Мне нужно использовать TWizardPageShouldSkipEvent, я сделал только case-and-point script:
[Code]
var
TobyDirPage: TInputDirWizardPage;
function SkipEvent (Sender: TWizardPage): Boolean;
begin
Result := not IsComponentSelected('Toby');
end;
procedure InitializeWizard;
begin
TobyDirPage := CreateInputDirPage(wpSelectComponents, yadda yadda yadda
TobyDirPage.OnShouldSkipPage := @SkipEvent;
end;
Теперь OnShouldSkipPage
срабатывает сразу после нажатия кнопки "Далее" на wpSelectComponents
и до того, как TobyDirPage
будет окрашиваться, и поскольку вы можете прикрепить это событие к самой странице, вам не нужно возиться с PageID.