首先,對於冗長的代碼示例感到抱歉,但我相信需要說明我的問題。爲什麼一些屬性在監視列表中超出範圍,而其他屬性卻不在?
作爲一個調試幫助,我經常在我的對象上引入一個「DebugString」 - 方法,它返回一個簡潔的對象摘要。但有時我的對象太複雜,無法在單個字符串中最佳地表示,因此我使用了字符串列表。現在,我想用Delphi中出色的調試可視化工具來監視我的對象。我這樣做的方式是引入一個屬性,其中包含重建字符串列表的getter。
這種有點奏效,但對於我追蹤的每一行,該屬性都超出了範圍,所以我必須再次單擊觀察窗口中的放大鏡才能看到該值。爲什麼是這樣?
複製,創建一個新的控制檯應用程序:
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: 儘管馬裏安Venema好好努力,我仍然沒有辦法解決這個問題。我已經向Embarcadero提交了一份報告(質檢編號98062,請投票:-))。但是,我懷疑Embarcadero解決這個問題需要一些時間,並且看到我仍然對解決方案感興趣,我會提供一個小小的獎勵。從來沒有嘗試過,所以這將是有趣的se會發生什麼:-)
什麼版本的Delphi您使用的是在這裏嗎? –
我在XE(確切版本是15.0.3890.34076) –