2016-05-02 21 views
2

Inno Setupインストーラのコンポーネント一覧は19種類あり、のイベントをONEに設定したいと思います。これを行う方法はありますか?または、すべてのコンポーネントに対して設定されている場合、どのコンポーネントがOnClickイベントをトリガしたかを確認する方法はありますか?Inno Setup ComponentsList OnClickイベント

は現在、OnClickイベントがそうのように設定されている:TNewCheckListBox

答えて

2

OnClickを使用しない場合は、代わりにOnClickChangeを使用してください。

OnClickは、チェック状態(項目外のクリック、固定項目のクリック、キーボードによる選択変更など)を変更しないクリックに対して呼び出されますが、主にキーボードを使用したチェックは呼び出されません。

OnClickChangeは、チェック状態が変更された場合にのみ呼び出され、キーボードとマウスの両方については呼び出されます。

ユーザーがチェックしたアイテムを確認するには、ItemIndexプロパティを使用します。ユーザーは選択した項目のみを確認できます。

コンポーネント階層またはセットアップタイプの場合、子/親アイテムの変更またはセットアップタイプの変更によりインストーラによって自動的にチェックされるアイテムは、OnClickCheck(またはOnClickも) 。したがって、すべての変更を伝えるには、WizardForm.ComponentsList.OnClickCheckまたはWizardForm.TypesCombo.OnChangeが呼び出されたときに、以前の状態を覚えて現在の状態と比較するだけです。より一般的なソリューションについては


const TheItem = 2; { the item you are interested in } var PrevItemChecked: Boolean; TypesComboOnChangePrev: TNotifyEvent; procedure ComponentsListCheckChanges; var Item: string; begin if PrevItemChecked <> WizardForm.ComponentsList.Checked[TheItem] then begin Item := WizardForm.ComponentsList.ItemCaption[TheItem]; if WizardForm.ComponentsList.Checked[TheItem] then begin Log(Format('"%s" checked', [Item])); end else begin Log(Format('"%s" unchecked', [Item])); end; PrevItemChecked := WizardForm.ComponentsList.Checked[TheItem]; end; end; procedure ComponentsListClickCheck(Sender: TObject); begin ComponentsListCheckChanges; end; procedure TypesComboOnChange(Sender: TObject); begin { First let Inno Setup update the components selection } TypesComboOnChangePrev(Sender); { And then check for changes } ComponentsListCheckChanges; end; procedure InitializeWizard(); begin WizardForm.ComponentsList.OnClickCheck := @ComponentsListClickCheck; { The Inno Setup itself relies on the WizardForm.TypesCombo.OnChange, } { so we have to preserve its handler. } TypesComboOnChangePrev := WizardForm.TypesCombo.OnChange; WizardForm.TypesCombo.OnChange := @TypesComboOnChange; { Remember the initial state } { (by now the components are already selected according to } { the defaults or the previous installation) } PrevItemChecked := WizardForm.ComponentsList.Checked[TheItem]; end; 

Inno Setup Detect changed task/item in TasksList.OnClickCheck eventを参照してください。コンポーネントでは、WizardForm.TypesCombo.OnChangeコールのチェックをトリガする必要があります。

+1

です。大変ありがとうございます。 –

1

WizardForm.ComponentListは次のように宣言されている

Wizardform.ComponentsList.Items[x].OnClick := @DbCheckChange; 

Wizardform.ComponentsList.OnClick := @CheckChange; 

のように私が何かをしたいと思いますまたは、すべてのコンプに設定されている場合、どのコンポーネントがonclickイベントをトリガーしたかをチェックする方法がありますonents?

ほとんどのコンポーネントイベントは、イベントを発生させているコンポーネントオブジェクトを指すためにSenderパラメータを持っています。ただし、この場合、SenderはおそらくComponentsListになります。 ComponentsListが実際に(TListBoxなど)として宣言されているかどうかに応じて、現在選択/クリックされている項目を指定するプロパティを持つことがあります(ItemIndexなど)。あるいは、アイテムごとのクリック数を報告する別々のイベントを持つことさえできます。あなたは何がComponentsListとして宣言されているかは言わなかったので、ここでは誰もあなたに何を探すべきかを正確に伝えることはできません。

+0

リストは「TNewCheckListBox」 –