如何在Inno Setup中安装之前更改defaultdirname参数?

时间:2009-08-19 11:31:25

标签: inno-setup

我想在ssInstall部分更改defaultdirname参数。我怎样才能做到这一点?是否有设置[设置]参数的功能。

3 个答案:

答案 0 :(得分:9)

以下全局对象可用: TMainForm类型的MainForm,TWizardForm类型的WizardForm和TUninstallProgressForm类型的UninstallProgressForm以及一个特殊常量:类型为TControl.Cursor的crHand。

如果你想在向导中设置默认目录,只需像在普通的delphi代码中那样访问它的组件。

例如,将目录设置为自定义值:

WizardForm.DirEdit.Text := 'c:\test';

要读取该值,您可以使用WizardDirValue函数。

我说“只是访问”......但我花了一个小时才弄明白;)

答案 1 :(得分:3)

似乎没有办法通过脚本来改变脚本常量 我认为最好的办法是修改 [Files] 部分中每个条目的目标目录,例如

[Files]
Source: "MYPROG.EXE"; DestDir: "{code:NewTargetDir}"

并派生出你的新安装目录:

[Code]
function NewTargetDir(Param: String): String;
begin
  Result := ExpandConstant('{app}') + '\MySubDir';
end;

由于 NewTargetDir 函数将在实际复制文件之前调用,因此应该可以正常工作。

但是,我认为您应该重新考虑您的方法。首先要求用户指定要安装的目录,然后实际安装到不同的目录,这似乎是你的意图,是错误的方式,IMO。你真的有一个令人信服的理由安装到另一个目录而不是用户指定的目录吗?此外,我的示例代码的结果也可以通过指定

来实现
[Files]
Source: "MYPROG.EXE"; DestDir: "{app}\MySubDir"

不需要任何脚本。如有疑问,请选择更简单的解决方案。

答案 2 :(得分:2)

我有类似的情况,安装程序应用程序从命令行接收安装路径。 我正在使用Jonx提出的解决方案:

WizardForm.DirEdit.Text := 'c:\test';

示例:

function CompareParameter(param, expected: String): Boolean;
begin
  Result := False;
  if Length(param) >= Length(expected) then
  begin
    if CompareText(Copy(param, 1, Length(expected)), expected) = 0 then
    begin
      Result := True;
    end;
  end;
end;

function GetParameter(expectedParam: String): String;
var
  i : LongInt;
begin
  Result := '';
  for i := 0 to ParamCount() do
  begin
    if CompareParameter(ParamStr(i), '/' + expectedParam + '=') then
    begin
      Result := Copy(ParamStr(i), Length(expectedParam) + 3, Length(ParamStr(i)));
      break;
    end;
  end;
end;

procedure InitializeWizard();
var
  newInstallFolder: String;
begin
  newInstallFolder := GetParameter('INSTALL_FOLDER');
  if Length(newInstallFolder) > 2 then
  begin
    if Copy(newInstallFolder, 1, 1) = '"' then
      newInstallFolder := Copy(newInstallFolder, 2, Length(newInstallFolder) - 2)
    if Length(newInstallFolder) > 1 then
      WizardForm.DirEdit.Text := newInstallFolder;
  end;
end;

正在以静默模式从另一个设置启动安装应用。它对我有用。