Прежде всего, извините за пример длинного кода, но я считаю, что это необходимо для иллюстрации моей проблемы.
В качестве помощи при отладке я часто представляю метод "DebugString" для своих объектов, который возвращаеткраткое описание объекта.Но иногда мои объекты слишком сложны, чтобы оптимально представлять их в одной строке, поэтому я использую списки строк.Теперь я хотел бы использовать отличные визуализаторы отладки в Delphi для мониторинга моего объекта.Я делаю это, чтобы ввести свойство с помощью метода get, который перестраивает список строк.
Это работает, но для каждой трассируемой строки свойство выходит за рамки видимости, поэтому я должен щелкнуть увеличительное стекло.в окне просмотра еще раз, чтобы увидеть значение.Почему это?
Для воспроизведения создайте новое консольное приложение:
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 (2-й «vMyObj.Scramble») и запустите.
- Нажмите на лупу рядом с часами «DebugStringList», чтобы получить визуализатор
- Обратите внимание, что визуализатор работает хорошо:)
- Перейдите на следующую строку.Визуализатор теперь показывает, что часы находятся вне поля зрения.
- Нажмите лупу еще раз, чтобы увидеть новое состояние объекта.
Почему визуализатор говорит, что часы находятся вне поля зрения?Как я могу это исправить?
PS: я знаю, что могу писать отладочные визуализаторы, но я использую "DebugString" и "DebugStringList" в некоторых автоматических тестах, и я действительно хотел бы использовать их таким простым способом.
Обновление: я использую Delphi XE
Обновление 2: Несмотря на все усилия Marjan Venema, у меня до сих пор нет решения этой проблемы.Я подал отчет в Embarcadero (КК № 98062, пожалуйста, проголосуйте :-)).Тем не менее, я подозреваю, что Embarcadero потребуется время, чтобы решить эту проблему, и, видя, как я все еще заинтересован в обходном пути, я предложу небольшую награду.Никогда раньше не пробовал, поэтому будет интересно посмотреть, что получится: -)