1

我有一个 TListView 后代,它引入了其他功能,例如从数据集中排序和加载。

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

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

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

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

4

1 回答 1

4

不幸的是,检查事件代码隐藏在消息处理程序中,但它不是一个显示停止器。自己捕捉并处理相同的消息。检测父类的消息处理程序检查的相同条件,然后在那里执行您的自定义操作。之后,调用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;
于 2010-02-09T03:52:42.140 回答