关于树和节点的问题。
我正在尝试学习 TreeView。另外,我认为这将是初学者学习时的一个很好的指南,因为。信息非常稀缺。
现在有这样一段代码(这是我对组件的最大了解(源代码本身,我也可以把它扔到我需要的地方,以免手动输入。环境D10,启动器)):
阅读了什么以及下面的例子是从哪里编译的
{开始}
http://www.delphisources.ru/forum/showthread.php?t=23601
http://www.cyberforum.ru/delphi-firemonkey/thread1111428.html
http://www.programmersforum.ru/showthread.php?t=192541
加:在某处对电视本身的描述,我记得像“您可以向其中添加物品和对象,但是,在销毁物品之后,对象本身不会被销毁”
{结束}
图片。
编码。
unit Unit1;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, System.ImageList, Vcl.ImgList,
Vcl.StdCtrls, Vcl.ComCtrls;
type
TForm1 = class(TForm)
tv1: TTreeView;
Button1: TButton;
Button2: TButton;
Button3: TButton;
ImageList1: TImageList;
Button4: TButton;
Edit1: TEdit;
Button5: TButton;
Button6: TButton;
procedure Button1Click(Sender: TObject);
procedure tv1Change(Sender: TObject; Node: TTreeNode);
procedure Button4Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure Button5Click(Sender: TObject);
procedure Button6Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
Type
TMyNode=record
nom:integer;
comm:string[100];
end;
TMyNode2 = class
public
nom: Integer;
comm: String;
end;
var
Form1: TForm1;
MyNode:TMyNode;
MyNode2:TMyNode2;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject); // add node
var x: TTreeNode;
begin
x:=tv1.Items.Add(tv1.Selected,edit1.Text+' '+inttostr(round(random(100))));
x.ImageIndex:=1;x.SelectedIndex:=x.ImageIndex;x.StateIndex:=x.ImageIndex;
end;
procedure TForm1.Button4Click(Sender: TObject); // add child node
var x: TTreeNode;
begin
x:=tv1.Items.AddChild(tv1.Selected,'Child '+edit1.Text+' '+inttostr(round(random(100))));
x.ImageIndex:=2;x.SelectedIndex:=x.ImageIndex;x.StateIndex:=x.ImageIndex;
tv1.Selected.Expand(true);x.Selected:=true;x.Expand(true);
end;
procedure TForm1.Button2Click(Sender: TObject); // del node (if not 1st)
var x,y: TTreeNode;
begin
y:=tv1.Items[0];x:=tv1.Selected;
if x<>y then x.Delete else showmessage('Do not del 1st node!');
end;
procedure TForm1.Button3Click(Sender: TObject); // add node (v.2 as object)
var x: TTreeNode;
begin
{ **** // !!!!!!!!!!!!!
MyNode.nom:=1;
MyNode.comm:='mytest comment';
}
MyNode2:=TMyNode2.Create;
MyNode2.nom:=round(random(1000));
MyNode2.comm:=inttostr(MyNode2.nom)+' comment '+inttostr(MyNode2.nom);
x:=tv1.Items.AddObject(tv1.Selected,edit1.Text+' '+inttostr(round(random(1000))),pointer(MyNode2{MyNode})); // **** // !!!!!!!!!!!!!
x.ImageIndex:=3;x.SelectedIndex:=x.ImageIndex;x.StateIndex:=x.ImageIndex;
tv1.Selected.Expand(true);x.Selected:=true;x.Expand(true);
end;
procedure TForm1.Button5Click(Sender: TObject); // add child node (v.2 as object)
var x: TTreeNode;
begin
MyNode2:=TMyNode2.Create;
MyNode2.nom:=round(random(1000));
MyNode2.comm:=inttostr(MyNode2.nom)+' child comment '+inttostr(MyNode2.nom);
x:=tv1.Items.AddChildObject(tv1.Selected,edit1.Text+' '+inttostr(round(random(1000))),pointer(MyNode2));
x.ImageIndex:=4;x.SelectedIndex:=x.ImageIndex;x.StateIndex:=x.ImageIndex;
tv1.Selected.Expand(true);x.Selected:=true;x.Expand(true);
end;
procedure TForm1.Button6Click(Sender: TObject); // del node (if not 1st) and "as" object
var x,y: TTreeNode;
begin
y:=tv1.Items[0];x:=tv1.Selected;
if x<>y then begin
//class(x.tMyNode2(node.Data)).Free; // **** // !!!!!!!!!!!!!!!
x.Delete;
end else showmessage('Do not del 1st node!');
end;
procedure TForm1.FormCreate(Sender: TObject); // on create - add data 2 1st node
var x: TTreeNode;
begin
MyNode2:=TMyNode2.Create;
MyNode2.nom:=100001;
MyNode2.comm:='1st node comment';
x:=tv1.Items[0];
x.Data:=pointer(MyNode2);
end;
procedure TForm1.tv1Change(Sender: TObject; Node: TTreeNode); // look node prop.
begin
if Node=nil then Caption:='Not select' else
if Node.Data=nil then Caption:=Format('Nom: %d, Im.Ind: %d',[Integer(Node.Index),Integer(Node.ImageIndex)])
else
Caption:=Format('Nom: %d, Im.Ind: %d, MyNode.Nom: %d, Comm: %s',[Integer(Node.Index),Integer(Node.ImageIndex),integer(TMyNode2(node.Data).nom), string(TMyNode2(node.Data).comm)]);
end;
end.
在代码中 - 用于添加/删除项目的 2 个选项,正常和对象。 第一个选项没有问题。但是随着第二个的移除 - 是的。
问题:
在 button3.click 中(标有 // **** // !!!!!!!!!!!!!!) - 为什么不能插入到条目的链接,而只能插入到类?描述说“你可以使用对任何对象的引用”
最重要的是,删除对象的问题令人担忧 - 百分比。Button6Click - 它嵌入在那里。插头在哪里。展示如何正确地删除带有一个对象(或仅一个对象)的节点,如果您从树中删除一个项目,该对象是否会保留?
一切都正确吗?我所知道的关于电视的一切都在这里。也许某处有问题?
单独的奖金。
- 如何保存(然后加载)来自 Tv1 的所有节点?因为 Tv1.savetofile('d:\1.txt') 反之亦然,只下载树,没有日期和图片的链接。如果不难。
谢谢你。

没有点击链接。当他使用 TTreeView 时,他在那里使用了 VCL 帮助,恕我直言,所有内容都有足够详细的描述。
你对 OOP 有什么想法吗?我相信如果是这样 - 许多问题就会消失。TTreeView 与所有其他类完全相同。而他的节点也是类。您可以很好地通过继承 TTreeNode 的属性来创建 TMyNode,或者甚至可以使用修改后的 TTreeNode 创建您自己的 TTreeView,它将根据需要存储指向记录的链接,尽管这没有任何物理意义,除非您想要玩弄指针。
一般情况下,为了更好地查看组件的工作原理,只需打开它的模块即可。我认为这会使它更快
对于你的问题: 1 对象是一个类的实例,一条记录是一种数据结构。2 节点只是在树中显示的一个接口,如果要删除一个对象,需要释放它占用的内存:mynode.free or mynode.destroy 节点不负责你创建的对象(以及为什么它应该担心吗?) 3 这个问题显然是反问的
Node.data您可以将任何对象或指针分配给记录。删除一个对象或指针取决于它是如何创建的。也就是说,Dispose(PMyRecord(Node.data));或者TMyClass(Node.Data).Free因此,分配
Node.Data := ^MyRecord;存储Node.data在地址中。Node.data- 只是一个内存地址。当然,如果你删除了它,那么为对象或记录分配的内存就不会去任何地方。编写构建树的单独过程。每个节点都有一个级别,图像(imageindex),文本。所有这些都可以保存为 csv 格式,例如。并且在读取/构建时,根据级别,您需要找到要添加的节点。如果level和当前的level相等,则添加到同层,如果多,则addchild,如果少,则找到上一个同层的parent添加。