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