首页 > 编程语言 >VST实例(6) 节点(NODE) 特殊节点和节点的增减

VST实例(6) 节点(NODE) 特殊节点和节点的增减

时间:2023-05-29 15:33:25浏览次数:31  
标签:NODE focusednode VST PVirtualNode 焦点 指定 节点 procedure

这一部分在程序中并未直接使用,只是对VST的一些特性进行讲解,不喜欢的可以跳过。

三、特殊节点

1、Rootnode

property RootNode: PVirtualNode;

rootnode不是一个具体的节点,是为了锚定树的层次结构,维护的一个内部树节点,这个节点大部分情况下与其他树节点一样,但有时会有不同的处理。根节点始终是展开和初始化的。它的父成员指向节点所属的树视图,它的PreviousSibling和NextSibling成员指向根节点本身,以便于实际识别出该节点。

您不应该使用根节点来遍历整个树。它只是公开访问的,因为它是所有顶级节点的父节点,并且可以用来测试节点是否为顶级节点。

在VST中,某节点如果是根节点(LEVEL=0),那么就有node.parent=rootnode。可使用此特性来判断节点是否根节点。

2FocusedNode

property FocusedNode: PVirtualNode;

用于读取或设置焦点节点。通常情况下,焦点节点总是selected节点,反之不然。

树视图中只有一个节点可以获得当前输入焦点,标记为该节点标题周围的虚线矩形。获得输入焦点意味着可以通过按F2或单击它来编辑该节点,并且用户键盘输入将与焦点节点相关解释(例如,树导航,展开/折叠等)。如果启用了扩展焦点,则还将考虑FocusedColumn属性。

关于焦点节点,还有两个相关的事件:

property OnFocusChanged: TVTFocusChangeEvent;

用于当焦点节点发生变化之后。TVTFocusChangeEvent = procedure (Sender: TBaseVirtualTree; Node: PVirtualNode; Column: TColumnIndex) of object;过程中的node就是focusednode;

property OnFocusChanging: TVTFocusChangingEvent;

用于当焦点准备发生改变时,可以在此时禁止变更焦点。TVTFocusChangingEvent = procedure (Sender: TBaseVirtualTree; OldNode, NewNode: PVirtualNode; OldColumn, NewColumn: TColumnIndex);

一些老版本用户注意:当我们调用deletenode过程时,参数不能使用focusednode,如果一定要删除焦点节点,应该设置某节点指向focusednode,然后删除该节点。

例如:

VAR NODE:PVIRTUALNODE;

……

node:=vst.focusednode;

Vst.deletenode(node);

同时,我们可以把焦点节点(focusednode)指向某一不存在的节点,但不能直接设置焦点节点为空。

3topnodebottomnode

这两个节点都是可视区域的节点。例如:

procedure TForm2.pnl1Click(Sender: TObject);
begin
   Caption:=pcodes(vst.GetNodeData(vst.TopNode))^.icao;
end;

运行时结果如图:

 

四、增加和删除节点

增加节点的最佳方法是修改rootnodecount和childcount,方法前面已经介绍,下面再讲讲几种其它途径的方法。

function AddChild(Parent: PVirtualNode; UserData: Pointer = nil): PVirtualNode; virtual;

函数addchild可以在指定节点增加最后一个子节点。如果parent=nil,则增加最后一个根节点。

前面提到过,不建议使用AddChild方法。该方法只是为了更容易地从TTreeView迁移。原因是该方法必须验证节点并进行一些其他处理,这会防止树使用其虚拟范例。重要的优势将会消失。如果可能的话,您应该重新设计并尝试使用正确的方法:通过OnInitNode和OnInitChildren。

但如果你确实想使用addchild,请记得处理oninitnode和oninitchildren中的相应处理语句,免得重复处理或出错(例如如果你在事件处理时使用了数据库查询,而在使用addchild时又关闭了数据库,肯定会出错的)。

function InsertNode(Node: PVirtualNode; Mode: TVTNodeAttachMode; UserData: Pointer = nil): PVirtualNode;

函数InsertNode在指定节点的前面或后面插入节点。在前面或后面取决于参数Mode。

参数

作用

amNoWhere 

只是做个测试,实际并不做插入处理

amInsertBefore 

指定节点之前插入一个兄弟节点

amInsertAfter 

指定节点之后插入一个兄弟节点

