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帮助文件中的支持类参考,但没有找到任何有助于我的内容。

我期待您的回答!

+0

您正在设置'ItemIndex'太早。您需要提供组合框,然后设置项目索引。因为没有索引为0的项目,因此在当前代码中默认设置ItemIndex失败。 – TLama

+0

好吧,我在最后设置ItemIndex,现在None会自动显示!感谢你!现在我只需要知道如何获得所选项目的值... – user1662035

+0

您不打算获得*值*,您想要打开在组合框中选择的组件后面的文件* don你呢? – TLama

由于缺少访问组件绑定到的文件名和目标目录的缺少访问权限,因此没有简单的方法。即使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; 
+0

哇!感谢您的努力!我只是想尝试它,但得到一个错误: 行185: 列24: 未知标识符'高'....它在行“SelectionArray [High(SelectionArray)]:= ComponentArray [I];” – user1662035

+0

不客气!我已经在Unicode InnoSetup 5.5.1中测试过这个脚本,此时最新的版本应该是什么,所以也许它不在一些老版本中。 – TLama

+1

甚至有更新的版本,5.5.2,但我有非Unicode版本...我安装IS-Unicode,然后它的工作!再次感谢你! – user1662035