代码之家  ›  专栏  ›  技术社区  ›  Peter Turner

Delphi中是否有类似php的vardump的函数?

  •  4
  • Peter Turner  · 技术社区  · 16 年前

    我已经放弃了Delphi7调试器,并且非常依赖于OutputDebugStrings。是否有一个标准函数可以像设置断点时调试器那样调用,以获取对象的内容作为字符串?

    3 回复  |  直到 9 年前
        1
  •  4
  •   Barry Dick    9 年前

    不完全是您要查找的内容,但可以使用rtti访问各种已发布属性的值。神奇的程序在typinfo单元中。您可能最感兴趣的是getPropList,它将返回对象属性列表,以及getPropValue,它将允许您获取属性的值。

    procedure TForm1.DumpObject( YourObjectInstance : tObject );
    var
      PropList: PPropList;
      PropCnt: integer;
      iX: integer;
      vValue: Variant;
      sValue: String;
    begin
      PropCnt := GetPropList(YourObjectInstance,PropList);
      for iX := 0 to PropCnt-1 do
        begin
          vValue := GetPropValue(YourObjectInstance,PropList[ix].Name,True);
          sValue := VarToStr( vValue );
          Memo1.Lines.Add(PropList[ix].Name+' = '+sValue );
        end;
    end;
    

    例如,使用dumpobject(self)在主窗体的按钮单击上运行它,它将当前窗体的所有属性转储到备忘录中。这只是已发布的属性,要求主类要么从tppersistent继承,要么在对象之前打开$m+进行编译。

    有传言说,类似“反射镜”的能力将在未来的德尔福版本(可能2010年)。

        2
  •  3
  •   mj2008    16 年前

    考虑一下 Codesite 这是一个更完整的跟踪解决方案。它允许您输出更复杂的信息,然后搜索、打印和分析数据。但是为了您的目的,您可以使用codesite.send(“before”,self)简单地向它发送一个对象;并且您可以在日志中获得所有RTTI可用的属性。也要做一个“after”,然后您可以通过同时选择这两个来比较代码站点输出中的两个。它救了我很多次。

        3
  •  -2
  •   Baczek    16 年前

    如果Delphi7是.NET版本,那么您可以通过反射来实现(其中的一部分)。(不容易,但不难)。如果这是正常的、已编译的东西,那么这是一个难题,除开专门的打印函数/方法外,调试器是您最好的选择。