在“消息”文件下的 Inno Setup 帮助中,我发现了这一点:
某些消息采用诸如 %1 和 %2 之类的参数。您可以重新排列参数的顺序(即,将 %2 移动到 %1 之前),也可以根据需要复制参数(即“%1 ... %1 %2”)。在带有参数的消息上,使用两个连续的“%”字符嵌入一个“%”。"%n" 创建一个换行符。
在“自定义消息”下:
消息可以采用参数,从 %1 到 %9。您可以重新排列参数的顺序(即,将 %2 移动到 %1 之前),也可以根据需要复制参数(即“%1 ... %1 %2”)。在带有参数的消息上,使用两个连续的“%”字符嵌入一个“%”。"%n" 创建一个换行符。
但是......对于我的生活,我不知道如何使用这些......到目前为止我已经看到 %1 工作(转换为应用程序名称)但是当我将 %1 更改为 %2(最多 - % 9) 它只是显示为 %2, %3, %4 等等....
我只是好奇 - 我如何使用这些参数,它们被分配在哪里?
干杯,
对于该[Messages]部分,它们是硬编码和特定于消息的,可能没有记录。因为[CustomMessages]它在你身上。
对于该[Messages]部分,这很难回答,因为它在源代码中是硬编码的,并且特定于每条消息,因此它是一种移动目标。如果您在源 *.pas 文件中搜索FmtSetupMessage和FmtSetupMessage1字符串,则可以找到它们。这些是格式化消息以及传递参数的地方。我不知道是否有这方面的文档,所以我会继续搜索源代码。这里有一些关于要搜索的功能。
第一个函数FmtSetupMessage可以接受多个参数,它的调用可以这样读:
FmtSetupMessage(msgSomeMessageId, ['Argument 1', 'Argument 2'])
Run Code Online (Sandbox Code Playgroud)
[]括号中的(逗号分隔的)常量数组是order 中的参数%1..%n。如果msgSomeMessageId消息有翻译,请说:
Lorem %2 ipsum dolor sit %1 amet.
Run Code Online (Sandbox Code Playgroud)
然后使用上面的示例调用将被格式化为:
Lorem Argument 2 ipsum dolor sit Argument 1 amet.
Run Code Online (Sandbox Code Playgroud)
真正的 Inno Setup 源代码中每个参数的含义应该很容易找到,但至少需要 Pascal 语言的基本阅读能力。
在FmtSetupMessage1阅读,因为它仅采用一个参数,则是更容易%1的说法:
FmtSetupMessage1(msgSomeMessageId, 'Argument')
Run Code Online (Sandbox Code Playgroud)
因此,由FmtSetupMessage1函数格式化的消息很可能只包含%1参数。
本[CustomMessages]节的原则是提供一种定义自定义消息的方法,其中包括您传递给它们以格式化输出字符串的参数。因此,您将通过以下任何一种方式传递什么完全取决于您。
在脚本部分,您可以使用{cm:...}常量,您可以在其中将参数作为消息名称后的逗号分隔列表传递。例如这个:
[CustomMessages]
MyMessage=Lorem %2 ipsum dolor sit %1 amet.
[Run]
; ? Name ? %1 ? %2
Filename: "{app}\MyApp.exe"; Description: "{cm:MyMessage,Argument 1,Argument 2}"
Run Code Online (Sandbox Code Playgroud)
将导致此格式化消息:
Lorem Argument 2 ipsum dolor sit Argument 1 amet.
Run Code Online (Sandbox Code Playgroud)
由于{cm:...}常量格式比这更复杂,我会推荐你帮助了解详细信息。
在该[Code]部分中,您可以使用该FmtMessage函数来格式化具有这种参数支持的消息。要获取自定义消息,您可以使用该CustomMessage功能。这是一个与上述结果相同的简短示例:
[CustomMessages]
MyMessage=Lorem %2 ipsum dolor sit %1 amet.
[Code]
procedure InitializeWizard;
var
S: string;
begin
// ? Name ? %1 ? %2
S := FmtMessage(CustomMessage('MyMessage'), ['Argument 1', 'Argument 2']);
MsgBox(S, mbInformation, MB_OK);
end;
Run Code Online (Sandbox Code Playgroud)