Оцените сбор данных из препроцессора во время выполнения в Inno Setup Pascal Script - PullRequest
1 голос
/ 01 апреля 2020

Я пытаюсь получить значение Inno Setup, определенное в разделе Code, но не с помощью {#VersionTool1}. Мне нужно передать определенное имя динамически, потому что их много (я хочу избежать большого случая переключения). Я пытался SetupSetting, но это не в разделе настройки (это до него). Есть ли способ сделать это?

#define VersionTool1 2019.01.1111
#define VersionTool2 2020.02.2111

...

[Code]

procedure SetSelectedTool(ToolName: String);
var
  CurrentTool: string;
begin
  ...
  CurrentTool := 'Version' + ToolName;
  CurrentToolVersion := {#CurrentTool};
  ...
end;

Значение локальной переменной CurrentTool будет, например, 'VersionTool1', и я хочу получить значение VersionTool1 переменной препроцессора, которая 2020.02.2111.

1 Ответ

0 голосов
/ 01 апреля 2020

Это невозможно, см. Оценка макроса препроцессора во время выполнения в Inno Setup Pascal Сценарий .


Но есть и другие решения.

Для пример:

[Code]
var
  ToolNames: TStringList;
  ToolVersions: TStringList;

function InitializeSetup(): Boolean;
begin
  ToolNames := TStringList.Create;
  ToolVersions := TStringList.Create;

  #define AddToolVersion(Name, Version) \
    "ToolNames.Add('" + Name + "'); ToolVersions.Add('" + Version +"');"

  #emit AddToolVersion('Tool1', '2019.01.1111')
  #emit AddToolVersion('Tool2', '2020.02.2111')
  { ... }

  Result := True;
end;

(конечно, вышесказанное имеет смысл только в том случае, если вы фактически не кодируете номера версий жестко, а используете код, который может делать только препроцессор - что-то вроде GetStringFileInfo, что я понял из ваших комментариев, что вы планируете)


И тогда у вас может быть такая функция:

function GetToolVersion(ToolName: string): string;
var
  I: Integer;
begin
  I := ToolNames.IndexOf(ToolName);
  if I >= 0 then Result := ToolVersions[I];
end;
...