Inno setup Inno安装程序根据所选组件更改AppName

Inno setup Inno安装程序根据所选组件更改AppName,inno-setup,pascalscript,Inno Setup,Pascalscript,我需要安装程序根据(未)选择的组件显示不同的AppName。我试过这个: [设置] AppName={code:GetAppName} AppVersion=1.0 AppVerName=Dagon视频工具 AppId=达贡视频工具 DefaultDirName={sd}\Games\Dagon视频工具 [守则] 函数GetAppName(值:string):string; 变量 CurPageID:整数; 开始 结果:=‘Dagon视频工具’ 如果(CurPageID=wpSelectComp

我需要安装程序根据(未)选择的组件显示不同的
AppName
。我试过这个:

[设置]
AppName={code:GetAppName}
AppVersion=1.0
AppVerName=Dagon视频工具
AppId=达贡视频工具
DefaultDirName={sd}\Games\Dagon视频工具
[守则]
函数GetAppName(值:string):string;
变量
CurPageID:整数;
开始
结果:=‘Dagon视频工具’
如果(CurPageID=wpSelectComponents)和IsComponentSelected('Slasher')和notiscomponentselected('Frankenstein'),那么
开始
结果:=‘Dagon Slasher’;
结束;
如果(CurPageID=wpSelectComponents)和IsComponentSelected('Frankenstein')和notiscomponentselected('Slasher'),那么
开始
结果:=‘达贡·弗兰肯斯坦’;
结束;
如果(CurPageID=wpSelectComponents)和IsComponentSelected('Slasher')和IsComponentSelected('Frankenstein'),那么
开始
结果:=‘达贡视频工具’;
结束;
结束;
但是,正如你所猜测的,这是行不通的。此脚本是否不完整,或者是否应完全以不同的方式执行?

值在(如果有)完成后立即解析(=调用您的
GetAppName
)。这需要很长时间,用户才能更改组件

因此,您不能使
AppName
依赖于所选组件

尽管可以使用自定义值覆盖
AppName
的某些用法,但并非全部。见下文


不过,据我所知,您的问题实际上是关于设置类型的,您可以这样做:

  • 创建自定义“类型”页面(如菜单)作为第一个页面
  • 用户选择“类型”后,使用自定义开关(例如,
    /APPTYPE=slasher
    )重新启动安装程序并退出
  • 使用
    /APPTYPE
    重新运行安装程序后,您从一开始就知道要安装的组件/类型,因此可以正常设置
    AppName
  • 当然,您可以跳过自定义“类型”页面
这实际上是一种更容易实现的方法。唯一的缺点是,在用户选择“类型”后,“重新创建”设置窗口


如果您不想使用上述解决方案,这是原始响应

首先,您对
GetAppName
的实现是错误的。您正在使用未初始化的变量
CurPageID
。无论如何,正如前面提到的,甚至在创建向导窗口之前就调用了
GetAppName
,因此“当前页面”在这里是不相关的

正确的实施方式如下:

函数GetAppName(值:string):string;
开始
如果是IsComponentSelected('Slasher'),而不是IsComponentSelected('Frankenstein'),那么
开始
结果:=‘Dagon Slasher’;
结束
其他的
如果选择了IsComponentSelected('Frankenstein'),而没有选择IsComponentSelected('Slasher'),那么
开始
结果:=‘达贡·弗兰肯斯坦’;
结束
其他的
开始
结果:=‘达贡视频工具’;
结束;
结束;
但是这仍然不能使它在
AppName
指令中工作。稍后我们将在其他上下文中使用它

还请注意,对于,您最好使用而不是
IsComponentSelected


完成标签

只需覆盖
CurPageChanged(wpfished)
中的Inno设置默认文本:

过程CurPageChanged(CurPageID:Integer);
变量
S:字符串;
开始
如果CurPageID=wpFinished,则
开始
S:=设置消息(msgFinishedHeadingLabel);
StringChange,'[name]',GetAppName('');
WizardForm.FinishedHeadingLabel.Caption:=S;
WizardForm.AdjustLabelHeight(WizardForm.FinishedHeadingLabel);
{理想情况下,我们应该在这里向上或向下移动FinishedLabel,}
{如果标题的高度更改。}
{请注意,其他消息(msgFinishedLabelNoIcons或msgfinishedrestabel)}
{用于特殊情况,因此这不是一个完整的解决方案。}
S:=设置消息(msgFinishedLabel);
StringChange,'[name]',GetAppName('');
WizardForm.FinishedLabel.Caption:=S;
WizardForm.AdjustLabelHeight(WizardForm.FinishedLabel);
结束;
结束;

添加/删除程序

那很容易。这有一个问题,只有在我们已经知道所选组件的实际安装过程中才能解决。因此,我们可以在此处使用您的(固定)
GetAppName

[设置]
UninstallDisplayName={code:GetAppName}

是否确实要完全删除
AppName
及其所有组件?

你不能改变这一点。您最好在
AppName
中使用一些通用名称,以便此消息适用于任何组件

或者让消息根本不提及应用程序名称:

[消息]
ConfirmUninstall=您确定要完全删除此游戏吗?
或者完全删除邮件:


正在从计算机中删除
AppName
,请稍候

与向导form.FinishedLabel的解决方案相同。只需使用中的
UninstallProgressForm.PageDescriptionLabel


AppName
已成功从您的计算机中删除

类似于“是否确实要完全删除
AppName
及其所有组件?”

或者将
AppName
设置为通用。或者使用“静默”模式禁用消息,并在中实现您自己的消息。 再一次,看



有关类似的讨论,请参见。

窗口标题-无所谓,FinishedLabel-最好是整个卸载过程-应该更改,添加/删除程序-应该更改。我将立即尝试此操作。至于卸载过程,我需要“您确定要完全删除…”消息,“请稍候,正在从您的计算机上删除
AppName
”(PageDescriptionLabel),“取消”