我放弃了Delphi 7调试器,我非常依赖outputdebugstrings。是否有一个标准函数我可以调用以获取对象的内容作为字符串,如果我设置断点,调试器会这样做?
答案 0 :(得分:4)
不完全符合您的要求,但您可以使用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)运行它,它会将当前窗体的所有属性转储到备忘录中。这只是已发布的属性,并且要求主类从TPersistent下降,或者在对象之前打开{$ M +}编译。
有传言称,未来版本的德尔福(可能是2010年)将提供类似能力的“反射器”。
答案 1 :(得分:3)
考虑类似Codesite的内容,这是一个更完整的跟踪解决方案。它允许您输出更复杂的信息,然后搜索,打印和分析数据。但是出于您的目的,您可以使用Codesite.Send('Before',self)向对象发送一个对象;并在日志中获得所有RTTI可用属性。做一个“After”,然后你可以通过选择两者来比较Codesite输出中的两个。它救了我很多次。
答案 2 :(得分:-2)
如果delphi 7是.NET版本,那么你可以用反射做(某些)。 (不容易,但不是非常难)。如果这是正常的,编译的东西,那么这是一个难题,调试器是你最好的选择,除了专门的打印功能/方法。