当我遇到位于
的自定义列表框示例时,我正在查看RAD Studio xe6附带的所有示例对象Pascal> FireMonkey桌面> CustomListBox
尝试使用它并看看我可以做什么修改,我决定创建一个for循环来获取每个对象的可见或不属性。但事情是,我无法理解以下行的实际含义。
107| Item.StylesData['visible.OnChange'] := TValue.From<TNotifyEvent>(DoVisibleChange); // set OnChange value
它添加了一个onChange事件,但究竟如何呢?什么是TNotifyEvent,我们如何告诉编译器创建一个新事件?
感谢。
答案 0 :(得分:1)
FireMonkey样式框架设计灵活且可扩展。它是在样式化控件层次结构TStyledControl
的根部引入的。这个article简要介绍和解释了设计背后的哲学。
由于样式框架旨在支持许多不同类型的控件,因此显然需要灵活性和可扩展性。所以你看到这样的代码:
StylesData['visible.OnChange'] := ...
StylesData
属性是array property,用字符串索引。声明如下:
property StylesData[const Index: string]: TValue;
TValue
类型是整个RTL中使用的现代变体类型。因此,我们通过允许StylesData
使用变体类型TValue
来保存任何类型的对象,从而获得灵活性。我们通过允许命名索引具有可扩展性。
因此,您引用的控件允许您在其可见性更改时自定义其行为。它通过检查预期为TNotifyEvent
类型的名为visible.OnChange
的样式来实现。我们无法直接提供TNotifyEvent
,我们必须将其包装在TValue
中。因此呼叫TValue<TNotifyEvent>.From()
。