Delphi 未从ListView在TreeView中填充数据

Delphi 未从ListView在TreeView中填充数据,delphi,treeview,Delphi,Treeview,我希望所选列表数据填充树 这是我的尝试 if ListView1.Items[Count].Selected then begin Root := ListView1.Items[Count].Caption; for Itr := TreeView1.Items.Count-1 downto 0 do Begin if TreeView1.items[itr].Parent.Text = Root then begin TreeNode := TreeView1.I

我希望所选列表数据填充树

这是我的尝试

if ListView1.Items[Count].Selected then
begin
  Root := ListView1.Items[Count].Caption;
  for Itr := TreeView1.Items.Count-1 downto 0 do Begin
    if TreeView1.items[itr].Parent.Text = Root then begin
      TreeNode := TreeView1.Items[itr].getFirstChild;
      Treeview1.Items.AddChild(Treenode,ListView1.Items[Count].SubItems[0]);
      break;
    end;
  end;
end;
但其创建新节点时存在索引错误

请帮助

您尚未提供有关ListView数据外观的任何详细信息,或者TreeView与该数据相关的外观。但我怀疑您的代码应该更像这样:

if ListView1.Items[Count].Selected then
begin
  Root := ListView1.Items[Count].Caption;
  for Itr := TreeView1.Items.Count-1 downto 0 do begin
    TreeNode := TreeView1.Items[itr];
    if TreeNode.Text = Root then begin
      TreeView1.Items.AddChild(TreeNode, ListView1.Items[Count].SubItems[0]);
      break;
    end;
  end;
end;
请注意,向后遍历树视图是非常低效的。树本身是不可索引的,因此每次通过
TreeView1.Items[]
属性按索引访问节点时,它必须从树中的第一个节点开始,并迭代转发计数节点,直到达到指定的索引。在向后移动时,对访问的每个节点重复相同的前向扫描。这是一个很大的开销浪费。

您没有提供任何有关ListView数据外观的详细信息,也没有提供与该数据相关的TreeView外观的详细信息。但我怀疑您的代码应该更像这样:

if ListView1.Items[Count].Selected then
begin
  Root := ListView1.Items[Count].Caption;
  for Itr := TreeView1.Items.Count-1 downto 0 do begin
    TreeNode := TreeView1.Items[itr];
    if TreeNode.Text = Root then begin
      TreeView1.Items.AddChild(TreeNode, ListView1.Items[Count].SubItems[0]);
      break;
    end;
  end;
end;

请注意,向后遍历树视图是非常低效的。树本身是不可索引的,因此每次通过
TreeView1.Items[]
属性按索引访问节点时,它必须从树中的第一个节点开始,并迭代转发计数节点,直到达到指定的索引。在向后移动时,对访问的每个节点重复相同的前向扫描。这是一个很大的开销浪费。

您首先要完成的是什么?您的ListView看起来像什么?当选择ListView时,您的树视图应该是什么样子?哪一行引起索引错误?你为什么要像现在这样扫描树视图?通常,使用
TreeView1.Items[]
是非常低效的,但向后迭代的效率要高于向前迭代。此外,如果您碰巧在内部循环中达到索引0,
TreeView1.Items[0]。Parent
将为零,并且您的代码将在访问
Parent.Text
时崩溃。您最近提出了几个与错误处理Treeview迭代相关的问题。我认为您可能需要重新考虑您的整个数据存储方法,以便使您的TreeView处理更干净。使用您的版本控制工具来检查从那时到现在在何处引入了回归。(如果您不使用版本控制工具,那么您应该从今天开始使用。Delphi内置了一些基本功能,这些功能可能对这个有限的场景有所帮助,因为最近发生了回归。)您首先要完成什么?您的ListView看起来像什么?当选择ListView时,您的树视图应该是什么样子?哪一行引起索引错误?你为什么要像现在这样扫描树视图?通常,使用
TreeView1.Items[]
是非常低效的,但向后迭代的效率要高于向前迭代。此外,如果您碰巧在内部循环中达到索引0,
TreeView1.Items[0]。Parent
将为零,并且您的代码将在访问
Parent.Text
时崩溃。您最近提出了几个与错误处理Treeview迭代相关的问题。我认为您可能需要重新考虑您的整个数据存储方法,以便使您的TreeView处理更干净。使用您的版本控制工具来检查从那时到现在在何处引入了回归。(如果您不使用版本控制工具,那么您应该从今天开始使用。Delphi内置了一些基本功能,这些功能可能对这种有限的情况有所帮助,因为最近发生了回归。)