InnoSetup动态组合框,检查选择哪个项目并执行程序
在InnoSetup中,我想显示已完成页面上的组合框,它显示已安装的组件。 您可以选择“无”或任何已安装的组件,并在点击完成时启动相关程序。InnoSetup动态组合框,检查选择哪个项目并执行程序
这是我到目前为止的代码:
procedure CurPageChanged(CurPageID: Integer);
var
NewComboBox1: TNewComboBox;
begin
if (CurPageID = wpFinished) then begin
NewComboBox1 := TNewComboBox.Create(WizardForm);
with NewComboBox1 do begin
Parent := WizardForm.FinishedPage;
Left := ScaleX(256);
Top := ScaleY(208);
Width := ScaleX(145);
Height := ScaleY(21);
ItemIndex := 0;
Style := csDropDownList;
Items.Add('None');
if IsComponentSelected('1') then
Items.Add('Component 1');
if IsComponentSelected('2') then
Items.Add('Component 2');
if IsComponentSelected('3') then
Items.Add('Component 3');
end;
end;
end;
首先,我想设置为“无”自动选择。当页面显示时。我查了很多Pascal论坛,但没有任何解决方案,像NewComboBox1.ItemSelected = 0(或类似的,不记得没错......)。那么我如何实现这一目标呢?
然后我不知道如何使程序启动时点击完成。我以为
function NextButtonClick
可能会帮助,但没有下一步按钮在设置工作。
也许还有一个问题,因为根据选择了哪些组件创建了列表,所以如果没有选择组件1但未选择组件2,则项目1不是组件1。
我以为人们可以通过使物品不可见而不是根本不创造它来解决这个问题。
我查看了IS帮助文件中的支持类参考,但没有找到任何有助于我的内容。
我期待您的回答!
由于缺少访问组件绑定到的文件名和目标目录的缺少访问权限,因此没有简单的方法。即使TSetupComponentEntry
内部记录不包含此信息,但即使会,您也将无法访问它。因此,以下脚本使用其自己的单独数组,其中包含此任务所需的组件/文件链接:
[Setup]
AppName=My Program
AppVersion=1.5
DefaultDirName={pf}\My Program
[Components]
Name: "program_32"; Description: "Program 32-bit"
Name: "program_x64"; Description: "Program 64-bit"
Name: "program_ia64"; Description: "Program IA 64-bit"
[Files]
Source: "MyProg.exe"; DestDir: "{app}"; Components: program_32
Source: "MyProg-x64.exe"; DestDir: "{app}"; Components: program_x64
Source: "MyProg-IA64.exe"; DestDir: "{app}"; Components: program_ia64
[Code]
type
TFileData = record
Component: string;
Description: string;
FileName: string;
Parameters: string;
end;
var
ComponentCombo: TNewComboBox;
ComponentArray: array of TFileData;
SelectionArray: array of TFileData;
procedure InitializeWizard;
begin
// this is a weakness of this solution - you need to fill the array
// of components that can be added to the final combo box when they
// are selected on component selection page. This is needed because
// you can't get neither file name nor destination directory of the
// file for the component from script. As first, set how many items
// you want to add to your component array storage
SetArrayLength(ComponentArray, 2);
// the Component member must match to the "Name" parameter from the
// [Components] section item since it's used in IsComponentSelected
// function call
ComponentArray[0].Component := 'program_32';
// the Description member is the text displayed in the combo item
ComponentArray[0].Description := 'Program 32-bit';
// the FileName member is the name of the file including path. This
// member may contain InnoSetup constants
ComponentArray[0].FileName := '{app}/MyProg.exe';
// the Parameters member contains execution parameters
ComponentArray[0].Parameters := '-a';
// this is the second item that can be added to the combo box, note
// that the program_ia64 component is not added to this array, what
// means, that it cannot be added to the "run" combo box. It's such
// kind of a filter for components like help files etc.
ComponentArray[1].Component := 'program_x64';
ComponentArray[1].Description := 'Program 64-bit';
ComponentArray[1].FileName := '{app}/MyProg-x64.exe';
ComponentArray[1].Parameters := '-b';
end;
procedure CurPageChanged(CurPageID: Integer);
var
I: Integer;
begin
if (CurPageID = wpFinished) then
begin
ComponentCombo := TNewComboBox.Create(WizardForm);
ComponentCombo.Parent := WizardForm.FinishedPage;
ComponentCombo.Left := ScaleX(256);
ComponentCombo.Top := ScaleY(208);
ComponentCombo.Width := ScaleX(145);
ComponentCombo.Height := ScaleY(21);
ComponentCombo.Style := csDropDownList;
ComponentCombo.Items.Add('None');
for I := 0 to GetArrayLength(ComponentArray) - 1 do
if IsComponentSelected(ComponentArray[I].Component) then
begin
ComponentCombo.Items.Add(ComponentArray[I].Description);
SetArrayLength(SelectionArray, GetArrayLength(SelectionArray) + 1);
SelectionArray[High(SelectionArray)] := ComponentArray[I];
end;
ComponentCombo.ItemIndex := 0;
end;
end;
function NextButtonClick(CurPageID: Integer): Boolean;
var
FileData: TFileData;
ResultCode: Integer;
begin
Result := True;
if (CurPageID = wpFinished) and (ComponentCombo.ItemIndex > 0) then
begin
FileData := SelectionArray[ComponentCombo.ItemIndex - 1];
Exec(ExpandConstant(FileData.FileName), FileData.Parameters, '', SW_SHOW,
ewNoWait, ResultCode);
end;
end;
哇!感谢您的努力!我只是想尝试它,但得到一个错误: 行185: 列24: 未知标识符'高'....它在行“SelectionArray [High(SelectionArray)]:= ComponentArray [I];” – user1662035
不客气!我已经在Unicode InnoSetup 5.5.1中测试过这个脚本,此时最新的版本应该是什么,所以也许它不在一些老版本中。 – TLama
甚至有更新的版本,5.5.2,但我有非Unicode版本...我安装IS-Unicode,然后它的工作!再次感谢你! – user1662035
您正在设置'ItemIndex'太早。您需要提供组合框,然后设置项目索引。因为没有索引为0的项目,因此在当前代码中默认设置ItemIndex失败。 – TLama
好吧,我在最后设置ItemIndex,现在None会自动显示!感谢你!现在我只需要知道如何获得所选项目的值... – user1662035
您不打算获得*值*,您想要打开在组合框中选择的组件后面的文件* don你呢? – TLama