2

InnoSetupで、インストールされたコンポーネントを表示する完成したページにComboBoxを表示したいと思います。「なし」またはインストールされているコンポーネントのいずれかを選択し、「終了」をクリックすると関連するプログラムを開始できます。

これはこれまでの私のコードです:

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が選択されていない場合、アイテム1はコンポーネント1ではなく、コンポーネント2になります。

アイテムをまったく作成しないのではなく、アイテムを非表示にすることでこれを解決できるのではないかと思いました。

ISヘルプファイルのサポートクラスリファレンスを調べましたが、役立つものは見つかりませんでした。

お返事をお待ちしております!

4

1 に答える 1

0

コンポーネントがバインドされているファイル名と宛先ディレクトリへのアクセスが欠落しているため、これを行う簡単な方法はありません。内部記録にも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;
于 2012-10-11T13:10:59.717 に答える