gpt4 book ai didi

delphi - 关于设置新 TreeView 数据类型的建议

转载 作者:行者123 更新时间:2023-12-03 15:58:42 81 4
gpt4 key购买 nike

我想要一些关于如何使用 TreeView 的 Node.Data 属性为 TreeView 设置新对象类的建议和/或提示。

我知道如何创建一个可以从 .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);

这是将数据分配给树节点的一个非常基本的示例,现在这是我需要帮助、建议、提示等的地方......

从上面的示例中,您可以轻松地读取/写入标准属性,例如字符串、整数、 bool 值等。包含 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 一起存储是问题所在,我不知道如何实现这种类型的行为。

我想知道有关如何定义类型等问题的建议。

我期待听到您对此的想法。

最佳答案

我认为您的困惑在于考虑存储视觉表单和组件(包括其数据)。我相信你可以使用流媒体系统来做到这一点 - 尽管我从来没有这样做过!我喜欢将数据和视觉效果尽可能分开。

因此,您需要一个自定义列表来放入 MyData,其中包含需要进入 ListView 的所有数据和设置,例如 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);

编辑后,用于更改 TreeView 节点信息的所有数据应位于 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 :)

诸如此类。可能有一些语法错误!

关于delphi - 关于设置新 TreeView 数据类型的建议,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6413228/

81 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com