有人可以解释一下,MultiSelectStyle
Delphi 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
设置为True
between MultiSelectStyle
,我希望tvShell.Selected.Count
设置为2
并看到三个消息。
我能得到什么?第一条消息说我选择了... 九个项目,当我继续时,我收到另外九条消息,显示最后一个文件夹(树子)的内容。最可笑的是,tvShell.Selected
这两个竟然没有出现,居然是我选的!怎么回事?
胡说八道继续……
我重复所有这些步骤,但这次我选择(单击)最后一个文件夹(子级)并Ctrl
按下按钮,我单击第一个文件夹(根的子级)。作为一个人,我再次看到,我选择了两个项目。看这棵树时,我在视觉上看不出选择有什么不同。但德尔福做到了。
执行调试代码时,这一次我得到的信息是选择了 44 个项目,并且我得到了 44 个额外的消息框,显示第一个文件夹的内容。完全糊涂了,我点击+
第一个和最后一个文件夹旁边,看看里面是否有任何项目被选中,但没有(因为msVisibleOnly
设置为True
)。
我明白了,它是如何工作的(总是声称上次单击项目的子项都在选定项目中),但我不明白。这背后的逻辑在哪里,如果有的话?如果代码的结果不能反映现实,这有什么用?
对不起,舌头很硬,但这对我来说完全是愚蠢的。由于我不在 Delphi 中编码(我实际上讨厌这种语言来做更多类似的事情)我不寻求启发或解释,为什么这会像它一样有效(尽管,如果有人有空闲时间,我会非常乐意阅读它)。
但我真的会很高兴,如果有人可以解释我,我必须在代码和TTreeView
属性中做些什么魔法,才能从代码中得到真正选择的东西,而不是德尔福对现实的错误解释。如果我看到两个项目被选中,我想tvShell.Selected.Count
设置为 2 并且我想tvShell.Selected
包含两个项目——我选择的两个项目。不多也不少。
抱歉,这个问题太长了,但是当我发现(再次,多年后)感到沮丧之后,我不得不做出反应,Delphi 真的是一种奇怪的语言。