Delphi 获取所有tstring属性的列表

Delphi 获取所有tstring属性的列表,delphi,rtti,Delphi,Rtti,我正在尝试查找对象上具有TStrings子体类型的所有属性 以下是我迄今为止所做的尝试: 在表单上放置备忘录和图表,然后输入此代码 procedure TForm1.FormCreate(Sender: TObject); var aObject: TObject; begin for aObject in GetItemsObjects(Chart1) do Memo1.Lines.Add(aObject.ClassName); end; class function TFo

我正在尝试查找对象上具有TStrings子体类型的所有属性

以下是我迄今为止所做的尝试:

在表单上放置备忘录和图表,然后输入此代码

procedure TForm1.FormCreate(Sender: TObject);
var
  aObject: TObject;
begin
  for aObject in GetItemsObjects(Chart1) do
    Memo1.Lines.Add(aObject.ClassName);
end;

class function TForm1.GetItemsObjects(aObject: TObject): TArray<TObject>;
var
  RttiProperty: TRttiProperty;
  RttiType: TRttiType;
  ResultList: TList<TObject>;
  PropertyValue: TValue;
  PropertyObject: TObject;
  s: String;
begin
  ResultList := TList<TObject>.Create;
  try
    RttiType := RttiContext.GetType(aObject.ClassType);
    for RttiProperty in RttiType.GetProperties do
    begin
      PropertyValue := RttiProperty.GetValue(aObject);

      if (not PropertyValue.IsObject) or (PropertyValue.IsEmpty) then
        continue;

      try
        PropertyObject := PropertyValue.AsObject;

        s := PropertyObject.ClassName;

        if (PropertyObject is TStrings) then
          ResultList.Add(PropertyObject)
        else
          ResultList.AddRange(GetItemsObjects(PropertyObject));
      except

      end;
    end;

  finally
    Result := ResultList.ToArray;
    ResultList.Free;
  end;
end;

您的代码导致堆栈溢出,因为您递归调用GetItemsObjects,它还从
TControl
扫描属性,如
Parent


如果你真的想递归地对TStrings属性进行深度扫描,那么你需要确保不要再次访问相同的对象——用列表或其他东西跟踪它们。

好吧,那么不要进行递归调用
ResultList.AddRange(GetItemsObjects(PropertyObject))@Victoria你错过了point@DavidHeffernan你错过了问题的描述“问题是它在VCL代码的深处发生了故障。我尝试了备忘录和图表”堆栈跟踪没有意义,因为它在VCL代码的深处没有错过它。这还不够。“它坏了”告诉我们什么。堆栈跟踪和异常消息(逐字)是我们应该拥有的。您希望每个属性类型的属性都是tstring或后代,还是所有具有对象的属性都是tstring的后代?
        if (PropertyObject is TStrings) then
          ResultList.Add(PropertyObject)
        else
          ResultList.AddRange(GetItemsObjects(PropertyObject));