【发布时间】:2020-01-23 20:33:36
【问题描述】:
短版:有没有办法单独控制或修改 LisBox 项目?例如,将它们的 Visible 属性分别设置为 False。 我在搜索的时候在Fire Monkey中发现了一个TListBoxItem类,但是我不想在VCL中使用Fire Monkey。
详细版本:
我尝试使用两个 TStringList 和一个 Edit 过滤我的 ListBox,一个 StringList 是全局的以保留原始列表 (list_files_global),另一个 StringList 帮助过滤过程 (list_files_filter),我的主要文件列表是我的 ListBox (@ 987654323@)。
当程序开始存储我的原始列表时,我在 onCreate 事件上创建了我的全局 StringList:
procedure Tfrm_main.FormCreate(Sender: TObject);
Begin
list_files_global := TStringList.Create;
list_files_global.Assign(list_files.Items);
End;
并使用 Edit 的 onChange 事件进行过滤:
procedure Tfrm_main.edit_files_filterChange(Sender: TObject);
Var
list_files_filter: TStringList;
i: Integer;
Begin
list_files_filter := TStringList.Create;
list_files_filter.Assign(list_files.Items);
list_files.Clear;
for i := 0 to list_files_filter.Count - 1 do
if pos(edit_files_filter.text, list_files_filter[i]) > 0 then
list_files.Items.Add(list_files_filter[i]);
End;
为了关闭过滤器,只需从我最初创建的全局列表中恢复列表:
list_files.Items := list_files_global;
到目前为止,一切正常,但问题是当我尝试从过滤列表中编辑/重命名/删除项目时,例如我更改了一个项目:
list_files.Items[i] := '-- Changed Item --';
列表将被编辑,但是当我关闭过滤器时,原始列表将返回并且所有更改都将丢失。 所以我想知道有什么合适的方法来解决这个问题吗?诸如单独隐藏项目或更改项目可见性等...所以我可以更改过滤算法并摆脱所有这些制作额外列表的操作。 我在互联网上搜索了一整天的 Delphi 帮助文件,没有任何有用的东西出现。
【问题讨论】:
-
当您填充与过滤器匹配的列表框项目时,您可以使用 AddObject,而不是 Add,其中“object”是指向 list_files_global 中条目的指针(或索引,但更复杂),所以您可以根据需要返回以对其进行编辑或删除。
-
@MartynA 我在我正在编写的原始程序中使用类和“AddObject”,我只是避免制作有问题的长代码和细节。您引用的方式几乎是正确的,但是它使代码更加复杂且有些混乱,程序包含许多复杂的代码,过程,交叉引用等……这个问题的目的是使所有这些都变得不那么复杂和扭曲,更整洁。感谢您的评论。
-
@Armin 事实上,我在回复你的最后一条评论,你说“这个问题的目的是让它们变得不那么复杂和扭曲,更整洁。”任何比提议的解决方案“不那么复杂”的解决方案(您似乎拒绝了)都将求助于第三方解决方案,这在此处是题外话。
-
对 [short version] 问题的简单回答是否定的,没有办法单独隐藏列表框中的列表项。至少在 VCL 中没有。 TListBox 的 FMX 版本只是对齐的控件,所以你可以在那里做。但就 VCL 而言,您要么咬紧牙关,自己编写以根据需要添加/删除项目(这是我一直做的),要么求助于第三方解决方案,这取决于您选择的内容,甚至可以更多复杂,比如Virtual TreeView。顺便说一句,否决票不是来自我。
-
对简短版本的简单回答:在虚拟模式下使用列表框。在 VCL 中,这就是“样式”属性。将记录/对象列表保存为数据,并拥有您想要的所有信息。该框会询问您要显示的内容。