まず、長いコード例は残念ですが、私は問題を説明する必要があると思います。一部のプロパティはウォッチリストの有効範囲外になるのはなぜですか?
デバッグのヘルプとして、私はしばしば私のオブジェクトに簡潔なオブジェクトサマリを返す "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.
- :、再現する新しいコンソールアプリケーションを作成するには
「スクランブル」)、実行します。
- ビジュアライザ
- はビジュアライザがうまく動作することを確認して:)次の行を超える
- ステップを取得するには、次の「DebugStringList」時計に虫眼鏡をクリックします。ビジュアライザーは、時計が範囲外であることを示します。
- 虫眼鏡をもう一度押すと、オブジェクトの新しい状態が表示されます。
なぜ時計が範囲外であると言っているのですか?これをどうすれば解決できますか?
PS:私はデバッグビジュアライザを書くことができますが、いくつかの自動テストでは "DebugString"と "DebugStringList"を使用しています。この簡単な方法で実際に使用したいと思います。
アップデート:私は、Delphi XE
アップデート2使用:マルジャンVenema氏による良好な努力にもかかわらず を、私はまだこの問題に対する解決策を持っていません。私はEmbarcaderoにレポートを提出しました(QC番号98062、投票してください:-))。しかし、私はEmbarcaderoがこの問題を修正するのには時間がかかると思っています。私がまだ回避策に興味を持っているのを見て、私は小さな賞金を提供します。これまでに試したことはありませんでしたので、何が起こるか興味深いでしょう:-)
ここで使用しているデルファイのバージョンは何ですか? –
私はXEを使っています(バージョン15.0.3890.34076が正確です) –