代码之家  ›  专栏  ›  技术社区  ›  Larry Lustig

处理在TListView子代中选中的项

  •  1
  • Larry Lustig  · 技术社区  · 16 年前

    我有一个TListView子代,它引入了额外的功能,比如从数据集排序和加载。

    现在,我希望修改该类,以便无论何时选中或取消选中某个项,它都会在选中项的内部列表中添加或删除,以便使用组件实例的应用程序可以轻松读取选中项的数量和位置,而无需在列表视图中迭代所有项。

    不幸的是,TCustomListView并没有将检查/取消检查操作的处理抽象到我可以重写的某些内部方法(如DoCheck)中,而是将检查逻辑深深地嵌入到一个大型消息处理函数中。

    我能想到的将我自己的行为巧妙地引入组件的唯一方法是劫持OnItemChecked属性,使该属性读写FOnItemCheckedUser(例如),而不是FOnItemChecked,将我自己的代码放在FOnItemChecked中,并从我的代码调用FOnItemCheckedUser。

    有没有更直接的方法来处理这个问题?如果没有,我的想法是否可行且安全?

    1 回复  |  直到 16 年前
        1
  •  4
  •   Rob Kennedy    16 年前

    不幸的是,check事件代码隐藏在消息处理程序中,但它不是showtupper。自己捕捉并处理相同的消息。检测父类的消息处理程序检查的相同条件,然后在那里执行自定义操作。之后,打电话 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;