amAddChildFirst 

插入指定节点的第一个子节点

amAddChildLast 

相当于addchild

procedure DeleteNode(Node: PVirtualNode; Reindex: Boolean = True);

函数DeleteNode用于删除指定节点。如果此节点已经initialized 或者已经指定了data,则在删除时会触发事件onfreenode,在事件中可以处理数据占用的内存。

procedure DeleteSelectedNodes; virtual;

用于删除所有已经selected的节点。

 

标签:NODE,focusednode,VST,PVirtualNode,焦点,指定,节点,procedure
From: https://www.cnblogs.com/luohq001/p/17440614.html

相关文章

  • VST实例(3)绘制VST
    在绘制以及事件中,需要明确两个名词:ITEM,通常指的是node,因为VST中一个节点就是一项。CELL(单元格),通常指的是一个VST下的某具体栏(column)。1、节点图标VST可以链接两组图标,分别是vst.Images;vst.StateImages;vst.Images用于存储VST的通用图标,而vst.StateImages用于存储在不同状......
  • vst实例(2) 创建VST
    前面我们知道,创建一个虚拟树,应该首先告知VST节点数据的大小(即nodedatasize),其实在创建树结构时,这一点并不是必须的,而是如果你需要让VST的每一个节点能指向一定的数据,从而在执行树的操作时,能用到这些数据,那么你最适合的方法是定义一个结构类型(record),然后让node.data指向这个record......
  • sockjs.js:1603 GET http://localhost/sockjs-node/info?t=1685340190468 net::ER
    vue项目报错不影响运行,但控制台看到这报错,属实不舒服 解决方法:进入\node_modules\sockjs-client\dist\sockjs.js注释1603行   刷新页面,没报错了 ......
  • K8s部署单节点Zookeeper并进行监控
    0、写在前面1>K8s监控Zookeeper,这里并没有使用zookeeper-exporter的方式进行监控,主要是由于zookeeper-exporter提供的相关指标不太全,zookeeper官网提供的监控指标信息可参看如下地址:https://github.com/apache/zookeeper/blob/master/zookeeper-server/src/main/java/org/ap......
  • vue3学习中使用vue-router@4的问题Invalid VNode type: undefined (undefined)
    首先是按照常规的箭头函数引入的方法,结果报一下错误,且页面报错constHelloWorld=()=>import('../components/HelloWorld.vue'); 解决办法import{defineAsyncComponent}from'vue'constHelloWorld=defineAsyncComponent(()=>import('../components/HelloWorld.vue......
  • VSTO添加右键菜单
    以Word为例privatevoidAddRightMenu(){Microsoft.Office.Core.CommandBarmzBar=appWord.CommandBars["Text"];//word文档已有的右键菜单TextMicrosoft.Office.Core.CommandBarmzBar=appExcel.CommandBars["cell"];......
  • 《Node.js后端全程实战》自序
    《Node.js后端全程实战》自序《JavaScript全栈开发》:https://book.douban.com/subject/35493728/《Vue.js全平台前端实战》:https://book.douban.com/subject/35886403/《Node.js后端全程实战》:https://book.douban.com/subject/36374893/《Node.js后端全程实战》这本书......
  • Node模块导入规则总结
    @目录node模块总结node模块引入的步骤:模块分类node支持的模块系统ESModuleCommonJS模块加载CommonJS模块引入路径分析文件定位带扩展名的文件定位不带扩展名的文件定位ESM模块引入路径分析文件定位带路径不带路径(裸说明符)模块加载器总结对比CommonJS模块加载器ECMAScript模块加......
  • #yyds干货盘点# LeetCode程序员面试金典:填充每个节点的下一个右侧节点指针
    题目:给定一个 完美二叉树 ,其所有叶子节点都在同一层,每个父节点都有两个子节点。二叉树定义如下:structNode{ intval; Node*left; Node*right; Node*next;}填充它的每个next指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将next指针设置为NUL......
  • K8S常用操作(node)
    原创文档编写不易,未经许可请勿转载。文档中有疑问的可以邮件联系我。邮箱:[email protected]说明K8S常用操作,记录日常K8S维护作用的常用命令及常见的问题的处理办法,提供简单可行的操作、拍掌的思路方法步骤。本文章为k8s的node相关操作篇,指导读者对k8s集群中的node节点进行日常的......