我正在使用delphi xe
我想在屏幕截图中圈出的运行时更改treeview节点的文本。
我正在使用以下代码进行更改
TreeView1.Items[2].Item[6].Text:='Some Text';
但是得到错误
列出索引超出范围(6)
但是,如果我更改第一项的任何子项目的文本(如
),则相同的代码可以正常工作TreeView1.Items[0].Item[1].Text:='Some Text';
答案 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');
....
如果您以后需要修改节点的属性,那么您可以使用读者可以一目了然的代码来执行此操作。当您插入新节点或重新排序节点时,您不会像使用魔术常量那样破坏所有现有代码。