我在表单上有一个cxTreeView,显示了一些文件的描述。我希望能够选择单击其中一个描述并返回文件名。 为了做到这一点,我需要在树视图中存储一些额外的数据,这是我的问题。
我该怎么做: 存储文件名和描述,只显示描述,但双击?
获取文件名答案 0 :(得分:2)
我认为你可以使用TcxTreeList来完成这项任务(如果可能的话),如果没有迫切需要使用TcxTreeView。在TcxTreeList中,您可以添加新列并将文件名存储在其中。然后使此列不可见。
如果您必须依赖TcxTreeView,则无法在TTreeNodes中直接存储数据(如字符串)。您可以将指向任何对象的指针存储到TTreeNode的属性“Data”中。
答案 1 :(得分:1)
在这两个答案中都提到TcxTreeView
使用标准TTreeNode
,正如Warren首先在his answer
中指出的那样,您可以使用TTreeNode.Data
属性来存储数据。我只想用一个例子来完成这些想法。
<强> 更新 强>
此帖子的先前版本仅适用于自动分配空间的常量字符串。如果您需要将变量传递到TTreeNode.Data
,您必须自己分配并释放内存。以下是使用简单辅助函数的示例。
AddFileNode
帮助函数将Items
的节点添加到ParentNode
中FileDesc
的名称,并分配空格并复制传递的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;