gpt4 book ai didi

inno-setup - 具有多个目标文件夹的 Inno Setup 自定义页面,其行为类似于普通文件夹选择页面

转载 作者:行者123 更新时间:2023-12-04 02:54:00 25 4
gpt4 key购买 nike

我有以下代码(取自 Use two/multiple selected directories from custom page in Files section ):

[Code]
var
DirPage: TInputDirWizardPage;

function GetDir(Param: String): String;
begin
Result := DirPage.Values[StrToInt(Param)];
end;

procedure InitializeWizard;
var
S1, S2: String;
begin
S1 := SetupMessage(msgSelectDirDesc);
StringChangeEx(S1, '[name]', 'ProgramName', false);
S2 := SetupMessage(msgSelectDirLabel3);
StringChangeEx(S2, '[name]', 'ProgramName', false);

{ create a directory input page }
DirPage := CreateInputDirPage(
wpSelectDir, SetupMessage(msgWizardSelectDir), S1, S2, False, '');
{ add directory input page items }
DirPage.Add('Path to Apache:');
DirPage.Add('Path to PHP:');
DirPage.Add('Path to Server Files:');
{ assign default directories for the items from the previously stored data; if }
{ there are no data stored from the previous installation, use default folders }
{ of your choice }
DirPage.Values[0] := GetPreviousData('Directory1', 'C:\Apache');
DirPage.Values[1] := GetPreviousData('Directory2', 'C:\PHP');
DirPage.Values[2] := GetPreviousData('Directory3', 'C:\Apache\htdocs\Server Files');
end;

procedure RegisterPreviousData(PreviousDataKey: Integer);
begin
{ store chosen directories for the next run of the setup }
SetPreviousData(PreviousDataKey, 'Directory1', DirPage.Values[0]);
SetPreviousData(PreviousDataKey, 'Directory2', DirPage.Values[1]);
SetPreviousData(PreviousDataKey, 'Directory3', DirPage.Values[2]);
end;

我想让它的行为类似于传统的文件夹选择页面,因此在选择文件夹时,Inno Setup 应该保留默认文件夹名称,除非用户手动覆盖。即:如果我选择文件夹 "C:\Program Files\",它应该保留原始文件夹,如 "C:\Program Files\PHP""C:\Program Files\Apache"。这可能吗?

最佳答案

要获取 “选择目标位置” 上的浏览 按钮的默认行为(由 AppendDefaultDirName directive 触发),浏览 按钮您的自定义页面,设置这些参数 CreateInputDirPage :

  • AAppendDirTrue
  • ANewFolderName到“默认文件夹名称”

问题是,这会影响所有输入框/按钮。虽然您只想影响第一个输入框/按钮(或者您想要为每个框/按钮设置不同的 ANewFolderName)。


要仅修改某些框的行为,您必须从头开始重新实现它们的功能。尽管未公开浏览对话框功能。只有 BrowseForFolder function ,略有不同。

var
DirPage: TInputDirWizardPage;

procedure NormalBrowseClick(Sender: TObject);
var
Directory: string;
begin
Directory := DirPage.Values[TButton(Sender).Tag];
if BrowseForFolder(SetupMessage(msgWizardSelectDir), Directory, False) then
begin
DirPage.Values[TButton(Sender).Tag] := Directory;
end;
end;

procedure InitializeWizard();
begin
DirPage := CreateInputDirPage(
wpSelectDir, SetupMessage(msgWizardSelectDir), '', '', True, 'Apache');
{ add directory input page items }
DirPage.Add('Path to Apache:');
DirPage.Add('Path to PHP:');
DirPage.Add('Path to Server Files:');

DirPage.Buttons[1].Tag := 1;
DirPage.Buttons[1].OnClick := @NormalBrowseClick;
DirPage.Buttons[2].Tag := 2;
DirPage.Buttons[2].OnClick := @NormalBrowseClick;
{ assign default directories for the items from the previously stored data; if }
{ there are no data stored from the previous installation, use default folders }
{ of your choice }
DirPage.Values[0] := GetPreviousData('Directory1', 'C:\Apache');
DirPage.Values[1] := GetPreviousData('Directory2', 'C:\PHP');
DirPage.Values[2] := GetPreviousData('Directory3', 'C:\Apache\htdocs\Server Files');
end;

要使用相同的“浏览”对话框获得准确的行为,您可以通过调用隐藏的“选择目标位置” 页面或另一个隐藏的功能来破解它 TInputDirWizardPage使用不同的设置 AAppendDir :

var
DirPage: TInputDirWizardPage;
HiddenPage: TInputDirWizardPage;

procedure AppendDirBrowseClick(Sender: TObject);
begin
HiddenPage.Values[0] := DirPage.Values[0];
HiddenPage.Buttons[0].OnClick(HiddenPage.Buttons[0]);
DirPage.Values[0] := HiddenPage.Values[0];
end;

function SkipPage(Sender: TWizardPage): Boolean;
begin
Result := True;
end;

procedure InitializeWizard();
begin
DirPage := CreateInputDirPage(
wpSelectDir, SetupMessage(msgWizardSelectDir), '', '', False, '');

DirPage.Add('Path to Apache:');
DirPage.Add('Path to PHP:');
DirPage.Add('Path to Server Files:');

{ assign default directories for the items from the previously stored data; if }
{ there are no data stored from the previous installation, use default folders }
{ of your choice }
DirPage.Values[0] := GetPreviousData('Directory1', 'C:\Apache');
DirPage.Values[1] := GetPreviousData('Directory2', 'C:\PHP');
DirPage.Values[2] := GetPreviousData('Directory3', 'C:\Apache\htdocs\Server Files');

DirPage.Buttons[0].OnClick := @AppendDirBrowseClick;

HiddenPage := CreateInputDirPage(
wpSelectDir, SetupMessage(msgWizardSelectDir), '', '', True, 'Apache');
HiddenPage.Add('');
HiddenPage.OnShouldSkipPage := @SkipPage;
end;

代码需要 Inno Setup 的 Unicode 版本。打电话HiddenPage.Buttons[0].OnClick奇怪的是在 Ansi 版本中不起作用。

关于inno-setup - 具有多个目标文件夹的 Inno Setup 自定义页面,其行为类似于普通文件夹选择页面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53784498/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com