0

我正在使用delphi xe

我想在运行时更改已在屏幕截图中圈出的树视图节点的文本。 在此处输入图像描述

我正在使用下面的代码来更改它

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

但是得到下面的错误

列表索引超出范围(6)

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

TreeView1.Items[0].Item[1].Text:='Some Text';

截屏

4

2 回答 2

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';

然后跟踪它,看看哪一行给你一个错误,那个节点实际上有多少元素,你实际上要操作哪些元素。

于 2013-06-08T19:12:39.930 回答
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]您实际上正在获取带有标题Detail的节点,该节点是第一个节点的子节点,名为Pay History

您想要的节点具有索引 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');
....

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

于 2013-06-09T15:28:38.683 回答