我有一个 Inno Setup 安装程序的组件列表,有 19 个不同的选项,我想为
ONE组件设置
OnClick
事件。有办法做到这一点吗?或者有没有办法检查哪个组件触发了 OnClick
事件(如果为所有组件设置了该事件)?
目前,
OnClick
事件设置如下:
Wizardform.ComponentsList.OnClick := @CheckChange;
我想做这样的事情:
Wizardform.ComponentsList.Items[x].OnClick := @DbCheckChange;
WizardForm.ComponentList
声明为:TNewCheckListBox
您不想使用
OnClick
,请使用 OnClickCheck
。
OnClick
被调用用于不更改选中状态的单击(例如在任何项目外部单击;或单击固定项目;或使用键盘更改选择),但主要不为使用键盘的检查调用。
仅当选中状态发生变化时才会调用
OnClickCheck
,并且对于键盘和鼠标都是如此。
要了解用户检查了哪个项目,请使用
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 检测 TasksList.OnClickCheck 事件中更改的任务/项目。虽然使用组件,但也必须触发对
WizardForm.TypesCombo.OnChange
调用的检查。
或者如果为所有组件设置了 onclick 事件,是否有办法检查哪个组件触发了 onclick 事件?
大多数组件事件都有一个
Sender
参数来指向触发事件的组件对象。 然而,在这种情况下,Sender
很可能就是ComponentsList
本身。 根据 ComponentsList
实际声明的内容(TListBox
等),它可能有一个属性来指定当前正在选择/单击哪个项目(ItemIndex
等)。 或者它甚至可能有一个单独的事件来报告每个项目的点击次数。 您没有说 ComponentsList
被声明为什么,所以这里没有人可以准确地告诉您要在其中寻找什么。