1

有人可以解释一下,MultiSelectStyleDelphi 7 中的Selected属性Selected.Count如何工作吗?TTreeView我已经离开 Delphi 编码多年,除非有人指出我,否则我想念什么,我认为这背后绝对没有逻辑。

说到点子上了。我有一个填充TTreeView所选文件夹内容的例程。它使用递归,因此每个文件夹都表示为带有子节点的节点——它是子文件夹和文件。用户可以在树上选择多个项目,因为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 个文件)树节点(根节点的子节点)并点击执行上述调试代码的按钮。

示例树内容

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

我能得到什么?第一条消息说我选择了... 九个项目,当我继续时,我收到另外九条消息,显示最后一个文件夹(树子)的内容。最可笑的是,tvShell.Selected 这两个竟然没有出现,居然是我选的!怎么回事?

胡说八道继续……

我重复所有这些步骤,但这次我选择(单击)最后一个文件夹(子级)并Ctrl按下按钮,我单击第一个文件夹(根的子级)。作为一个人,我再次看到,我选择了两个项目。看这棵树时,我在视觉上看不出选择有什么不同。但德尔福做到了。

执行调试代码时,这一次我得到的信息是选择了 44 个项目,并且我得到了 44 个额外的消息框,显示第一个文件夹的内容。完全糊涂了,我点击+第一个和最后一个文件夹旁边,看看里面是否有任何项目被选中,但没有(因为msVisibleOnly设置为True)。

我明白了,它是如何工作的(总是声称上次单击项目的子项都在选定项目中),但我不明白。这背后的逻辑在哪里,如果有的话?如果代码的结果不能反映现实,这有什么用?

对不起,舌头很硬,但这对我来说完全是愚蠢的。由于我不在 Delphi 中编码(我实际上讨厌这种语言来做更多类似的事情)我不寻求启发或解释,为什么这会像它一样有效(尽管,如果有人有空闲时间,我会非常乐意阅读它)。

但我真的会很高兴,如果有人可以解释我,我必须在代码和TTreeView属性中做些什么魔法,才能从代码中得到真正选择的东西,而不是德尔福对现实的错误解释。如果我看到两个项目被选中,我想tvShell.Selected.Count设置为 2 并且我想tvShell.Selected包含两个项目——我选择的两个项目。不多也不少。

抱歉,这个问题太长了,但是当我发现(再次,多年后)感到沮丧之后,我不得不做出反应,Delphi 真的是一种奇怪的语言。

4

1 回答 1

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 将返回最后一个单击的节点,即使该单击取消选择该节点也是如此。有关 MultiSelect 为 True 时的当前选择状态,请参阅 Selections 属性。

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

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

属性计数:整数;

描述

使用 Count 来确定有多少子节点属于一个树节点。Count 仅包括直系子代,不包括其后代。Count 在遍历树节点的子节点时很有用。

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

于 2013-01-08T13:26:32.097 回答