Почему некоторые свойства выходят за рамки списка наблюдения, а другие нет ?

Прежде всего, извините за длинный пример кода, но я считаю, что он нужен для иллюстрации моей проблемы.

В качестве помощи при отладке я часто использую для своих объектов метод "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.
  1. Добавьте часы для «vMyObj.DebugStringList» и «vMyObj.DebugString»
  2. Установите точку останова в строке 77 (2-й «vMyObj.Scramble») и запустите .
  3. Щелкните увеличительное стекло рядом с часами «DebugStringList», чтобы открыть визуализатор
  4. Обратите внимание, что визуализатор работает нормально:)
  5. Перейдите на следующую строку. Визуализатор теперь показывает, что часы вне области видимости.
  6. Снова нажмите на увеличительное стекло, чтобы увидеть новое состояние объекта.

Почему визуализатор сообщает, что часы находятся вне поля зрения? Как я могу это исправить?

PS: Я знаю, что могу писать визуализаторы отладки, но я использую "DebugString" и "DebugStringList" в некоторых автоматических тестах, и мне бы очень хотелось использовать их таким простым способом.

Обновление: я использую Delphi XE

Обновление 2: Несмотря на хорошие усилия Марьян Венема, у меня все еще нет решения этой проблемы. Я подал отчет в Embarcadero (номер контроля качества 98062, проголосуйте :-)). Однако я подозреваю, что Embarcadero исправит эту проблему некоторое время, и, видя, насколько я все еще заинтересован в обходном пути, я предложу небольшую награду. Никогда не пробовал это раньше, поэтому будет интересно посмотреть, что произойдет: -)

5
задан Svein Bringsli 25 August 2011 в 15:41
поделиться