在Inno Setup中提示用户要在快捷方式中使用的文件

时间:2018-06-27 14:07:56

标签: user-interface inno-setup pascalscript

在Inno Setup中,我尝试创建此快捷方式:

"C:\Program Files (x86)\MapInfo\Professional\MapInfow.exe" "{app}\DPImap.MBX"

它适用于静态文本,但是MapInfow.exe的位置可能有所不同,因此我想向用户询问。

这是我到目前为止所做的,但是快捷方式并未按预期创建

; Default value for silent installion
#define MapInfoDefault AddBackslash(GetEnv("ProgramFiles(x86)")) + "MapInfo\Professional\MapInfow.exe"

[Tasks]
Name: desktopicon; Description: {cm:CreateDesktopIcon}; GroupDescription: {cm:AdditionalIcons}; Flags: unchecked

[Icons]
Name: {group}\DPImap; Filename: {code:MapInfoExecutable} {app}\DPImap.mbx
Name: {userdesktop}\DPImap; Filename: {code:MapInfoExecutable} {app}\DPImap.mbx; Tasks: desktopicon
[Code]    

function MapInfoExecutable(Param: String): String;
var
    FileName: string;
begin
    FileName := '';
    if GetOpenFileName('Locate your MapInfo Application', FileName, ExpandConstant('{pf32}'), 'Executable (*.exe)|*.exe', 'exe') then
        Result := FileName
    else
        { Return default #MapInfoDefault if user does not provide any file }
        Result := ExpandConstant('{#MapInfoDefault}');
end;

如何提供适当的用户对话框?

1 个答案:

答案 0 :(得分:2)

应该是:

[Icons]
Name: {group}\DPImap; Filename: "{code:MapInfoExecutable}"; \
    Parameters: """{app}\DPImap.mbx"""

您还应该缓存选定的文件名,否则您将得到提示至少两次,甚至可能更多次。

var
  FileName: string;

function MapInfoExecutable(Param: String): String;
begin
  if FileName = '' then
  begin
    if not GetOpenFileName(
        'Locate your MapInfo Application', FileName, ExpandConstant('{pf32}'),
        'Executable (*.exe)|*.exe', 'exe') then
    begin
      { Return default #MapInfoDefault if user does not provide any file }
      FileName := '{#MapInfoDefault}';
    end;
  end;
  Result := FileName;
end;

或者实际上更好的方法是使用自定义页面,而不是在无法控制的时刻弹出的对话框。

请参见Inno Setup Prompt for external file location

即使您喜欢该对话框,也可以将其弹出到您选择的特定页面/瞬间,将所选文件名缓存到全局变量中,然后在MapInfoExecutable中使用该变量。


请注意,我已经从ExpandConstant中删除了'{#MapInfoDefault}'-这是胡扯。参见Evaluate preprocessor macro on run time in Inno Setup Pascal Script