При создании установщика с помощью InnoSetup может возникнуть необходимость объединить несколько страниц мастера установки в одну, чтобы упростить процесс установки для пользователей. В этой статье мы рассмотрим, как можно достичь этого, используя встроенные директивы InnoSetup или паскаль-скрипт.
Проблема
Пользователь хочет Modify InnoSetup installer, чтобы отобразить на одной странице мастера установки выбор директории программы, группу в меню Пуск и задачу создания ярлыка на рабочем столе, упростив и сделав более элегантным мастера установки. Можно ли это сделать с помощью встроенных директив или требуется использование пользовательского паскаль-скрипта? Есть ли подсказки или ссылки на известный пример, который поможет достичь этого?
Решение
Для достижения этой цели можно использовать tanto встроенные директивы, как и пользовательский паскаль-скрипт. В этом примере мы покажем, как создать пользовательскую страницу мастера установки, которая будет содержать все необходимые контролы и передавать значения в обычные страницы InnoSetup, чтобы выполнить функциональность.
Пример кода на Object Pascal (Delphi) для создания пользовательской страницы мастера установки:
[Code]
Var
CustomSelectDirPage: TWizardPage;
...
function IsCreateDesktopIconChecked(): Boolean;
var
DesktopShortcutCheckBox: TNewCheckBox;
Page: TWizardPage;
begin
Page := PageFromID(CustomSelectDirPage.ID);
DesktopShortcutCheckBox := TNewCheckBox(Page.Surface.Controls[12])
Result := DesktopShortcutCheckBox.Checked;
end;
function CustomSelectDirPageNextButtonClick(Sender: TWizardPage): Boolean;
var
DirExistsWarning: String;
FDirEdit: TEdit;
begin
Result := True;
FDirEdit := TEdit(Sender.Surface.Controls[4]);
DirExistsWarning := LowerCase('{#SetupSetting("DirExistsWarning")}'); // "auto", "true" or "false"
if (DirExistsWarning = 'true') and (DirExists(ExpandConstant(FDirEdit.Text))) then
begin
if MsgBox('The Folder:' + #13#10#13#10 + ExpandConstant(FDirEdit.Text) + #13#10#13#10 +
'already exists. Would you like to install to that folder anyway?', mbConfirmation, MB_YESNO) = IDNO then
Result := false;
end;
end;
procedure CreateCustomSelectDirPage();
var
WizardStyle: String;
// Pages
ThisPage: TWizardPage;
SelectDirPage: TWizardPage;
SelectProgramGroupPage: TWizardPage;
// Custom Controls
DesktopShortcutCheckBox: TNewCheckBox;
// wpSelectDir Controls
FSelectDirBitmapImage: TBitmapImage;
FDiskSpaceLabel: TNewStaticText;
FDirBrowseButton: TButton;
FDirEdit: TEdit;
FSelectDirBrowseLabel: TNewStaticText;
FSelectDirLabel: TNewStaticText;
// wpSelectProgramGroup Controls
FSelectGroupBitmapImage: TBitmapImage;
FNoIconsCheck: TCheckBox;
FGroupBrowseButton: TButton;
FGroupEdit: TEdit;
FSelectStartMenuFolderBrowseLabel: TNewStaticText;
FSelectStartMenuFolderLabel: TNewStaticText;
begin
WizardStyle := LowerCase('{#SetupSetting("WizardStyle")}'); // "classic" or "modern"
// Pages
SelectDirPage := PageFromID(wpSelectDir);
SelectProgramGroupPage := PageFromID(wpSelectProgramGroup);
ThisPage := CreateCustomPage(wpInfoBefore, SelectDirPage.Caption + ' | ' + SelectProgramGroupPage.Caption,
SelectDirPage.Description + #13#10 + SelectProgramGroupPage.Description);
CustomSelectDirPage := ThisPage
// wpSelectDir Control References
FSelectDirBitmapImage := TBitmapImage(SelectDirPage.Surface.Controls[0]);
FDiskSpaceLabel := TNewStaticText(SelectDirPage.Surface.Controls[1]);
FDirBrowseButton := TButton(SelectDirPage.Surface.Controls[2]);
FDirEdit := TEdit(SelectDirPage.Surface.Controls[3]);
FSelectDirBrowseLabel := TNewStaticText(SelectDirPage.Surface.Controls[4]);
FSelectDirLabel := TNewStaticText(SelectDirPage.Surface.Controls[5]);
// wpSelectDir Control Parenting
FSelectDirBitmapImage.Parent := ThisPage.Surface;
FDiskSpaceLabel.Parent := ThisPage.Surface;
FDirBrowseButton.Parent := ThisPage.Surface;
FDirEdit.Parent := ThisPage.Surface;
FSelectDirBrowseLabel.Parent := ThisPage.Surface;
FSelectDirLabel.Parent := ThisPage.Surface;
// wpSelectDir Control Positioning
if WizardStyle = 'classic' then
begin
FSelectDirBrowseLabel.Visible := False;
FDirEdit.Top := FSelectDirLabel.Top + 30;
FDirBrowseButton.Top := FDirEdit.Top;
end;
// wpSelectProgramGroup Control References
FSelectGroupBitmapImage := TBitmapImage(PageFromID(wpSelectProgramGroup).Surface.Controls[0])
FNoIconsCheck := TCheckBox(PageFromID(wpSelectProgramGroup).Surface.Controls[1])
FGroupBrowseButton := TButton(PageFromID(wpSelectProgramGroup).Surface.Controls[2])
FGroupEdit := TEdit(PageFromID(wpSelectProgramGroup).Surface.Controls[3])
FSelectStartMenuFolderBrowseLabel := TNewStaticText(PageFromID(wpSelectProgramGroup).Surface.Controls[4])
FSelectStartMenuFolderLabel := TNewStaticText(PageFromID(wpSelectProgramGroup).Surface.Controls[5])
// wpSelectProgramGroup Control Parenting
FSelectGroupBitmapImage.Parent := ThisPage.Surface;
FSelectStartMenuFolderLabel.Parent := ThisPage.Surface;
FSelectStartMenuFolderBrowseLabel.Parent := ThisPage.Surface;
FGroupEdit.Parent := ThisPage.Surface;
FGroupBrowseButton.Parent := ThisPage.Surface;
FNoIconsCheck.Parent := ThisPage.Surface;
// wpSelectProgramGroup Control Positioning
if WizardStyle = 'modern' then
begin
FSelectGroupBitmapImage.Top := FDirEdit.Top + 70;
FSelectStartMenuFolderLabel.Top := FSelectGroupBitmapImage.Top + 10;
FSelectStartMenuFolderBrowseLabel.Top := FSelectStartMenuFolderLabel.Top + 35;
FGroupEdit.Top := FSelectStartMenuFolderBrowseLabel.Top + 20;
FGroupBrowseButton.Top := FGroupEdit.Top;
FNoIconsCheck.Top := FGroupEdit.Top - 42;
end
else
begin
FSelectStartMenuFolderBrowseLabel.Visible := False;
FSelectGroupBitmapImage.Top := FDirEdit.Top + 70;
FSelectStartMenuFolderLabel.Top := FSelectGroupBitmapImage.Top + 10;
FGroupEdit.Top := FSelectStartMenuFolderLabel.Top + 30;
FGroupBrowseButton.Top := FGroupEdit.Top;
FNoIconsCheck.Top := FGroupEdit.Top + 28;
end;
// Custom Controls
DesktopShortcutCheckBox := TNewCheckBox.Create(ThisPage);
DesktopShortcutCheckBox.Parent := ThisPage.Surface;
DesktopShortcutCheckBox.Top := FDirEdit.Top + 30;
DesktopShortcutCheckBox.Caption := CustomMessage('CreateDesktopIcon');
DesktopShortcutCheckBox.Checked := True;
DesktopShortcutCheckBox.Width := FNoIconsCheck.Width;
ThisPage.OnNextButtonClick := @CustomSelectDirPageNextButtonClick;
end;
Чтобы применить это решение, вам нужно будет добавить в свой скрипт InnoSetup следующие директивы:
DisableDirPage=True
DisableProgramGroupPage=True
И вызвать процедуру CreateCustomSelectDirPage() в разделе [Code] вашего скрипта.
Заключение
Используя встроенные директивы или пользовательский паскаль-скрипт, можно создать упрощенный мастер установки InnoSetup, объединив несколько страниц в одну. В этом примере показано, как создать пользовательскую страницу мастера установки, которая содержит все необходимые контролы и передает значения в обычные страницы InnoSetup, чтобы выполнить функциональность.
Пользователь хочет Modify InnoSetup installer, чтобы отобразить на одной странице мастера установки выбор директории программы, группу в меню Пуск и задачу создания ярлыка на рабочем столе, упростив и сделав более элегантным мастера установки.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.