我想了解如何使用TreeView的Node.Data属性为TreeView设置新的Object类的一些建议或提示。
我知道如何创建可以从.Data属性写入/读取的基本对象类型,我这样做:
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);
这是将数据分配给树节点的一个非常基本的例子,现在我需要帮助和建议,提示等......
从上面的示例中,您可以轻松读取/写入标准属性,如String,Integer,Boolean等。如果包含和读取/写入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数据中。
简而言之:
我想知道如何才能最好地解决这个问题,你能提供什么技巧,最简单的方法是什么?
我可以通过访问ListView Items.Item[x].Data
属性来轻松实现与ListView的编写/读取。使用TreeView获取ListView数据是存在的问题,我不知道如何实现这种行为。
我想知道如何定义类型等方面的建议。
我期待听到你的想法。
答案 0 :(得分:1)
我认为您的困惑在于考虑存储Visual Forms和组件,包括其数据。我相信你可以用流媒体系统做到这一点 - 虽然我没有!我喜欢尽可能将数据和视觉效果分开。
所以你需要一个自定义列表放在MyData中,其中包含需要在列表视图中输入的所有数据和设置,例如MyDataList :(我正在直接输入!)
type
TMyDataViewData = class(TPersistent)
Caption: string;
ImageIndex: Integer;
StateIndex: Integer;
Group: Integer;
MemoData: TStrings;
end;
TMyDataViewDataList = class(TPersistent)
TheList: TObjectList;
property Items[Index:Integer]:MyDataViewData read getItems write SetItems;
property Count: Integer read GetCount;
.
.
.
end;
TMyData = class(TComponent)
private
FString1: String;
FString2: String;
FInteger1: Integer;
private
MyForm: TMyEditform;
published
procedure Edit(Owner: TComponent);
property String1: String read FString1 write FString1;
property String2: String read FString2 write FString2;
property Integer1: Integer read FInteger1 write FInteger1;
property TheDataList: TMyDataViewDataList read fTheDataList write fTheDataList;
end;
procedure TMyData.Edit;
var
F: TMyEditForm;
begin
F:= TMyEditForm.create(Owner);
F.DataList := TheDatalist; // data for listview and memos
F.ShowModal;
.
.
.
end;
然后在你的Treeview中你只需要这样做:
If TreeNode.Data is TMyData then
TMyData(TreeNode.Data).Edit(Self);
编辑完成后,更改树视图节点信息的所有数据都应该在MyData中 所以你可以做到
Node.Text := TMyData(Node.Data).TheDataList.Items[0].Caption;
或
for i := 0 to TMyData(Node.data).TheDataList.Count do
Node.AddChild(TMyData(Node.Data).TheDataList.Items[i].Caption);
您也可以直接将Datalist的属性直接暴露给TMyData:)
等等。那里可能有一些语法错误!答案 1 :(得分:0)
我认为您的方法没有任何问题。你可以让你的数据对象包含一个对象列表(我不知道为什么你在一个与可视组件无关的类中继承TComponent
):
TMyData = class
private
FString : String;
FInteger : Integer;
FItems : TList <TItem> // where TItem is your custom object class
public
// ... properties ...
end;
此列表随后显示在列表框中:
for Item in MyData.Items do
ListBox.Items.AddObject (Item.ToString, Item);
如果你编辑其中一个项目,你会做同样的事情:从列表框的数据中取出对象并将其传递给下一个表格。
希望有所帮助。