Delphi Inno安装程序中的WizardForm.TypesCombo.OnChange(WizardForm.TypesCombo)是什么意思?

Delphi Inno安装程序中的WizardForm.TypesCombo.OnChange(WizardForm.TypesCombo)是什么意思?,delphi,inno-setup,onchange,Delphi,Inno Setup,Onchange,在TComboBox=class(TCustomComboBox)的文档中有以下内容: property OnChange:TNotifyEvent;读写,其中TNotifyEvent=过程(发送方:TObject) 从OnChange没有参数判断,只有返回值。在Delphi中,OnChange事件具有Sender:TObject参数。那么为什么允许输入以下内容?如果它与发送者:TObject不同,这意味着什么 WizardForm.TypesCombo.OnChange(WizardForm.

TComboBox=class(TCustomComboBox)
的文档中有以下内容:

property OnChange:TNotifyEvent;读写,其中
TNotifyEvent=过程(发送方:TObject)

OnChange
没有参数判断,只有返回值。在Delphi中,
OnChange
事件具有
Sender:TObject
参数。那么为什么允许输入以下内容?如果它与
发送者:TObject
不同,这意味着什么

WizardForm.TypesCombo.OnChange(WizardForm.TypesCombo)

(摘自)

向导表单.TypesCombo.OnChange
是一个事件处理程序,当用户在
TypesCombo
中更改所选项目时,VCL(用于构建Inno设置的Delphi GUI库)会调用它。在Inno安装程序源代码中。该实现基于新选择的安装类型更新选定的安装组件


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



WizardForm.TypesCombo.OnChange
属于
TNotifyEvent
类型,因此它具有相同数量的参数。
TNotifyEvent
事件处理程序类型声明指定处理程序接受一个
TObject
参数。当VCL在响应用户操作时触发事件处理程序时,该参数将包含指向该组件的指针。在这种情况下,事件处理程序由多个组件共享。这里的情况并非如此,
TWizardForm.TypesComboChange
实际上根本不使用参数值。但为了保持一致性和未来的兼容性,最好像VCL那样称呼它——TWizardForm.TypesCombo也一样

这就是代码的作用:


WizardForm.TypesCombo.OnChange(WizardForm.TypesCombo);

由于
WizardForm.TypesCombo.OnChange
等于
WizardForm.TypesComboChange
,上述代码与调用相同:

WizardForm.TypesComboChange(WizardForm.TypesCombo);

WizardForm.TypesCombo.OnChange
是类型为
TNotifyEvent
的属性。这是一个具有类型为
TObject
的参数的过程。因此,如果
OnChangeHandler
是一个接受类型为
TObject
的参数的过程,则可以将其分配给此属性。如果您使用它自己的名称
OnChangeHandler
或分配给它的属性
WizardForm.TypesCombo.OnChange
调用它,您必须给它一个
TObject
值,例如
WizardForm.TypesCombo
。这与Delphi中的工作原理相同,只是Delphi中的
TNotifyEvent
不是一个常规过程,而是一个方法过程。基本上,
WizardForm.TypesCombo.OnChange
是一个过程指针,即包含过程(地址)的变量。因此,
WizardForm.TypesCombo.OnChange:=OnChangeHandler
告诉
TypesCombo
每次更改时调用
OnChangeHandler
。而
WizardForm.TypesCombo.OnChange(WizardForm.TypesCombo)
OnChangeHandler(WizardForm.TypesCombo)
是一样的:它以
WizardForm.TypesCombo
作为参数调用这个过程。