- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我使用的是 Delphi 10 Starter 版本。我正在研究如何使用Delphi的TTreeView
组件。
一切正常,没有任何问题。我剩下的唯一问题是:
向节点添加对象后,删除该项目及其对象的正确方法是什么?
这是我的代码(请参阅Button6Click
):
type
TMyNode2 = class
public
nom: Integer;
comm: String;
end;
var
Form1: TForm1;
MyNode2: TMyNode2;
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
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));
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;
最佳答案
使用TreeView的OnDeletion
事件,当 TTreeNode
时触发正在从树中删除:
procedure TForm1.tv1Deletion(Sender: TObject; Node: TTreeNode);
begin
TMyNode2(Node.Data).Free;
// or simply:
// TObject(Node.Data).Free;
end;
因此:
procedure TForm1.Button2Click(Sender: TObject);
// del node (if not 1st)
var
x, y: TTreeNode;
begin
x := tv1.Selected;
if x <> nil then
begin
y := tv1.Items.GetFirstNode;
if x <> y then
x.Delete
else
ShowMessage('Do not del 1st node!');
end;
end;
procedure TForm1.Button6Click(Sender: TObject);
// del node (if not 1st) and its object
var
x, y: TTreeNode;
begin
x := tv1.Selected;
if x <> nil then
begin
y := tv1.Items.GetFirstNode;
if x <> y then
x.Delete
else
ShowMessage('Do not del 1st node!');
end;
end;
如您所见,Button2Click()
和Button6Click()
现在是相同的,因此您可以删除其中之一。除非你真的想要Button2Click()
不释放节点的对象,在这种情况下您可以设置 x.Data
至nil
在调用x.Delete()
之前(您仍然有责任在某个地方跟踪该对象,以便稍后可以释放它,否则它将被泄漏):
procedure TForm1.Button2Click(Sender: TObject);
// del node (if not 1st) but not its object
var
x, y: TTreeNode;
begin
x := tv1.Selected;
if x <> nil then
begin
y := tv1.Items.GetFirstNode;
if x <> y then
begin
x.Data := nil; // <-- !!!
x.Delete;
end else
ShowMessage('Do not del 1st node!');
end;
end;
procedure TForm1.Button6Click(Sender: TObject);
// del node (if not 1st) and its object
var
x, y: TTreeNode;
begin
x := tv1.Selected;
if x <> nil then
begin
y := tv1.Items.GetFirstNode;
if x <> y then
x.Delete
else
ShowMessage('Do not del 1st node!');
end;
end;
关于delphi - 如何从 TTreeView 中删除节点及其对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43599634/
我想将选定的节点及其所有后代从一个 TTreeView 复制到另一个 TTreeView。 实现这一目标的最佳、最有效的方法是什么? 最佳答案 最简单的方法是递归地执行此操作,如下所示: proced
使用 Borland C++ Builder 我有一个带有自行创建的 Breadcrumb 控件的应用程序,位于 TTreeView 控件之上,带有 TListView 控件(alClient 在 T
A.创建一个 Delphi VCL Forms 应用程序。 B.在窗体上放置一个 TTreeView,将其命名为 tvTest 并用项目填充它并设置 Treeview 的大小,以便滚动条在 TreeV
是否可以使用标准 TTreeView 来更改展开和折叠图像? 我指的不是节点图像,而是有子节点旁边的小箭头,如下所示: 理想情况下,我希望箭头显示为 + 和 - 符号,就像 Delphi 组件结构树一
我有一个 TreeView,其中包含项目、客户、运营商和区域等信息组。它们的子项是数据库中每个组的行。每当我双击一个项目时,它都会更改屏幕另一侧的表格,通过我刚刚在 TreeView 中选择的项目过滤
如果 Name 列太窄,Delphi IDE Locals 窗口会剪切局部变量的名称,如下所示: 我想在我的程序中做同样的事情。目前我正在使用 TMS THTMLTreeList,我得到的结果如下所示
我试图在 TreeView 中获取所选节点的所有子节点,但遇到了一些问题。 以这个 TreeView 为例: 我想将所有子节点变为黄色突出显示的“文件夹”节点,这将是旁边有一条蓝线的子节点。 这是我尝
如果我有一个 TTreeView,并且我调用如下内容: myTreeView.Select(nodeIWantSelected); 它被选中,但除非该节点恰好位于当前可见的树部分内,否则我看不到它,并
我使用的是 Delphi 10 Starter 版本。我正在研究如何使用Delphi的TTreeView组件。 一切正常,没有任何问题。我剩下的唯一问题是: 向节点添加对象后,删除该项目及其对象的正确
我有一个对话框,上面有一个 TTreeView 控件以及一个“确定”和“取消”按钮。这些按钮的 Default 和 Canel 属性分别设置为 true,并且 ModalResult 已正确设置。 用
我正在使用Zarko Gajic's Store More (Custom) Data Into The Tree Node Of A Tree View为每个节点项添加额外的字符串,但我发现如果我的
我发现了一个与 TTreeView 相关的错误。 获取一个包含 TTreeView 的表单,并将 HideSelection 设置为 True。 使 TreeView 多选并在 TreeView 中选
我有一个 TTreeView,它可以有很多节点,当展开很多节点时,树会使用大量屏幕空间。 现在假设我想将 TreeView 底部附近的节点拖到顶部,但我实际上看不到 TreeView 的顶部部分,因为
我正在为 TTreeView 实现拖放功能。在其 OnStartDrag 事件中,我正在创建派生类的 DragOcject: TTreeDragControlObject = class(TDra
当这样监听TTreeView事件的AdvancedCustomDraw事件时: if Stage = cdPrePaint then begin // modify some Sender.C
我有一个 TTreeView,它可以有很多节点,当展开很多节点时,树会使用大量屏幕空间。 现在假设我想将 TreeView 底部附近的节点拖到顶部,但我实际上看不到 TreeView 的顶部部分,因为
我想在我的安装程序中的页面中添加一个 TreeView 控件并搜索了 inno setup help对于 TTreeView 类,但只找到了 TFolderTreeView 和 TStartMenuF
我的表单上有一个 TTreeView,它有很多 TTreeViewItem 节点。 我想仅在用户展开其中一个TTreeViewItem节点时调用某些函数(这并不一定意味着用户“选择”了其中一个节点)
我有一个包含可编辑项目的 TreeView。当我在选择后按 F2 或单击任何项目时,就地编辑器出现。 如何在显示之前更改该编辑器中显示的文本?例如,我的树项的文本是 Point 1 (300, 4
使用 TreeNode.MoveTo(...) 方法有时无法正常工作并引发“访问冲突”异常。 大多数时候有效,有时无效。 大多数情况下,“COMCTL32.DLL 模块中存在访问冲突”。读取地址 FE
我是一名优秀的程序员,十分优秀!