gpt4 book ai didi

Delphi:我们可以在运行时或设计时使用元类引用来访问属性吗?

转载 作者:行者123 更新时间:2023-12-03 13:40:09 25 4
gpt4 key购买 nike

问题源于需要为不同类型的对象重用代码。

  • 场景:

  • 从不同的列表框或相同的列表框中拖放列表框。
    当我尝试在同一个控件中实现拖放时,就会出现上述问题。
    用户可以通过向上或向下拖动来重新排列列表框中的项目。
    我已经写了逻辑,它有效。
    问题是,在我的应用程序中,我根据要求使用了不同类型的列表框。
    所以他们的类型会改变。为了使用相同的代码进行拖放,
    当源和发件人相同时,我将不同的列表框类型转换为共同的祖先 TCustomListBox
    然后将其发送到执行项目移动的函数。
    该函数将项目集合中的项目交换到它们的新位置。
  • 现在特殊情况:

    我使用了一个复选框,其中有一个与每个项目关联的复选框。
    碰巧的是,每个项目都有一个关联的检查状态对象。
    现在在函数中,对于移动项目,我使用 tstringlist 临时存储项目
    及其对象,然后将它们从控件中删除,然后将它们重新插入控件中。
    但在这个复选框的情况下,当我删除一个项目时,该项目被删除,
    但它对应的 checkstate 对象仍然存在,并且它与下一个项目相关联,
    这是不希望的。
    所以现在我使用一个 int 变量作为正常的模式指示器,
    和特殊的拖放。
    当它很特殊时,例如在 checklistbox 的情况下,我将其类型转换为 tchecklist 和
    然后访问它的删除方法,该方法删除项目及其检查状态。

    因此,我想知道,而不是使用 int 作为模式,
    我是否可以使用所有列表框的基类的类引用和
    那么如果需要,我如何访问特定列表框类型的属性。
    上述解决方案不是最佳的,这就是为什么,我需要一个更通用和正确的方法。
    看看你能不能帮忙。谢谢。感谢您的建议,我很关心这个社区,我不习惯编辑功能。对不起。

  • 我正在使用德尔福 6。
    该函数的声明如下:-
    DragDropItemsInListBox(p_HostIndex:整数;p_HostListBox:TCustomListBox;
    p_Mode:整数);

    称呼:-
    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,
    那么它将适用于该特定类型吗?

    最佳答案

    therefore i use, if p_Mode = 1 then (p_HostListBox as TRzCheckList).items.delete(i);

    this removes the item alongwith the checkstate object. but i dont wanna rely on this int based differentiation. can i use metaclasses and if i normally call items.delete, then will it apply to that specific type?



    您不能使用元类变量 - 元类指针对于该类型的所有对象都是相同的。如果 Delphi 允许这样做 - 将无法知道要从哪个 list 中删除。

    然而,使用 int 确实是一个糟糕的解决方案。
    if p_HostListBox is TRzCheckList 
    then TRzCheckList(p_HostListBox).items.delete(i);

    Sidenote: in Component Pascal there would be even more sugar: IS implies AS there: if p_HostListBox is TRzCheckList then p_HostListBox.items.delete(i);



    阅读有关 RzChkLst.TRzCheckList.Items 的帮助可能是更好的方法 - 这是 TStrings 类型的属性。

    修改声明
    procedure DragDropItemsInListBox(p_HostIndex : Integer; p_HostListBox : TCustomListBox; p_Items : TStrings);

    将其称为 DragDropItemsInListBox(0, RzCheckList1, RzCheckList1.Items);

    在程序中做
    p_Items.Delete(i);

    关于Delphi:我们可以在运行时或设计时使用元类引用来访问属性吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12686240/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com