首先,对于冗长的代码示例感到抱歉,但我相信需要它来说明我的问题。
作为调试帮助,我经常在我的对象上引入一个“DebugString”方法,它返回一个简洁的对象摘要。但有时我的对象过于复杂,无法在单个字符串中以最佳方式表示,因此我使用字符串列表。现在,我想使用 Delphi 中出色的调试可视化工具来监控我的对象。我这样做的方法是引入一个带有重建字符串列表的吸气剂的属性。
这有点工作,但是对于我跟踪的每一行,属性都会超出范围,所以我必须再次单击监视窗口中的放大镜才能查看值。为什么是这样?
要重现,请创建一个新的控制台应用程序:
program Project1;
{$APPTYPE CONSOLE}
uses
SysUtils,
Classes;
type
TMyClass = class
private
FInternalData : array[0..4] of integer;
FDebugStringList : TStringList;
procedure RebuildDebugStringlist;
function GetDebugStringList: TStringList;
function GetDebugString : string;
public
constructor Create;
destructor Destroy; override;
procedure Scramble;
property DebugStringList : TStringList read GetDebugStringList;
property DebugString : string read GetDebugString;
end;
constructor TMyClass.Create;
begin
FDebugStringList := TStringList.Create;
end;
destructor TMyClass.Destroy;
begin
FDebugStringList.Free;
inherited;
end;
function TMyClass.GetDebugString: string;
var
I : integer;
begin
Result := 'Object state: ';
for I := 0 to 3 do
Result := Result + inttostr(FInternalData[I])+' ';
end;
function TMyClass.GetDebugStringList: TStringList;
begin
RebuildDebugStringlist;
Result := FDebugStringlist;
end;
procedure TMyClass.RebuildDebugStringlist;
var
I : integer;
begin
FDebugStringList.Clear;
FDebugStringList.Add('Object state:');
for I := 0 to 4 do
FDebugStringList.Add(inttostr(FInternalData[I]));
end;
procedure TMyClass.Scramble;
var
I : integer;
begin
for I := 0 to 4 do
FInternalData[I] := Random(100);
end;
var
vMyObj : TMyClass;
begin
vMyObj := TMyClass.Create;
try
vMyObj.Scramble;
vMyObj.Scramble;
vMyObj.Scramble;
finally
vMyObj.Free;
end;
readln;
end.
- 为“vMyObj.DebugStringList”和“vMyObj.DebugString”添加监视
- 在第 77 行(第二个“vMyObj.Scramble”)放置一个断点,然后运行。
- 单击“DebugStringList”手表旁边的放大镜以获取可视化工具
- 观察可视化器工作得很好:)
- 跨过下一行。可视化工具现在指示手表超出范围。
- 再次按下放大镜可以看到物体的新状态。
为什么可视化工具说手表超出范围?我怎样才能解决这个问题?
PS:我知道我可以编写调试可视化工具,但我在一些自动测试中使用“DebugString”和“DebugStringList”,我真的很想以这种简单的方式使用它们。
更新:我使用 Delphi XE
更新 2: 尽管 Marjan Venema 做出了很大的努力,但我仍然无法解决这个问题。我已经向 Embarcadero 提交了一份报告(QC 编号 98062,请投票:-))。但是,我怀疑 Embarcadero 需要一些时间来解决这个问题,并且看到我仍然对解决方法感兴趣,我会提供一个小的赏金。以前从未尝试过,所以看看会发生什么会很有趣:-)