Inno Setup ComponentsList OnClick 事件

问题描述 投票:0回答:2

我有一个 Inno Setup 安装程序的组件列表,有 19 个不同的选项,我想为

ONE
组件设置 OnClick 事件。有办法做到这一点吗?或者有没有办法检查哪个组件触发了
OnClick
事件(如果为所有组件设置了该事件)?

目前,

OnClick
事件设置如下:

Wizardform.ComponentsList.OnClick := @CheckChange;

我想做这样的事情:

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

WizardForm.ComponentList
声明为:
TNewCheckListBox

delphi inno-setup pascalscript
2个回答
6
投票

您不想使用

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
调用的检查。


3
投票

或者如果为所有组件设置了 onclick 事件,是否有办法检查哪个组件触发了 onclick 事件?

大多数组件事件都有一个

Sender
参数来指向触发事件的组件对象。 然而,在这种情况下,
Sender
很可能就是
ComponentsList
本身。 根据
ComponentsList
实际声明的内容(
TListBox
等),它可能有一个属性来指定当前正在选择/单击哪个项目(
ItemIndex
等)。 或者它甚至可能有一个单独的事件来报告每个项目的点击次数。 您没有说
ComponentsList
被声明为什么,所以这里没有人可以准确地告诉您要在其中寻找什么。

© www.soinside.com 2019 - 2024. All rights reserved.