2017-05-08 27 views
5

在Delphi VCL项目中,我创建了一个带有两列的简单TVirtualStringTree。第一列将包含识别所代表数据的文本。数据记录还包含一个状态字段。第二列旨在表示使用图像(16x16像素)不带文本的记录状态。如何在TVirtualStringTree的列中显示图标或图像?

我已经搜索了演示,但还没有掌握VTV如何显示节点的完整过程,并且没有成功获取图标以显示在指定列的节点中。

所以我有三个相关的问题:

  1. 我看到的文字是如何在OnGetText事件分配的,但在那里我应该指定或更改图像,以反映我的纪录的现状如何?

  2. 如何让图像实际显示在列中?

  3. 我是否限制图像尺寸,还是可以比图标大?如果是这样,是否需要更改任何设置以调整每一行的高度(如果可能)?

+0

我的问题可能不是很清楚。我希望节点在特定列内的节点级显示。我编辑了这个问题来反映这一点。 – Ashlar

+0

已添加程序代码 – Ashlar

+0

我尝试添加if kind ...行,但仍未看到图标。我还在GIMIMageIndex的开头部署了一个showmessage,发现它在创建节点期间没有被调用,只有当程序运行时我将鼠标移动到节点中。 – Ashlar

回答

5

您需要分配(16×16你的情况)TImageListTVirtualStringTree.Images属性,那么处理事件OnGetImageIndex例如:

procedure TForm1.VirtualStringTree1GetImageIndex(Sender: TBaseVirtualTree; 
    Node: PVirtualNode; Kind: TVTImageKind; Column: TColumnIndex; 
    var Ghosted: Boolean; var ImageIndex: Integer); 
var 
    NodeRec: PNodeRec; 
begin 
    NodeRec := Sender.GetNodeData(Node); 
    if Assigned(NodeRec) then 
    begin 
    if (Column = 1) then 
    begin 
     if Kind in [ikNormal, ikSelected] then 
     begin 
     case NodeRec.Status of // check the needed status(es) 
      1: ImageIndex := 1; // whichever image you need 
      2: ImageIndex := 2; // whichever image you need 
      // ... 
     end; 
     end; 
    end; 
    end; 
end; 

上午我在尺寸有限的图片,也可以是不是图标更大? 如果是的话,我是否需要更改任何设置调整每个 行的高度(如果可能)

不知道你的什么意思,因为你说你需要一个16×16的图像。您可以使用OnGetImageIndexEx,如果您需要不同的图像列表可能具有不同的尺寸。对于可变高度,您可以在TreeOptions.MiscOptions中设置toVariableNodeHeight并处理OnMeasureItem事件。另一种将图形绘制到VTV画布上的方法是例如处理OnBeforeItemPaint/OnAfterItemPaint

+1

我同意并且这样做。 – Ashlar

0

创建图像列表16×16(图像),并使用如下代码:

procedure TMyTreeView.OnDrawTextEx(Sender: TBaseVirtualTree; 
    TargetCanvas: TCanvas; Node: PVirtualNode; Column: TColumnIndex; 
    const Text: string; const CellRect: TRect; var DefaultDraw: Boolean); 
var i: integer; 
begin 
    if (Node <> nil) then 
    begin 
     case Column of 
     cStatusColumn: 
     begin 
      DefaultDraw := false; 

      i := 0; // assign the image index from Images list here 

      if (i <> -1) then 
      begin 
       Images.Draw(TargetCanvas, CellRect.Left + 
        ((CellRect.Width - Images.Width) div 2), CellRect.Top, i); 
      end; 
     end 
     else 
     begin 
      DefaultDraw := true; 
     end; 
     end; 
    end 
    else 
    begin 
     DefaultDraw := true; 
    end; 
end; 
+1

使用组件编辑器并选择树视图组件,我可以生成“onDrawText”,但不生成“onDrawTextEx”事件。从组件中选择事件会为MyForm1生成事件,而不是MyTreeView,我正在使用VitrualStringTree组件。代码中显示的活动所有者是否正确? – Ashlar

+0

TMyTreeView是虚拟树视图的后代类。但是您使用的是组件编辑器,所以在这种情况下,只需将OnDrawTextEx的内容复制/粘贴到OnDrawText事件处理程序中即可。 我的示例与上面的OnGetImageIndex示例不同,因为它将图像居中在列中。 – dwrbudr

相关问题