Запрос пользователя в Inno Setup для файла, который будет использоваться в ярлыке - PullRequest
0 голосов
/ 27 июня 2018

В 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 голосов
/ 27 июня 2018

Должно быть:

[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 для внешнего расположения файла .

И даже если вам нравится диалог, вставьте его на определенную страницу / момент по вашему выбору, кэшируйте имя выбранного файла в глобальную переменную и используйте переменную в MapInfoExecutable.


Обратите внимание, что я удалил ExpandConstant из '{#MapInfoDefault}' - Это чепуха. См. Оценка макроса препроцессора во время выполнения в Inno Setup Pascal Script .

...