选择特定组件时,Inno Setup 禁用组件选择

2023-12-04

我希望能够根据所选的特定组件禁用对组件的选择。我无法通过组件嵌套来做到这一点,因为组件需要自行选择,但如果选择了另一个特定组件则不能选择。目前我使用NextButtonClick显示消息的事件:

if IsComponentSelected('Client') and IsComponentSelected('Sync') then
  begin
    MsgBox('A Client installation cannot have the Synchronisation component selected.',
      mbError, MB_OK);
      Result := False;      
  end;

这会阻止用户继续操作,直到取消选择不兼容的组合。但是,如果我可以简单地禁用组件的选择而不是显示消息,那就更优雅了:

if CurPageID = wpSelectComponents then
  begin
    if IsComponentSelected('Client') then
      begin
        WizardForm.ComponentsList.Checked[15] := False;
        WizardForm.ComponentsList.ItemEnabled[15] := False;
      end
    else
      begin
        WizardForm.ComponentsList.ItemEnabled[15] := True;
      end;
  end;

问题是似乎没有一个事件允许它在用户选择或取消选择组件时动态更改。是否有一个事件可以放置此代码或其他方式来执行此操作?


你有 TLama 的解决方案,它可能比下面的更好,但这段代码仍然是实现目标的一种方法(尽管你需要innocallback.dll):

[Setup]
AppName=My Program
AppVersion=1.5
DefaultDirName={pf}\My Program

[Files]
Source: ".\InnoCallback.dll"; DestDir: "{tmp}"; Flags: dontcopy nocompression

[Components]
Name: "Client"; Description: "Client"; Types: custom
Name: "Sync"; Description: "Sync"; Types: custom

[Code]
var
TimerID: Integer;

type
TTimerProc = procedure(Wnd: HWND; Msg: UINT; TimerID: UINT_PTR; 
SysTime: DWORD);
function WrapTimerProc(Callback: TTimerProc; ParamCount: Integer): LongWord;
external 'wrapcallback@files:InnoCallback.dll stdcall';    
function SetTimer(hWnd: HWND; nIDEvent, uElapse: UINT;
lpTimerFunc: UINT): UINT; external '[email protected] stdcall';

function KillTimer(hWnd: HWND; uIDEvent: UINT): BOOL; 
external '[email protected] stdcall'; 

procedure KillComponentsTimer;
begin
  if TimerID <> 0 then 
    begin
      if KillTimer(0, TimerID) then
        TimerID := 1;
    end;
end;

procedure OnComponentsCheck(Wnd: HWND; Msg: UINT; TimerID: UINT_PTR; 
SysTime: DWORD);
begin
    if IsComponentSelected('Client') then begin
        WizardForm.ComponentsList.Checked[1] := False;
        WizardForm.ComponentsList.ItemEnabled[1] := False;
    end
    else begin
        WizardForm.ComponentsList.ItemEnabled[1] := True;
    end;    
    if IsComponentSelected('Sync') then begin
        WizardForm.ComponentsList.Checked[0] := False;
        WizardForm.ComponentsList.ItemEnabled[0] := False;
    end
    else begin 
        WizardForm.ComponentsList.ItemEnabled[0] := True;
    end;
end;

procedure ComponentsCheck();
var
  TimerCallback: LongWord;
begin
  TimerCallback := WrapTimerProc(@OnComponentsCheck, 4);
  TimerID := SetTimer(0, 0, 100, TimerCallback);
end;

procedure CurPageChanged(CurPageID: Integer);
begin
if CurPageID = wpSelectComponents then
  begin
    ComponentsCheck;
  end;
if CurPageID = not wpSelectComponents then 
  begin
   KillComponentsTimer;
  end;
end;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

选择特定组件时,Inno Setup 禁用组件选择 的相关文章

