如何在TVirtualStringTree列中显示图标或图像?

时间:2017-05-08 23:35:11

标签: delphi virtualtreeview tvirtualstringtree

在Delphi VCL项目中,我创建了一个包含两列的简单TVirtualStringTree。第一列将包含标识所表示数据的Name的文本。数据记录还包含状态字段。第二列用于表示使用图像(16x16像素)无文本的记录状态。

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

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

  1. 我在OnGetText事件中看到文本是如何分配的,但我应该在哪里指定或更改图像以反映记录中的当前状态?

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

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

2 个答案:

答案 0 :(得分:5)

您需要为TImageList属性分配(在您的情况下为16x16)TVirtualStringTree.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;
  

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

不确定你的意思,因为你声明需要16x16的图像。如果您需要具有可能不同维度的不同图像列表,则可以使用OnGetImageIndexEx。对于可变高度,您可以在toVariableNodeHeight中设置TreeOptions.MiscOptions并处理OnMeasureItem事件。另一种将图形绘制到VTV画布的方法是处理OnBeforeItemPaint / OnAfterItemPaint

答案 1 :(得分:0)

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

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;