我有一个TListView子代,它引入了额外的功能,比如从数据集排序和加载。
现在,我希望修改该类,以便无论何时选中或取消选中某个项,它都会在选中项的内部列表中添加或删除,以便使用组件实例的应用程序可以轻松读取选中项的数量和位置,而无需在列表视图中迭代所有项。
不幸的是,TCustomListView并没有将检查/取消检查操作的处理抽象到我可以重写的某些内部方法(如DoCheck)中,而是将检查逻辑深深地嵌入到一个大型消息处理函数中。
我能想到的将我自己的行为巧妙地引入组件的唯一方法是劫持OnItemChecked属性,使该属性读写FOnItemCheckedUser(例如),而不是FOnItemChecked,将我自己的代码放在FOnItemChecked中,并从我的代码调用FOnItemCheckedUser。
有没有更直接的方法来处理这个问题?如果没有,我的想法是否可行且安全?
不幸的是,check事件代码隐藏在消息处理程序中,但它不是showtupper。自己捕捉并处理相同的消息。检测父类的消息处理程序检查的相同条件,然后在那里执行自定义操作。之后,打电话 inherited
inherited
type TListViewDescendant = class(TListView) private procedure CNNotify(var Message: TMessage); message cn_Notify; end; procedure TListViewDescendant.CNNotify(var Msg: TMessage); begin if IsCheckBoxNotification(Msg) then DoSpecialCheckBoxHandling; inherited; end;