Antes que nada, disculpe el largo ejemplo del código, pero creo que es necesario para ilustrar mi problema.¿Por qué algunas propiedades quedan fuera del alcance en la lista de observación, mientras que otras no?
Como una herramienta de depuración a menudo introduzco un método "DebugString" en mis objetos, que devuelve un resumen de objeto conciso. Pero a veces mis objetos son demasiado complejos para representarlos de manera óptima en una sola cadena, así que uso listas de cadenas. Ahora, me gustaría usar los excelentes visualizadores de depuración en Delphi para monitorear mi objeto. La forma en que hago esto es introducir una propiedad con un getter que reconstruye la lista de cadenas.
Esto funciona, pero por cada línea que trace, la propiedad se sale del alcance, así que tengo que hacer clic en la lupa en la ventana del reloj nuevamente para ver el valor. ¿Por qué es esto?
Para reproducir, crear una nueva aplicación de consola:
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.
- Añadir relojes para "vMyObj.DebugStringList" y "vMyObj.DebugString"
- Coloque un punto de interrupción en la línea 77 (el segundo "vMyObj .Scramble ") y corre.
- Haga clic en la lupa que aparece junto al reloj "DebugStringList" para obtener el visualizador
- observar que el visualizador funciona muy bien :)
- paso sobre la línea siguiente. El visualizador ahora indica que el reloj está fuera del alcance.
- Presione la lupa de nuevo para ver el nuevo estado del objeto.
¿Por qué el visualizador dice que el reloj está fuera del alcance? ¿Cómo puedo arreglar esto?
PD: Sé que puedo escribir visualizadores de depuración, pero utilizo "DebugString" y "DebugStringList" en algunas pruebas automáticas, y realmente me gustaría utilizarlos de esta manera fácil.
Actualización: Me utilizar Delphi XE
Actualización 2: A pesar de un buen esfuerzo por Marjan Venema, todavía tengo ninguna solución a este problema. He presentado un informe con Embarcadero (QC número 98062, vote por favor :-)). Sin embargo, sospecho que tomará un tiempo para que Embarcadero solucione este problema, y viendo que todavía estoy interesado en una solución alternativa, ofreceré una pequeña recompensa. Nunca lo había intentado antes, así que será interesante ver qué sucede :-)
¿Qué versión de Delphi está utilizando aquí? –
Estoy en XE (versión 15.0.3890.34076 para ser exactos) –