了解如何在Delphi 7中多选TTreeView项目

时间:2013-01-08 12:39:16

标签: delphi treeview delphi-7 multi-select

有人可以解释一下,MultiSelectStyleSelectedSelected.Count属性如何适用于Delphi 7中的TTreeView?我已经离开德尔福编码多年了,除非有人指出我,我错过了什么,我认为这背后绝对没有逻辑。

重点。我有一个例程,用TTreeView填充所选文件夹的内容。它使用recurence,因此每个文件夹都表示为带子项的节点 - 它是子文件夹和文件。用户可以在树上选择多个项目,因为MultiSelect设置为True。在MultiSelectStyle组中,我将所有四个子属性设置为True(也许这是一个错误)。

作为我的程序的调试(完全相反,我希望)我有这个代码:

ShowMessage(IntToStr(tvShell.Selected.Count) + ' selected');

for i := 0 to (tvShell.Selected.Count - 1) do
begin
    ShowMessage(tvShell.Selected.Item[i].Text);
end;

所以我运行我的程序并选择任何文件夹。树渲染,我看到:

  • 根节点,所选文件夹的完整路径为Text且有六个子节点,因为所选文件夹包含六个子文件夹且没有文件,
  • 这六个子文件夹仅包含文件,因此根节点的六个子节点包含相当数量的子节点,例如 - 首先包含44个(文件或项目),最后包含9个(项目或文件)。

使用Ctrl和鼠标,我选择第一个(44个文件)和最后一个(9个文件)树节点(根节点的子节点)并点击执行上述调试代码的按钮。

Example tree contents

我期待什么?我看到选中了两个项目。由于msVisibleOnly中的True设置为MultiSelectStyle,因此我希望tvShell.Selected.Count设置为2并看到三条消息。

我能得到什么?第一条消息说我已经...... 选择了九个项目,当我继续时,我会收到另外九条消息,向我显示最后一个文件夹的内容(树儿童)。最有趣的部分是tvShell.Selected 中没有这两个的迹象,实际上是我选择的! WTF?

无意义继续......

我重复所有这些步骤,但这次我选择(点击)最后一个文件夹(子项)并按下Ctrl按钮,我点击第一个文件夹(root的子项)。作为一个人,我再次看到,我选择了两个项目。当看到这棵树时,我在视觉上看到选择没有区别。但德尔福确实如此。

执行调试代码时,这次我得到的信息是四十四个项目选择,而且我还有另外44个消息框显示第一个文件夹的内容。完全混淆,我点击第一个和最后一个文件夹旁边的+,看看是否有内部选择的项目,但没有(因为msVisibleOnly设置为True)。

我知道,它是如何工作的(总是声称最后一次点击项目的孩子都在所选项目中),但我不明白。这背后的逻辑在哪里,如果有的话?如果代码的结果不能反映现实,那么它如何有用呢?

对不起,对于坚硬的舌头,但这对我来说是完全愚蠢的。因为我不用Delphi编写代码(我真的讨厌那种语言来做更多这样的事情)我不寻求启发或解释,为什么这样的工作就像它起作用(尽管如果有人有空闲时间,我会非常乐意阅读它。)

但我真的很高兴,如果有人可以解释我,我需要在代码和TTreeView属性中做些什么,从代码中获取真正选择的东西,而不是Delphi的错误解释现实。如果我看到选中了两个项目,我希望tvShell.Selected.Count设置为2,我希望tvShell.Selected包含两个项目 - 两者都是我选择的项目。没什么,没什么。

对不起,这个问题已经很久了,但是在我遇到挫折之后我不得不做出反应,当发现(再次,多年)后,Delphi真的是一种奇怪的语言。

1 个答案:

答案 0 :(得分:6)

您的代码显示

的值
tvShell.Selected.Count

这是tvShell.Selected的直接子节点的节点数。请记住,tvShell.Selected只是一个节点。

您可能打算使用

tvShell.SelectionCount

然后显示

tvShell.Selected.Item[i].Text

这些是tvShell.Selected的直接子女的字幕。

如果要迭代所有选定的节点,则可以这样做:

for i := 0 to tvShell.SelectionCount-1 do
  DoSomething(tvShell.Selections[i]);

当您遇到这种情况时,我建议您阅读在线帮助。特别是对于Delphi 7,文档非常清楚。对于Selected,文档说明:

  

指定树视图中的选定节点。

     

属性已选择:TTreeNode;

     

<强>描述

     

读取选定项以访问树视图的选定节点。如果有   如果没有选定节点,则Selected的值为nil。

     

.....

     

如果MultiSelect属性为True且MultiSelectStyle属性   包括msControlSelect,然后Selected返回单击的最后一个节点   on,即使该单击取消选择该节点。对于当前选择   MultiSelect为True时的状态,请参阅Selections属性。

然后当您继续阅读Count的文档时,它会说:

  

表示树节点的直接后代的数量。

     

属性计数:整数;

     

<强>描述

     

使用Count确定有多少子节点属于树节点。   伯爵只包括直系孩子,而不包括他们的后代。   在遍历树的子项时,Count可能很有用   节点

换句话说,文档告诉你和我告诉你的一样。