【问题标题】:delphi 7 Items propertydelphi 7项属性
【发布时间】:2014-10-03 08:26:04
【问题描述】:

我来自 Java 背景,我们有带有接口的数据结构,如果它的集合支持某些行为,并且集合有另一个。

在 Delphi 中编程时,当我询问有关项目行为的反射时,我遇到了障碍,这很奇怪。 例如这段代码无法编译

      menuOfSomeKind.Items.Add(t);

其中某种菜单是一个组件,它的 Items 包含其他子组件,即菜单条目。

如果我想动态编辑它,即使用添加行为,它会显示“[”预期但“。”找到了。

你能澄清一下吗?

【问题讨论】:

    标签: arrays delphi delphi-7


    【解决方案1】:

    可能menuOfSomeKindTMenuItem不是 TMainMenu

    如果您要向TMenuItem 添加项目,请使用MenuItem.Add(t);

    如果您要向TMainMenu 添加项目,请使用MainMenu.Items.Add(t);

    【讨论】:

    • 它是这里制作的自定义组件,可以从 TMenuItem 继承。这解决了它。你能解释一下发送不同对象添加的行为吗?
    • MainMenu.Items 是 TMenuItem 类型的属性。
    • @none:如果明确声明函数“Add”,则对象支持“Add()”。没有规定他们这样做,如果他们这样做,他们可能会采取不同的做法。有些人可能会声明一个函数 Add 和一个按索引返回项目的索引属性 Items[Index]。其他人将仅声明属性 Items,但该属性不会被索引,相反,它将返回对象,而该对象又将实现 Add 和 [](索引访问)。最终结果是,在第二种情况下,您可以执行 Items[] 和 Items.Add。除了查看文档或代码或尝试之外,没有其他方法可以判断它是哪种情况。
    【解决方案2】:

    TMainMenu/TMenu 和 TMenuItem 之间是有区别的。

    var
      mainMenu: TMainMenu;
      menu: TMenu;
      subMenu: TMenuItem;
    begin
      //***** This creates a new root menu
      mainMenu.Items.Add(TMenuItem.Create);
    
      //***** Essentially the same as mainMenu
      menu.Items.Add(TMenuItem.Create)
    
      //***** This adds a new submenu to an existing menu
      subMenu.Add(TMenuItem.Create);
    
      //***** This adds a new submenu to the first submenu of an existing menu
      subMenu.Items[0].Add(TMenuItem.Create);
    end;
    

    请注意,呈现的代码可以编译,但在运行时会到处抛出异常。对于初学者,没有分配任何局部变量。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-02-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-02
      • 1970-01-01
      • 2018-12-25
      相关资源
      最近更新 更多