问题源于需要为不同类型的对象重用代码。
- 设想:
从不同的列表框或相同的列表框中拖放列表框。
当我尝试在同一个控件中实现拖放时,就会出现上述问题。
用户可以通过向上或向下拖动来重新排列列表框中的项目。
我已经写了逻辑,它有效。
问题是,在我的应用程序中,我根据要求使用了不同类型的列表框。
所以他们的类型会改变。为了使用相同的代码进行拖放,
当源和发送者相同时,我将不同的列表框类型转换为共同的祖先 TCustomListBox
,然后将其发送到执行项目移动的函数。
该函数将项目集合中的项目交换到它们的新位置。
现在特殊情况:
我使用了一个复选框,其中有一个与每个项目关联的复选框。
碰巧的是,每个项目都有一个关联的检查状态对象。
现在在函数中,为了移动项目,我使用 tstringlist 临时存储项目
及其对象,然后将它们从控件中删除,然后将它们重新插入控件中。
但是在这个复选框的情况下,当我删除一个项目时,该项目被删除,
但其对应的 checkstate 对象仍然存在,并且它与下一个项目相关联,
这是不需要的。
所以现在我正在使用一个 int 变量作为正常
和特殊拖放的模式指示器。
当它很特殊时,例如在 checklistbox 的情况下,我将其类型转换为 tchecklist 和
然后访问它的删除方法,该方法删除项目及其检查状态。因此,我没有使用 int 作为模式,而是想知道
是否可以使用所有列表框的基类的类引用,
然后如果需要,我如何访问特定列表框类型的属性。
上述解决方案不是最佳的,这就是为什么,我需要一个更通用和正确的方法。看看你能不能帮忙。谢谢。感谢您的建议,我很关心这个社区,我不习惯编辑功能。对不起。
我正在使用delphi 6。
函数的声明如下:-
DragDropItemsInListBox(p_HostIndex : Integer; p_HostListBox : TCustomListBox;
p_Mode:Integer);
call:-
hostindex 为放置站点索引,hostlistbox 为要放置项目的控件,
本例中源控件和目的控件相同,
mode 表示删除方式。
DragDropItemsInListBox(3,TCustomListBox(Source), 1);
如果模式为 0,那么我通常删除项目,如下所示:-
p_HostListBox.items.delete(i);
如果是1,表示特殊处理,
在这种情况下我知道该怎么做,因此我使用,
如果 p_Mode = 1 那么
(p_HostListBox as TRzCheckList).items.delete(i);
这将删除该项目以及 checkstate 对象。
但我不想依赖这种基于 int 的差异化。
我可以使用元类吗?如果我通常调用 items.delete,
那么它将适用于该特定类型吗?