我想更改 ssInstall 部分中的 defaultdirname 参数。我怎样才能做到这一点?是否有设置[Setup]参数的功能。
3 回答
以下全局对象可用:TMainForm 类型的 MainForm、TWizardForm 类型的 WizardForm 和 TUninstallProgressForm 类型的 UninstallProgressForm 以及一个特殊常量:TControl.Cursor 类型的 crHand。
如果您想在向导中设置默认目录,只需像在普通 delphi 代码中一样访问它的组件即可。
例如,将目录设置为自定义值:
WizardForm.DirEdit.Text := 'c:\test';
要读取该值,您可以使用 WizardDirValue 函数。
我说'只是访问'......但我花了一个小时才弄清楚;)
似乎没有办法通过脚本更改脚本常量。
我认为您最好的选择是修改[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"
无需任何脚本。如有疑问,请选择更简单的解决方案。
我有类似的情况,安装应用程序从命令行接收安装路径。我正在使用 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;
设置应用程序正在从另一个设置启动,处于静默模式。对我来说效果很好。