【问题标题】:Assign an attribute to a TObject in Delphi在 Delphi 中为 TObject 分配一个属性
【发布时间】:2026-02-03 02:30:01
【问题描述】:

是否可以在 Delphi 中为 TObject 分配属性?所以我以后可以用它来做点什么?

例如,我正在创建一个菜单,我希望菜单中的一个项目具有 isActive 属性,以便稍后检查它的样式。

这可能吗?

类似:

Object.setAttribute('isActive', true);

【问题讨论】:

  • 一些选项: 1. 派生您使用的菜单类的子类并添加新属性。 2. 重新使用原本不使用的现有属性(例如标签)。 3. 将信息存储在单独的位置,例如允许您查询特定项目是否具有该属性的字典。根据我们掌握的信息,在我看来,在这些选项中,最后一个是最好的。
  • 我很想知道菜单处于活动状态意味着什么。你能详细说明一下吗?可能信息已经被系统维护了。
  • @DavidHeffernan 这意味着该菜单引用的部分现在已打开。例如,我想做你在 HTML+JS 中会做的事情:element.setAttribute('attrName', 'attrValue') 然后你可以使用element.getAttribute('attrName')
  • 通常在 Windows 中,您会处理下拉菜单时触发的事件。此外,在 Windows 菜单中,模式消息循环会耗尽,因此您运行的唯一代码是响应通知消息(通常作为事件浮出水面)。
  • 严格的答案是“不”。 Delphi 中的对象不像 JavaScript 中那样像乐高积木一样。但是有各种各样的方法可以解决它,例如子类化(已经提出)或每个 TComponent 后代都具有的Tag 属性,尽管这是一个滑坡。已经非常基于意见的最佳解决方案主要取决于问题中未给出的上下文。

标签: delphi


【解决方案1】:

Delphi 知道可以用来向现有类添加功能的类助手。 例如,您可以尝试:

TObjectHelper = class helper for TObject
private
  function GetMyProp: string;
  procedure SetMyProp(const Value: string);
public
  property myprop:string read GetMyProp write SetMyProp;
end;

注意,我发现子类化是一种更合乎逻辑的方式。

【讨论】: