Evaluate a collection of data from preprocessor on run time in Inno Setup Pascal Script

断了今生、忘了曾经 提交于 2020-05-28 06:42:29

问题


I am trying to get Inno Setup define value in Code section but not with {#VersionTool1}. I need to pass defined name dynamically, because there are a lot of them (I want to avoid large switch case). I tried SetupSetting but it's not in Setup section (it's before it). Is there any way to do this?

#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;

Value of local variable CurrentTool wil for example be 'VersionTool1' and I want to get value of VersionTool1 preprocessor variable which is 2020.02.2111.


回答1:


It's not possible, see Evaluate preprocessor macro on run time in Inno Setup Pascal Script.


But there are other solutions.

For example:

[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;

(of course, the above makes sense only if you actually do not hardcode the version numbers, but use a code that only a preprocessor can do – something like GetStringFileInfo, what I've understood from your comments that you plan to)


And then you can have a function like:

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


来源:https://stackoverflow.com/questions/60971940/evaluate-a-collection-of-data-from-preprocessor-on-run-time-in-inno-setup-pascal

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!