在developer Express组件cxTreeView中存储额外数据

时间:2012-06-23 10:07:52

标签: delphi treeview devexpress

我在表单上有一个cxTreeView,显示了一些文件的描述。我希望能够选择单击其中一个描述并返回文件名。 为了做到这一点,我需要在树视图中存储一些额外的数据,这是我的问题。

我该怎么做: 存储文件名和描述,只显示描述,但双击?

获取文件名

3 个答案:

答案 0 :(得分:2)

我认为你可以使用TcxTreeList来完成这项任务(如果可能的话),如果没有迫切需要使用TcxTreeView。在TcxTreeList中,您可以添加新列并将文件名存储在其中。然后使此列不可见。

如果您必须依赖TcxTreeView,则无法在TTreeNodes中直接存储数据(如字符串)。您可以将指向任何对象的指针存储到TTreeNode的属性“Data”中。

答案 1 :(得分:1)

在这两个答案中都提到TcxTreeView使用标准TTreeNode,正如Warren首先在his answer中指出的那样,您可以使用TTreeNode.Data属性来存储数据。我只想用一个例子来完成这些想法。

<强> 更新

此帖子的先前版本仅适用于自动分配空间的常量字符串。如果您需要将变量传递到TTreeNode.Data,您必须自己分配并释放内存。以下是使用简单辅助函数的示例。

AddFileNode帮助函数将Items的节点添加到ParentNodeFileDesc的名称,并分配空格并复制传递的FileName } TTreeNode.Data使用StrNew函数。

当您需要修改数据时,您应该释放(或更好,但有点复杂的是重新分配)已分配的内存并分配空间并复制新值。为此,您可以使用ChangeFileName来处理之前分配的字符串内存并分配空间并复制传递的FileName值。

正如我之前提到的,你需要自己处理内存处理,为此OnDeletion事件是最好的地方。因此,请为此事件编写处理程序,您将在添加项目时释放分配的内存。

function AddFileNode(Items: TTreeNodes; ParentNode: TTreeNode;
  const FileName, FileDesc: string): TTreeNode;
begin
  Result := Items.AddChildObject(ParentNode, FileDesc, StrNew(PChar(FileName)));
end;

function ChangeFileName(TreeNode: TTreeNode; const FileName: string): Boolean;
begin
  Result := False;
  if Assigned(TreeNode.Data) then
  begin
    Result := True;
    StrDispose(PChar(TreeNode.Data));
    TreeNode.Data := StrNew(PChar(FileName));
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  S: string;
begin
  S := 'C:\FileName 1.xxx';
  AddFileNode(cxTreeView1.Items, nil, S, 'File 1');
  S := 'C:\FileName 2.xxx';
  AddFileNode(cxTreeView1.Items, nil, S, 'File 2');
end;

procedure TForm1.cxTreeView1Deletion(Sender: TObject; Node: TTreeNode);
begin
  if Assigned(Node.Data) then
    StrDispose(PChar(Node.Data));
end;

procedure TForm1.cxTreeView1DblClick(Sender: TObject);
var
  CurrentPos: TPoint;
  CurrentNode: TTreeNode;
begin
  CurrentPos := cxTreeView1.ScreenToClient(Mouse.CursorPos);
  if (htOnItem in cxTreeView1.GetHitTestInfoAt(CurrentPos.X, CurrentPos.Y)) then
  begin
    CurrentNode := cxTreeView1.GetNodeAt(CurrentPos.X, CurrentPos.Y);
    if Assigned(CurrentNode) and Assigned(CurrentNode.Data) then
      ShowMessage(PChar(CurrentNode.Data));
  end;
end;

答案 2 :(得分:0)

如果节点是常规的TTreeNode,则可以使用Node对象中的Data:Pointer值。

如果树中的节点类型为TcxTreeListNode,则它们包含存储所需数据值的功能。当我查看源代码时,我在节点级别中看到了这些属性:

property ValueCount: Integer read GetValueCount;
property Values[Index: Integer]: Variant read GetValue write SetValue;