Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 处理在TListView子代中选中的项_Delphi_Listview_Tlistview - Fatal编程技术网

Delphi 处理在TListView子代中选中的项

Delphi 处理在TListView子代中选中的项,delphi,listview,tlistview,Delphi,Listview,Tlistview,我有一个TListView子代,它引入了额外的功能,比如从数据集排序和加载 现在,我希望修改该类,以便无论何时选中或取消选中某个项,它都会在选中项的内部列表中添加或删除,以便使用组件实例的应用程序可以轻松读取选中项的数量和位置,而无需在列表视图中迭代所有项 不幸的是,TCustomListView并没有将检查/取消检查操作的处理抽象到我可以重写的某些内部方法(如DoCheck)中,而是将检查逻辑深深地嵌入到一个大型消息处理函数中 我能想到的将我自己的行为巧妙地引入组件的唯一方法是劫持OnItem

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

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

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

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


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

不幸的是,检查事件代码被隐藏在消息处理程序中,但它不是showtupper。自己捕捉并处理相同的消息。检测父类的消息处理程序检查的相同条件,然后在那里执行自定义操作。之后,调用继承的

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;

不幸的是,check事件代码隐藏在消息处理程序中,但它不是showtupper。自己捕捉并处理相同的消息。检测父类的消息处理程序检查的相同条件,然后在那里执行自定义操作。之后,调用继承的

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;

由于您正在实现其他功能并创建自己的子代,您是否考虑过使用VirtualTreeView而不是TLisView?我刚开始使用VirtualTreeView,但对于我使用list view类所做的工作,TListView更接近我所需要的。由于您正在实现其他功能并创建自己的后代,您是否考虑过使用VirtualTreeView而不是TListView?我刚开始使用VirtualTreeView,但对于我使用list view类所做的工作,TListView更接近我所需要的。谢谢,Rob,我花了几天时间才回到这个话题。处理CN_NOTIFY消息的过程在祖先类(TCustomListView)中是私有的和非虚拟的。我不能直接重写它,但可以用我自己的方法来处理CN\u NOTIFY来屏蔽它。然而,我似乎也不能用继承的“无法访问私有符号TCustomListView.CNNotify”调用祖先方法。好的,我找到了(即,查找)如何在我的后代类中将CNNotify提升为protected,这似乎允许我调用继承的版本。目前正在处理此问题。您不需要覆盖任何内容。编写自己的消息处理程序。使用
消息
指令。祖先方法不需要是可见的。只使用一个简单的继承的
CNNotify
只是一个约定。它可以被命名为任何名称。)现在开始工作了。唯一的问题是,继承的消息处理程序中的代码在绘制列表视图时触发OnItemChecked事件,但这不是我的代码。再次感谢你的帮助。谢谢,罗布,我花了几天时间才回到这个话题上。处理CN_NOTIFY消息的过程在祖先类(TCustomListView)中是私有的和非虚拟的。我不能直接重写它,但可以用我自己的方法来处理CN\u NOTIFY来屏蔽它。然而,我似乎也不能用继承的“无法访问私有符号TCustomListView.CNNotify”调用祖先方法。好的,我找到了(即,查找)如何在我的后代类中将CNNotify提升为protected,这似乎允许我调用继承的版本。目前正在处理此问题。您不需要覆盖任何内容。编写自己的消息处理程序。使用
消息
指令。祖先方法不需要是可见的。只使用一个简单的继承的
CNNotify
只是一个约定。它可以被命名为任何名称。)现在开始工作了。唯一的问题是,继承的消息处理程序中的代码在绘制列表视图时触发OnItemChecked事件,但这不是我的代码。再次感谢你的帮助。