当TTreeview结构发生变化时,如何捕获事件



我正在制作TTreeview的子代,并且我希望在TTreeview结构发生变化时在这种情况下实现一个事件。例如,一个TTreeNode从一个位置移动到另一个位置,或者它成为任何其他TTreeNode的子节点。

例如,当我调用时:Treeview1.Selected.MoveTo(ADropNode,naAddChildFirst);无事件触发。

我怎么才能抓到这个?

Thanx。

到目前为止,我还没有发现任何消息,什么可以响应结构的变化。

这种情况下的解决方案是对TTreeNode进行descendand,在这里我覆盖动态过程MoveTo,并为其附加一个事件处理程序:

THierarchyTreeNode = class (TTreeNode)
private
FOnNodeMove:TTVNodeMoveEvent;
public
procedure MoveTo(Destination: TTreeNode; Mode: TNodeAttachMode); override;
property OnNodeMove:TTVNodeMoveEvent read FOnNodeMove write FOnNodeMove;
end;

procedure THierarchyTreeNode.MoveTo(Destination: TTreeNode; Mode: TNodeAttachMode);
begin
inherited;
if Assigned(FOnNodeMove) then FOnNodeMove(Treeview, Self);
end;

然后我在TTreeview descendand中进行了必要的更改,其中过程CreateNode是关键,创建了THierarchyTreeNode而不是TTreenode。它有点脏,但是。。。只是一个例子:

TTreeViewHierarchy = class(TTreeView)
private
FOnNodeMove : TTVNodeMoveEvent;
protected
function CreateNode: TTreeNode; override;
procedure DoNodeMove(Sender: TObject; Node: TTreeNode);
published
property OnNodeMove: TTVNodeMoveEvent read FOnNodeMove write FOnNodeMove;

function TTreeViewHierarchy.CreateNode: TTreeNode;
var
LClass: TTreeNodeClass;
begin
LClass := THierarchyTreeNode;
if Assigned(OnCreateNodeClass) then
OnCreateNodeClass(Self, LClass);
Result := LClass.Create(Items);
(Result as THierarchyTreeNode).FOnNodeMove := DoNodeMove;
end;
procedure TTreeViewHierarchy.DoNodeMove(Sender: TObject; Node: TTreeNode);
begin
if Assigned(FOnNodeMove) then FOnNodeMove(Sender, Node);
end;

它有效。。。

最新更新