VST实例(8)编辑
VST的单元格支持编辑,使用普通的编辑很简单,VST提供了一个编辑器,是一个继承自TCUSTOMEDIT的编辑器。
TStringEditLink = class(TInterfacedObject, IVTEditLink);
1、发出编辑请求
向VST发出编辑请求,有以下三种方式:
第一种方式是,VST可以在treeoptions里设置toEditable,可在鼠标放到单元格时,经过EditDelay设置的毫秒后开始编辑;
第二种方式是,也可在点击某单元格后,按键盘的F2,开始编辑。
前面两种编辑是有条件的:selectionoptions里不能包含“toFullRowSelect”。
第三种方式是直接调用函数editnode。
本程序请求编辑是通过双击单元格发出请求。事件是“onNodedbClick”代码如下:
procedure TForm2.vstNodeDblClick(Sender: TBaseVirtualTree; const HitInfo: THitInfo); begin if not Assigned(HitInfo.HitNode) then Exit; if not HitInfo.HitColumn in [0,1,2,4,5] then Exit; if sender.GetNodeLevel(HitInfo.HitNode)=0 then Exit; Sender.EditNode(HitInfo.HitNode,HitInfo.HitColumn); end;
本程序编辑的条件是:
如果没有点中节点,不编辑;
如果column不是指定column,不编辑。
如果是情报区,不编辑。
2、VST允许编辑
在接收到编辑许可后,还需要VST允许才能进行编辑。允许的指令在事件onediting中编写,如果不写代码,自动认可允许编辑。
代码如下:
procedure TForm2.vstEditing(Sender: TBaseVirtualTree; Node: PVirtualNode; Column: TColumnIndex; var Allowed: Boolean); begin Allowed:=(Column in [0,1,3..5]) and (Sender.GetNodeLevel(node)=1); end;
实际条件和前面是一致的。
3、创建编辑器
如果没有代码,自动使用TstringEditLink,在事件“OnCreateEditor ”中写代码。
本程序引用了自写单元editlink,创建编辑器代码如下:
procedure TForm2.vstCreateEditor(Sender: TBaseVirtualTree; Node: PVirtualNode; Column: TColumnIndex; out EditLink: IVTEditLink); var sl:TStringList; begin sl:=TStringList.Create; case Column of 4: begin sl.Add('单跑道'); sl.Add('多跑道'); EditLink:=tcomboeditlink.createof(sl); end; 5: begin sl.Add('主用'); sl.Add('备用'); EditLink:=tcomboeditlink.createof(sl); end; end; FreeAndNil(sl); end;
column是4和5的时候,创建的是下拉选择框,其它时候使用了默认的TstringEditLink。
我们的编辑器是一个combobox的下拉框,需要在创建的时候添加下拉框的items;
4、保存编辑结果
编辑的结果处理在事件“onnewtext”中处理。如果不进行处理,编辑将无视处理结果。
代码如下:
procedure TForm2.vstNewText(Sender: TBaseVirtualTree; Node: PVirtualNode; Column: TColumnIndex; NewText: string); begin with pcodes(Sender.GetNodeData(node))^ do begin case column of 0:icao:=NewText; 1:iata:=NewText; 3:names:=NewText; 4:rwy_style:=NewText; 5:apt_type:=NewText; end; end; end;
运行如下:
编辑前:
编辑时:
编辑完成后: