我有一个TListView后代,它引入了从数据集中排序和加载等附加功能。
我现在希望修改类,以便每当选中或取消选中某个项时,都会在已检查项的内部列表中添加或删除它,以便使用该组件实例的应用程序可以轻松读取已检查项的数量和位置项目,而不必迭代列表视图中的所有项目。
不幸的是,TCustomListView似乎将检查逻辑深入嵌入到大型消息处理函数中,而不是将检查/取消检查操作的处理抽象为我可以覆盖的某个内部方法(如DoCheck)。
我能想到的唯一方法是将我自己的行为整齐地引入组件中是劫持OnItemChecked属性,导致该属性读取和写入FOnItemCheckedUser(例如)而不是FOnItemChecked,将我自己的代码放入FOnItemChecked中,从我的代码中调用FOnItemCheckedUser。
有没有更简单的方法来处理这个问题?如果没有,我的想法是否可行且安全可行?
答案 0 :(得分:4)
很遗憾,检查事件代码隐藏在消息处理程序中,但它不是一个showstopper。自己抓住并处理相同的消息。检测父类的消息处理程序检查的相同条件,然后在那里执行自定义操作。然后,拨打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;