inno-setup - Inno Setup 在自定义复选框之间创建依赖关系

标签 inno-setup pascalscript

我有一个自定义页面SelectPage,我正在其上创建两个自定义复选框。 InitializeWizard 过程中的相关代码部分如下:

//Define the Restart Services Checkbox
  RestartServicesCheckBox := TNewCheckBox.Create(WizardForm);
  with RestartServicesCheckBox do
    begin
      Parent := SelectPage.Surface;
      Caption := 'Restart Services';
      Left := OptionsLabel.Left;
      Top := OptionsLabel.Top + ScaleY(20);
      Checked := True;
    end;
//Define the Restart Server Checkbox
  RestartServerCheckBox := TNewCheckBox.Create(WizardForm);
  with RestartServerCheckBox do
    begin
      Parent := SelectPage.Surface;
      Caption := 'Restart Server';
      Left := OptionsLabel.Left;
      Top := RestartServicesCheckBox.Top + ScaleY(22);
      Checked := False
    end;

这有效,我得到了我想要的复选框,并且它们执行我分配给它们的操作。我正在努力解决的是如何在两者之间分配依赖关系,以便如果选中一个,则自动取消选中另一个。但是,我不想要单选按钮类型依赖性,因为可能需要取消选中两个复选框。我正在考虑尝试拦截 OnClick 事件,如下所示:

var
  DefaultOnClick: TNotifyEvent;

procedure InitializeWizard();
begin
//Store the original OnClick event procedure and assign custom procedure
  DefaultOnClick := WizardForm.TCheckBox.OnClick;
  WizardForm.TCheckBox.OnClick := @OnClick;
end;

//Uncheck and Restart Services if Restart Server is checked and vice versa
procedure UpdateOptions();
begin
  with RestartServicesCheckBox do
    begin
      if RestartServicesCheckBox.Checked then
        begin
          Checked := False;
        end;
    end;
  with RestartServerCheckBox do
    begin
      if RestartServerCheckBox.Checked then
        begin
          Checked := False;
        end;
    end;
end;

//Update the options check boxes if the states change and restore the original event handler procedures
procedure OnClick(Sender: TObject);
begin
  DefaultOnClick(Sender);
  UpdateOptions;
end;

但是,我不知道我需要拦截的完整事件名称是什么。无论如何,它显然不是 WizardForm.TCheckBox.OnClick 。该事件的名称是什么以及该方法是否有效?或者,有没有更简单的方法来做到这一点?

最佳答案

这是您需要使用的TCheckBox.OnClick 事件。

var
  RestartServicesCheckBox: TNewCheckBox;
  RestartServerCheckBox: TNewCheckBox;

procedure RestartServicesCheckBoxClick(Sender: TObject);
begin
  if RestartServicesCheckBox.Checked then
    RestartServerCheckBox.Checked := False;
end;

procedure RestartServerCheckBoxClick(Sender: TObject);
begin
  if RestartServerCheckBox.Checked then
    RestartServicesCheckBox.Checked := False;
end;

procedure InitializeWizard();
begin
  // Define the Restart Services Checkbox
  RestartServicesCheckBox := TNewCheckBox.Create(WizardForm);
  with RestartServicesCheckBox do
  begin
    ...
    Checked := True;
    OnClick := @RestartServicesCheckBoxClick;
  end;

  // Define the Restart Server Checkbox
  RestartServerCheckBox := TNewCheckBox.Create(WizardForm);
  with RestartServerCheckBox do
  begin
    ...
    Checked := False;
    OnClick := @RestartServerCheckBoxClick;
  end;
end;

虽然我认为三个单选按钮可能更好:

  • 不要重新启动
  • 仅重新启动服务
  • 重新启动服务器

关于inno-setup - Inno Setup 在自定义复选框之间创建依赖关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32827139/

相关文章:

xml - 在 Inno Setup 中删除 XML 元素的内容

inno-setup - 如何从 UserInfoPage 中删除或禁用组织框?

checkbox - 如何在InnoSetup向导页面中读取和设置复选框的值?

inno-setup - 根据注册表值决定在 Inno Setup 中安装哪些文件

inno-setup - Inno Setup Code 部分创建隐藏文件

windows - Inno Setup - 卸载程序时从 PATH 环境变量中删除路径

progress-bar - Inno Setup安装进度条未达到100%

windows-installer - 将帮助按钮添加到 InnoSetup 向导页面

inno-setup - 在 Inno Setup 中复制隐藏文件

installation - 使用 Inno Setup 联系许可证 key 服务器?