我正在使用delphi xe
我想在运行时更改已在屏幕截图中圈出的树视图节点的文本。
我正在使用下面的代码来更改它
TreeView1.Items[2].Item[6].Text:='Some Text';
但是得到下面的错误
列表索引超出范围(6)
但是,如果我更改第一项的任何子项的文本,例如
TreeView1.Items[0].Item[1].Text:='Some Text';
分而治之。 您应该确定错误发生的确切位置,哪个执行步骤导致它。
引入一些适当类型的临时变量,并将有问题的长行拆分成一系列简单化的行。
而不是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';
然后跟踪它,看看哪一行给你一个错误,那个节点实际上有多少元素,你实际上要操作哪些元素。
您的根本问题是对索引属性的含义的误解
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');
....
如果您稍后需要修改节点的属性,那么您可以使用读者一目了然的代码来完成。当您插入新节点或重新排序节点时,您不会像使用魔术常数那样破坏所有现有代码。