RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 658058
Accepted
Gu.
Gu.
Asked:2020-04-25 04:26:02 +0000 UTC2020-04-25 04:26:02 +0000 UTC 2020-04-25 04:26:02 +0000 UTC

树视图、添加对象、删除对象

  • 772

关于树和节点的问题。

我正在尝试学习 TreeView。另外,我认为这将是初学者学习时的一个很好的指南,因为。信息非常稀缺。

现在有这样一段代码(这是我对组件的最大了解(源代码本身,我也可以把它扔到我需要的地方,以免手动输入。环境D10,启动器)):

阅读了什么以及下面的例子是从哪里编译的

{开始}

http://www.delphisources.ru/forum/showthread.php?t=23601

http://www.cyberforum.ru/delphi-firemonkey/thread1111428.html

http://itearn.ru/goto/349

http://www.programmersforum.ru/showthread.php?t=192541

加:在某处对电视本身的描述,我记得像“您可以向其中添加物品和对象,但是,在销毁物品之后,对象本身不会被销毁”

{结束}

图片。

http://s013.radikal.ru/i322/1704/de/12b0c557e580.png

编码。

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 个选项,正常和对象。 第一个选项没有问题。但是随着第二个的移除 - 是的。

问题:

  1. 在 button3.click 中(标有 // **** // !!!!!!!!!!!!!!) - 为什么不能插入到条目的链接,而只能插入到类?描述说“你可以使用对任何对象的引用”

  2. 最重要的是,删除对象的问题令人担忧 - 百分比。Button6Click - 它嵌入在那里。插头在哪里。展示如何正确地删除带有一个对象(或仅一个对象)的节点,如果您从树中删除一个项目,该对象是否会保留?

  3. 一切都正确吗?我所知道的关于电视的一切都在这里。也许某处有问题?

单独的奖金。

  1. 如何保存(然后加载)来自 Tv1 的所有节点?因为 Tv1.savetofile('d:\1.txt') 反之亦然,只下载树,没有日期和图片的链接。如果不难。

谢谢你。

delphi
  • 2 2 个回答
  • 10 Views

2 个回答

  • Voted
  1. asg
    2020-04-25T09:33:37Z2020-04-25T09:33:37Z

    没有点击链接。当他使用 TTreeView 时,他在那里使用了 VCL 帮助,恕我直言,所有内容都有足够详细的描述。

    你对 OOP 有什么想法吗?我相信如果是这样 - 许多问题就会消失。TTreeView 与所有其他类完全相同。而他的节点也是类。您可以很好地通过继承 TTreeNode 的属性来创建 TMyNode,或者甚至可以使用修改后的 TTreeNode 创建您自己的 TTreeView,它将根据需要存储指向记录的链接,尽管这没有任何物理意义,除非您想要玩弄指针。

    一般情况下,为了更好地查看组件的工作原理,只需打开它的模块即可。我认为这会使它更快

    对于你的问题: 1 对象是一个类的实例,一条记录是一种数据结构。2 节点只是在树中显示的一个接口,如果要删除一个对象,需要释放它占用的内存:mynode.free or mynode.destroy 节点不负责你创建的对象(以及为什么它应该担心吗?) 3 这个问题显然是反问的

    • 1
  2. Best Answer
    Albert Fomin
    2020-04-25T14:30:50Z2020-04-25T14:30:50Z
    1. Node.data您可以将任何对象或指针分配给记录。删除一个对象或指针取决于它是如何创建的。也就是说,Dispose(PMyRecord(Node.data)); 或者TMyClass(Node.Data).Free

    因此,分配Node.Data := ^MyRecord;存储Node.data在地址中。

    1. Node.data- 只是一个内存地址。当然,如果你删除了它,那么为对象或记录分配的内存就不会去任何地方。

    2. 编写构建树的单独过程。每个节点都有一个级别,图像(imageindex),文本。所有这些都可以保存为 csv 格式,例如。并且在读取/构建时,根据级别,您需要找到要添加的节点。如果level和当前的level相等,则添加到同层,如果多,则addchild,如果少,则找到上一个同层的parent添加。

    • 1

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    Python 3.6 - 安装 MySQL (Windows)

    • 1 个回答
  • Marko Smith

    C++ 编写程序“计算单个岛屿”。填充一个二维数组 12x12 0 和 1

    • 2 个回答
  • Marko Smith

    返回指针的函数

    • 1 个回答
  • Marko Smith

    我使用 django 管理面板添加图像,但它没有显示

    • 1 个回答
  • Marko Smith

    这些条目是什么意思,它们的完整等效项是什么样的

    • 2 个回答
  • Marko Smith

    浏览器仍然缓存文件数据

    • 1 个回答
  • Marko Smith

    在 Excel VBA 中激活工作表的问题

    • 3 个回答
  • Marko Smith

    为什么内置类型中包含复数而小数不包含?

    • 2 个回答
  • Marko Smith

    获得唯一途径

    • 3 个回答
  • Marko Smith

    告诉我一个像幻灯片一样创建滚动的库

    • 1 个回答
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Алексей Шиманский 如何以及通过什么方式来查找 Javascript 代码中的错误? 2020-08-03 00:21:37 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    user207618 Codegolf——组合选择算法的实现 2020-10-23 18:46:29 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5