8

我正在尝试创建一个TVirtualStringTree类似于以下内容的视图:

具有不同字体颜色的文件夹视图

在上面的例子中,我展示了我想要达到的一些可能的场景。FolderA有粗体文本,之后是同一节点中的红色非粗体文本。我正在寻找进行这种输出的方法。

但是,如果这太难或太难创建,我会对FolderBFolderC类型的输出感到满意 - 这可能由 2 列组成,一个包含文件夹名称,另一个包含里面的文件数。

FolderD在这里只是作为没有文件的文件夹的示例以及该文件夹的输出(文本是非粗体并且没有数字)。

我正在寻找如何产生这种效果的任何方向,因为 VirtualTreeView 似乎每个节点只能有单一颜色或粗体设置。任何提示或建议如何在FolderAFolderBFolderC的方向上移动都非常感谢,所以我有一个起点。欢迎使用 Delphi 或 C++ Builder 示例(尽管最终代码将在 C++ Builder 中)。

4

1 回答 1

13

您可以简单地使用toShowStaticText( StringOptions) 选项:

implementation

type
  PNodeRec = ^TNodeRec;
  TNodeRec = record
    Name: WideString;
    Count: Integer;
    IsBold: Boolean;
  end;

procedure TForm1.FormCreate(Sender: TObject);
var
  Node: PVirtualNode;
  NodeRec: PNodeRec;
  I: Integer;
begin
  VirtualStringTree1.TreeOptions.StringOptions := 
    VirtualStringTree1.TreeOptions.StringOptions + [toShowStaticText];
  VirtualStringTree1.NodeDataSize := Sizeof(TNodeRec);
  // Populate some data
  for I := 1 to 10 do
  begin
    Node := VirtualStringTree1.AddChild(nil);
    NodeRec := VirtualStringTree1.GetNodeData(Node);
    Initialize(NodeRec^);
    NodeRec.Name := 'Node' + IntToStr(I);
    NodeRec.Count := I;
    NodeRec.IsBold := I mod 2 = 0;
  end;
end;

procedure TForm1.VirtualStringTree1GetText(Sender: TBaseVirtualTree;
  Node: PVirtualNode; Column: TColumnIndex; TextType: TVSTTextType;
  var CellText: WideString);
var
  NodeRec: PNodeRec;
begin
  NodeRec := PNodeRec(TVirtualStringTree(Sender).GetNodeData(Node));
  if TextType = ttNormal then
    CellText := NodeRec^.Name
  else // ttStatic
    CellText := Format('(%d)', [NodeRec^.Count]);
end;

procedure TForm1.VirtualStringTree1PaintText(Sender: TBaseVirtualTree;
  const TargetCanvas: TCanvas; Node: PVirtualNode; Column: TColumnIndex;
  TextType: TVSTTextType);
var
  NodeRec: PNodeRec;
begin
  NodeRec := PNodeRec(TVirtualStringTree(Sender).GetNodeData(Node));
  if TextType = ttNormal then
  begin
    if NodeRec^.IsBold then
      TargetCanvas.Font.Style := TargetCanvas.Font.Style + [fsBold];
  end
  else // ttStatic
    TargetCanvas.Font.Color := clRed;
end;

输出:

在此处输入图像描述

于 2014-12-03T16:25:02.640 回答