【问题标题】:Delphi: How to allow setting a TClass-property of a TCollectionItem at design timeDelphi:如何允许在设计时设置 TCollectionItem 的 TClass 属性
【发布时间】:2015-06-17 07:18:34
【问题描述】:

我正在开发一个适用于多个类的组件。 为了允许添加托管类列表,我编写了一个 TCollection 的继承类,其中每个项目(从 TCollectionItem 继承)定义了一个已发布的“TargetClassName”属性。 “TargetClassName”属性的setter函数,调用下面的函数来找到对应的TClass:

function FindAnyClass(const Name: string): TClass;
var
  ctx: TRttiContext;
  typ: TRttiType;
  list: TArray<TRttiType>;
begin
  Result := nil;
  ctx := TRttiContext.Create;
  list := ctx.GetTypes;
  for typ in list do
    begin
      if typ.IsInstance and (EndsText(Name, typ.Name)) then
        begin
          Result := typ.AsInstance.MetaClassType;
          break;
        end;
    end;
  ctx.Free;
end;

(感谢 Dalija Prasnikar 编写函数 Get class by its name in Delphi)。

现在,我想知道是否有更好的方法允许在设计时向 TCollectionItem 添加类。您对此有何看法? 希望阅读有趣的解决方案! 谢谢大家。

【问题讨论】:

  • RTTI 几乎肯定是错误的解决方案。
  • 这就是我寻找更好解决方案的原因。目前,我没有找到任何其他在设计时添加类的方法。
  • 如果没有更好地了解问题所在,我不会提出解决方案。就目前而言,您已经提出了解决方案,但并未真正描述问题。
  • 在这种情况下,注册类的小列表可能是更好的选择。让每个所需的类在启动时自行注册,然后您可以在需要时遍历该列表。无论如何,这将在运行时起作用。在设计时,您可能必须编写一个自定义属性编辑器,枚举项目的单元,以查找具有共同祖先、实现共同接口或标记有共同属性等的类。
  • @David Heffernan:问题是我真的不知道在设计时设置 TClass 属性的任何明显方法。暴露出来的只是一个“后备解决方案”,它使用类名来获取 TClass。我想找到一个干净的解决方案。请告诉我哪一部分不清楚,我会尽力解释得更好。

标签: class delphi set design-time tcollectionitem


【解决方案1】:

在创建TCollection 时需要引入Collat​​ion Class 有两种可能 1 : 在创建时硬编码 X := TMycollat​​ion.Create(TMyCollat​​ionClass) 2:您的解决方案 X := TMycollat​​ion.Create(FindAnyClass('TMyCollat​​ionClass'));

【讨论】:

  • 我的目标是在设计时设置一个 TComponentClass 属性。像这样: TMyCollectionItem = class(TCollectionItem) .... 已发布 MyProperty : TComponentClass ...; //
猜你喜欢
  • 2019-12-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多