Trước hết, xin lỗi cho ví dụ mã dài dòng, nhưng tôi tin rằng nó là cần thiết để minh họa cho vấn đề của tôi.Tại sao một số thuộc tính nằm ngoài phạm vi trong danh sách theo dõi, trong khi một số thuộc tính khác thì không?
Là trợ giúp gỡ lỗi, tôi thường giới thiệu phương pháp "DebugString" trên đối tượng của tôi, trả về một tóm tắt đối tượng súc tích. Nhưng đôi khi các đối tượng của tôi quá phức tạp để được biểu diễn tối ưu trong một chuỗi, vì vậy tôi sử dụng các chuỗi danh sách. Bây giờ, tôi muốn sử dụng các visualizers debug tuyệt vời trong Delphi để theo dõi đối tượng của tôi. Cách tôi làm điều này là để giới thiệu một tài sản với một getter mà xây dựng lại danh sách chuỗi.
Loại này hoạt động, nhưng đối với mỗi dòng tôi theo dõi, thuộc tính vượt quá phạm vi, vì vậy tôi phải nhấp lại vào kính lúp trong cửa sổ xem để xem giá trị. Tại sao điều này?
Để tái sản xuất, tạo ra một giao diện điều khiển ứng dụng mới:
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.
- Thêm đồng hồ cho "vMyObj.DebugStringList" và "vMyObj.DebugString"
- Đặt một breakpoint trên dòng 77 (thứ 2 "vMyObj .Scramble ") và chạy.
- Nhấn vào biểu tượng kính lúp bên cạnh "DebugStringList" đồng hồ để có được những visualizer
- Quan sát rằng visualizer hoạt động độc đáo :)
- Bước trên dòng tiếp theo. Trình hiển thị trực quan hiện cho biết đồng hồ nằm ngoài phạm vi.
- Nhấn lại kính lúp để xem trạng thái mới của đối tượng.
Tại sao trình hiển thị cho biết đồng hồ nằm ngoài phạm vi? Làm thế nào tôi có thể sửa lỗi này?
PS: Tôi biết tôi có thể viết trình hiển thị gỡ lỗi, nhưng tôi sử dụng "DebugString" và "DebugStringList" trong một số thử nghiệm tự động và tôi thực sự muốn sử dụng chúng theo cách dễ dàng này.
Cập nhật: Tôi sử dụng Delphi XE
Cập nhật 2: Mặc dù một nỗ lực tốt bằng cách Marjan Venema, tôi vẫn không có giải pháp cho vấn đề này. Tôi đã gửi báo cáo với Embarcadero (số QC 98062, vui lòng bỏ phiếu :-)). Tuy nhiên, tôi nghi ngờ nó sẽ mất một thời gian cho Embarcadero khắc phục vấn đề này, và nhìn thấy làm thế nào tôi vẫn còn quan tâm đến một workaround, tôi sẽ cung cấp một tiền thưởng nhỏ. Không bao giờ thử điều đó trước đây, vì vậy sẽ rất thú vị nếu bạn muốn điều gì xảy ra :-)
Bạn đang sử dụng phiên bản Delphi nào ở đây? –
Tôi đang trên XE (phiên bản 15.0.3890.34076 chính xác) –