Prima di tutto, mi dispiace per il lungo esempio di codice, ma credo che sia necessario per illustrare il mio problema.Perché alcune proprietà escono dall'ambito dell'elenco di controllo, mentre altre no?
Come aiuto per il debug, spesso introduco un metodo "DebugString" sui miei oggetti, che restituisce un sommario conciso dell'oggetto. Ma a volte i miei oggetti sono troppo complessi per essere rappresentati in modo ottimale in una singola stringa, quindi uso stringlist. Ora, vorrei usare gli eccellenti visualizzatori di debug in Delphi per monitorare il mio oggetto. Il modo in cui lo faccio è di introdurre una proprietà con un getter che ricostruisce la lista di stringhe.
Questo tipo funziona, ma per ogni linea di cui faccio traccia, la proprietà diventa fuori portata, quindi devo fare di nuovo clic sulla lente di ingrandimento nella finestra di controllo per visualizzare il valore. Perchè è questo?
Per riprodurre, creare una nuova applicazione console:
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.
- Aggiungi orologi per "vMyObj.DebugStringList" e "vMyObj.DebugString"
- Posizionare un punto di interruzione sulla linea 77 (il 2 ° "vMyObj .Scramble "), ed eseguire.
- Fare clic sulla lente d'ingrandimento accanto all'orologio "DebugStringList" per ottenere il visualizzatore
- osservano che il visualizzatore funziona bene :)
- Passo sopra la riga successiva. Il visualizzatore ora indica che l'orologio è fuori portata.
- Premere nuovamente la lente di ingrandimento per visualizzare il nuovo stato dell'oggetto.
Perché il visualizzatore dice che l'orologio è fuori portata? Come posso risolvere questo?
PS: So che posso scrivere visualizzatori di debug, ma uso "DebugString" e "DebugStringList" in alcuni test automatici, e mi piacerebbe davvero usarli in questo modo facile.
Aggiornamento: Io uso Delphi XE
Aggiornamento 2: Nonostante un buon sforzo da Marjan Venema, ho ancora alcuna soluzione a questo problema. Ho presentato un rapporto con Embarcadero (numero QC 98062, per favore, vota :-)). Tuttavia, sospetto che ci vorrà del tempo perché Embarcadero risolva questo problema, e vedendo come sono ancora interessato a una soluzione alternativa, offrirò una piccola taglia. Non l'ho mai provato prima, quindi sarà interessante vedere cosa succede :-)
Quale versione di Delphi stai usando qui? –
Sono su XE (versione 15.0.3890.34076 per l'esattezza) –