【发布时间】:2011-09-18 18:51:11
【问题描述】:
我想要一些关于如何使用 TreeView 的 Node.Data 属性为 TreeView 设置新对象类的建议和/或提示。
我知道如何创建一个可以从 .Data 属性写入/读取的基本 Object 类型,我会这样做:
type
TMyData = class(TComponent)
private
FString1: String;
FString2: String;
FInteger1: Integer;
published
property String1: String read FString1 write FString1;
property String2: String read FString2 write FString2;
property Integer1: Integer read FInteger1 write FInteger1;
end;
将值写入 Node.Data 属性之一:
TMyData(TreeView1.Selected.Data).String1:= 'save this String';
读取值:
ShowMessage(TMyData(TreeView1.Selected.Data).String1);
这是将数据分配给树节点的一个非常基本的示例,现在这是我需要帮助和建议、提示等的地方...
从我上面的示例中,您可以轻松地读取/写入标准属性,例如字符串、整数、布尔值等。包含和读取/写入 TListBox 或 TListView 怎么样?
与其将标准数据写入树节点,不如将项目添加到该 TListView 并将该 TListView 的内容写入 TreeView 节点。
如果单击其中一个树节点时,它不会返回字符串,而是使用之前保存的项目和图像填充该 TListView。
(1) 这是您可以将节点添加到 TreeView 的主要形式。我实际上使用了一个更增强的功能来添加到我的 TreeView 中,如下所示:
function AddMyDataNode(ATreeView: TTreeView; NodeName: String; NodeImage: Integer;
String1, String2: String; Integer1: Integer;
SelectNode: Boolean): TTreeNode;
var
Obj: TMyData;
Node: TTreeNode;
begin
Result:= nil;
Obj:= TMyData.Create(nil);
try
Obj.String1:= String1;
Obj.String2:= String2;
Obj.Integer1:= Integer1;
Node:= ATreeView.Items.AddObject(ATreeView.Selected, NodeName, Obj);
Node.ImageIndex:= NodeImage;
Node.SelectedIndex:= NodeImage;
Result:= Node;
if SelectNode then
Node.Selected:= True;
ATreeView.SetFocus;
except on E: Exception do
ShowMessage('Could not add MyData Node: ' + E.Message);
end;
end;
编辑节点将显示另一个称为数据表单的表单...:
(2) 此数据表单是读取/写入来自主表单上的节点的数据的位置。添加了一个 TListView。 ListView 也应该使用标准属性读取/保存。
添加/编辑 ListView 项可能包括其他标准属性,例如:
(3) 此表单上的值保存到 ListView 数据中。
简而言之:
- TreeView Node.Data 存储 标准属性,也是一个 TListView。
- 此数据以另一种形式显示 称为数据表单。
- 数据表单上的 ListView 也 有数据。
- 在数据表单上编辑 ListView 将显示一个额外的表格 标准属性。
我想知道如何最好地解决这个问题,您可以提供哪些提示,实现此类目标的最简单方法是什么?
ListView 的写入/读取很容易实现,我想这可以通过访问ListView Items.Item[x].Data 属性来完成。让 ListView 数据与 TreeView 一起存储是问题所在,我不知道如何实现这种行为。
我想了解有关如何定义类型等方面的建议。
我期待听到您对此的想法。
【问题讨论】:
-
您当前将对象引用放入
Data属性的方法可以很好地扩展。您只需要继续添加到TMyData。另一种选择是继承TTreeNode并使用TTreeView.OnCreateNodeClass。 -
我只是对如何设置/获取 ListView 数据以与 TreeView 数据协调工作感到困惑。编辑每个树节点以显示数据表单将始终具有不同的 ListView 项。标准属性好办,ListView比较难。
-
为什么列表视图更难?我不明白。
-
不应该,我编辑了我的问题以更清楚地说明这个问题,也许问题没有被正确理解。因为 ListView 也会使用数据,例如 Items.Item[x].Data,所以这个 ListView 数据也必须读/写到 TreeView 的 Node.Data 属性中。我一定是在迷惑自己或其他什么,因为我没有找到简单的答案。
-
我不知道你为什么不只是在
TMyData中添加一个列表视图字段,但我必须承认你的问题太长了,我每次尝试从上到下阅读它时都会呆滞底部!也许别人比我更有耐力!