随机推荐

  • 如何使向量的元素唯一? (删除不相邻的重复项)

    我有一个包含一些不相邻重复项的向量 作为一个简单的例子 请考虑 2 1 6 1 4 6 2 1 1 我正在尝试做这个vector通过删除不相邻的重复项并保持元素的顺序来保持唯一性 结果将是 2 1 6 4 我尝试的解决方案是 插入 std
  • 对贝塞尔曲线点进行动画处理

    我正在尝试对用 Paintcode 很棒的应用程序 顺便说一句 制作的贝塞尔曲线进行动画处理 并在 drawRect 方法中的自定义 UIView 中进行绘制 绘图工作正常 但我想为贝塞尔曲线中的单个点设置动画 这是我的非工作方法 void
  • 为什么 ng-content 选择器在 *ngFor 中不起作用

    这是 stackblitz 代码 如你看到的 div div ul number ul div div
  • 已分配值,从未使用过,但没有编译器消息

    整个程序采用 net Web 应用程序的 Web 形式 namespace WebApplication1 public partial class WebForm1 System Web UI Page protected void Pa
  • 从数据库中获取高于平均水平的学生

    我创建了一个视图 其中包含 student full name subject code result Jennifer Higgins CS1234 81 Jennifer Higgins CS1235 90 Kal Penn CS123
  • 致命错误:调用未定义的方法 mysqli::bind_param()

    我在这里挑不出毛病 你帮忙吗 这是我的错误 致命错误 调用未定义的方法 mysqli bind param 我不知道出了什么问题
  • R highcharts 多堆叠条形图

    我想绘制多个堆积条形图 但我不知道如何组合 r 代码 Closing Date Non Current Assets Current Assets Non Current Liabilities 2 2013 12 13637344 130
  • UITableView 从右到左对齐

    我正在为 iphone 3 0 开发一个阿拉伯语应用程序 我想知道是否有一种方法可以将 UITableViewCell 转换为从右到左 我希望一切都向相反的方向发展 有什么想法吗 创建您自己的 UITableViewCell 子类并不难 并
  • ConstraintLayout 对多个水平链的处理方式不同

    我正在尝试设置我认为应该是一个简单的布局ConstraintLayout我有一系列文本条目 其标签的大小可以根据语言的不同而变化 标签右侧有一个屏障 因此即使标签长度发生变化 文本条目也能保持对齐 我希望文本条目具有标称大小 在本示例中 顶
  • 如何在 Python Turtle 中导入图像?

    我想要的是获取一个图像来替换默认的海龟 就像这里所做的那样 http blog trinket io using images in turtle programs 这是我的代码 但我不知道为什么它不起作用 import turtle im
  • 单击通知不会启动活动

    我正在从服务创建通知 显示了通知 但是当我单击它时 没有任何反应 它应该打开一个活动 My code NotificationManager notificationManager NotificationManager getSystem
  • 使用 CORDA 流创建原子事务的最佳方法

    我有一个用例 我需要将数据发送给多个交易对手 但各方需要彼此保持匿名 从交易对手处收回背书后 我需要提交整个交易 整个事务的原子性需要保持 使用 Flows 实现这一目标的最佳方法是什么 为此 您需要使用机密身份 机密身份在状态中由Anon
  • Golang 中的货币格式使用来自 golang.org/x/text/currency 的currency.Symbol

    您好 我正在开发一个以货币格式格式化值的函数 我使用 golang org x text currency 来完成这项工作 但我得到的输出是逗号位置的点 没有千位分隔符 func produto Produto FormataPreco v
  • OSS 许可证插件在启动 OssLicensesMenuActivity 时崩溃

    每个人 我已经使用本教程包含了 Android OSS适用于 Android OSS 许可证的 Google API 进入我的项目 目标sdk版本是27 但我在开始时遇到一个问题Oss许可证菜单活动 我这样做如下 OssLicensesMe
  • 及时只显示一种颜色

    我正在开发油漆应用程序 问题是当我选择颜色和油漆 然后选择不同的颜色时 整个油漆颜色会更改为新颜色 任何人都可以告诉我为什么会发生这种情况以及如何解决这个问题吗 以及如何添加橡皮擦 imageview DrawView在这里 public
  • Switch 语句输出字符串错误

    我遇到了这个基本问题 其中 switch case 与字符串一起使用 Break 语句不在 case 之间使用 但为什么即使它与 case 字符串不匹配 它也会适用于所有 case 所以我很想知道为什么输出是3而不是1 public sta
  • OpenCV 中的形态重建

    在 OpenCV 中处理带有文本的图像时 我的打开操作不会产生正确的输出数据 该问题与本文中描述的问题非常相似 http www cpe eng cmu ac th wp content uploads CPE752 06part2 pdf
  • roadoi 中的 UseMethod("http_error") 错误

    我正在尝试roadoi从 R 访问 Unpaywall 但无论我尝试查询什么 我都会得到以下响应 UseMethod http error 中的错误 没有适用的方法 http error 应用于类 c simpleError error 健
  • C++ 函数地址在附加探查器库中的显示与主题代码库中的显示不同

    我用 C 编写了一个仪器 通过挂钩进入和退出调用来记录进入和退出函数 它按照预期与遗留代码库一起工作 然而 在挂钩我从 git 下载的项目时 我保存在主题代码的 extern 变量中的函数地址 它们在探查器库中的结果是不同的 这扰乱了挂钩函
  • 选择特定组件时,Inno Setup 禁用组件选择

    我希望能够根据所选的特定组件禁用对组件的选择 我无法通过组件嵌套来做到这一点 因为组件需要自行选择 但如果选择了另一个特定组件则不能选择 目前我使用NextButtonClick显示消息的事件 if IsComponentSelected