VST实例(8)编辑

发布时间 2023-05-31 08:51:45作者: Luo大哥

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,不编辑。

如果是情报区,不编辑。

2VST允许编辑

在接收到编辑许可后,还需要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;

运行如下:

编辑前:

 

编辑时:

 

编辑完成后: