有人可以解释一下,MultiSelectStyle
,Selected
和Selected.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
且有六个子节点,因为所选文件夹包含六个子文件夹且没有文件,使用Ctrl
和鼠标,我选择第一个(44个文件)和最后一个(9个文件)树节点(根节点的子节点)并点击执行上述调试代码的按钮。
我期待什么?我看到选中了两个项目。由于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真的是一种奇怪的语言。
答案 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可能很有用 节点
换句话说,文档告诉你和我告诉你的一样。