更改树视图项文本(Delphi XE)

时间:2013-06-08 18:43:42

标签: delphi treeview delphi-xe

我正在使用delphi xe

我想在屏幕截图中圈出的运行时更改treeview节点的文本。 enter image description here

我正在使用以下代码进行更改

TreeView1.Items[2].Item[6].Text:='Some Text';

但是得到错误

列出索引超出范围(6)

但是,如果我更改第一项的任何子项目的文本(如

),则相同的代码可以正常工作
TreeView1.Items[0].Item[1].Text:='Some Text';

Screen Shot

2 个答案:

答案 0 :(得分:6)

分而治之。您应该确定错误发生的确切位置,执行步骤导致错误。

引入一些适当类型的临时变量,并将长有问题的行分成一系列简单的行。

而不是TreeView1.Items[2].Item[6].Text:='Some Text';做类似的事情:

var tmp_is: TTreeNodes;
var tmp_iN, tmp_iNN: TTreeNode;

tmp_is := TreeView1.Items;

ShowMessage(IntToStr(tmp_is.Count));
tmp_iN := tmp_is[2];

ShowMessage(tmp_iN.Text + ' : ' + IntToStr(tmp_iN.Count));
tmp_iNN := tmp_iN[6];

ShowMessage(tmp_iNN.Text);
tmp_iNN.Text := 'Some Text';

然后跟踪它,看看哪一行给你一个错误,节点实际有多少个元素,以及你实际要运行的元素。

答案 1 :(得分:4)

您的根本问题是对索引属性的含义的误解

TTreeView.Items[]

您认为这只能访问顶级节点。事实并非如此。此属性允许访问树中的每个节点。理解这一点的方法是查看您的树,展开所有文件夹,并从顶部向下读取忽略嵌套。对于您的树,索引如下所示:

Index    TreeView1.Items[Index]
-----    ----------------------
0        Pay History
1        Summary
2        Detail
3        Specific Account History
4        Summary
5        Detail
....     ....

因此,当您引用TreeView1.Items[2]时,您实际上正在获取带有标题详细信息的节点,该节点是第一个节点的子节点,名为付费历史记录

您想要的节点具有索引13,因此您可以将代码更改为

TreeView1.Items[13].Text := ...;

您使用的其他属性是TTreeNode.Item[]。这又是不同的。这将访问特定节点的直接子节点列表。因此,TTreeView1.Items[0].Item[]可用于访问作为第一个节点的子节点的两个节点,名为 Pay History


在你的情况下,我不想写:

TreeView1.Items[13].Text := ...;

我会拒绝那些依赖于这样一个神奇数字的代码。我会在运行时填充树视图,并将实例变量引用保存到我稍后需要使用的任何节点。例如:

FPayHistoryNode := TreeView1.Add(nil, 'Pay History');
FPayHistorySummaryNode := TreeView1.AddChild(FPayHistoryNode, 'Summary');
FPayHistoryDetailNode := TreeView1.AddChild(FPayHistoryNode, 'Detail');
....

如果您以后需要修改节点的属性,那么您可以使用读者可以一目了然的代码来执行此操作。当您插入新节点或重新排序节点时,您不会像使用魔术常量那样破坏所有现有代码。