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),“取消”