Inno Setup 中的 WizardForm.TypesCombo.OnChange(WizardForm.TypesCombo) 是什么意思?

What does it mean WizardForm.TypesCombo.OnChange(WizardForm.TypesCombo) in Inno Setup?

TComboBox = class(TCustomComboBox) 的文档中是这样的:

property OnChange: TNotifyEvent; read write;,其中 TNotifyEvent = procedure(Sender: TObject);.

由此看来OnChange没有参数,只有返回值。在 Delphi OnChange 事件中有 Sender: TObject 参数。为什么允许键入以下内容,如果它与 Sender: TObject 不同是什么意思?

WizardForm.TypesCombo.OnChange(WizardForm.TypesCombo)

(取自

WizardForm.TypesCombo.OnChange 是一个事件处理程序,当用户更改 TypesCombo 中的选定项目时,由 VCL(Delphi 用于构建 Inno Setup 的 GUI 库)调用。在 Inno Setup 源代码中表示 event handler is assigned to TWizardForm.TypesComboChange method。该实现根据新选择的安装类型更新选定的安装组件。

但是,如果您通过在 Inno Setup 脚本的 Pascal Script 代码中分配 WizardForm.TypesCombo.ItemIndex 来更改选定的设置类型,则不会调用 TWizardForm.TypesComboChange。因此安装组件不会得到更新并且安装程序向导 GUI 将进入不一致状态。要强制更新设置组件选择,您必须在 Pascal 脚本代码中手动触发对 TWizardForm.TypesComboChange 的调用。您不能直接调用该方法,因为它是私有方法,未在 Inno Setup Pascal 脚本中公开。但是由于 WizardForm.TypesCombo.OnChange 持有指向该方法的指针,您可以(并且应该)通过指针调用它。


WizardForm.TypesCombo.OnChangeTNotifyEvent 类型,因此,它具有相同数量的参数。 TNotifyEvent 事件处理程序类型声明指定处理程序采用一个 TObject 参数。当 VCL 在响应用户操作时触发事件处理程序时,该参数将包含指向调用事件处理程序的组件的指针。对于这种情况,事件处理程序由多个组件共享。这里不是什么情况, TWizardForm.TypesComboChange 实际上根本不使用参数值。但是为了一致性和未来的兼容性,最好按照 VCL 的方式来称呼它——所以 TWizardForm.TypesCombo.

以及该代码的作用:

WizardForm.TypesCombo.OnChange(WizardForm.TypesCombo);

因为WizardForm.TypesCombo.OnChange等于WizardForm.TypesComboChange,上面的代码和调用一样:

WizardForm.TypesComboChange(WizardForm.TypesCombo);