Как проверить содержимое неуниверсального TObjectList при отладке?
Суммирование:
1. Ручная настройка типов при отладке, как указали LachlanG и Ken.
2. Используйте концепцию визуализатора отладчика, появившуюся в Delphi 2010.
3. Переключитесь на аналоги дженериков.
=========================================
Возьмите следующий код для примера:
Если точки останова установлены в конце TestRegular
и в конце TestGenerics
соответственно, элементы общего списка (и даже содержимое элементов) можно увидеть через инспектор отладки, но ничего не значащего (даже счетчика) для обычного списка объектов, когда наведите указатель мыши на tmp
переменная. Мне интересно, есть ли какой-нибудь способ для достижения аналогичной функциональности времени отладки для обычного списка объектов?
unit Unit2;
interface
uses
Contnrs, Generics.Collections,
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;
type
TMyItem = class;
TMyItemList = class;
TForm2 = class;
TMyItem = class
private
fname: string;
public
property name: string read fname;
constructor Create(aName: string);
end;
TMyItemList = class(TObjectList)
protected
procedure SetObject (Index: Integer; Item: TMyItem);
function GetObject (Index: Integer): TMyItem;
public
function Add (Obj: TMyItem): Integer;
procedure Insert (Index: Integer; Obj: TMyItem);
property Objects [Index: Integer]: TMyItem
read GetObject write SetObject; default;
end;
TForm2 = class(TForm)
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
procedure TestRegular;
procedure TestGenerics;
public
{ Public declarations }
end;
var
Form2: TForm2;
implementation
{$R *.dfm}
{ TMyItem }
constructor TMyItem.Create(aName: string);
begin
fname := aName;
end;
{ TMyItemList }
function TMyItemList.Add(Obj: TMyItem): Integer;
begin
Result := inherited Add (Obj);
end;
procedure TMyItemList.SetObject(Index: Integer; Item: TMyItem);
begin
inherited SetItem (Index, Item);
end;
function TMyItemList.GetObject(Index: Integer): TMyItem;
begin
Result := inherited GetItem (Index) as TMyItem;
end;
procedure TMyItemList.Insert(Index: Integer; Obj: TMyItem);
begin
inherited Insert(Index, Obj);
end;
{TForm2}
procedure TForm2.FormCreate(Sender: TObject);
begin
TestGenerics;
TestRegular;
end;
procedure TForm2.TestRegular;
var
tmp: TMyItemList;
begin
tmp := TMyItemList.Create;
tmp.Add(TMyItem.Create('1'));
tmp.Add(TMyItem.Create('2'));
tmp.Free;
end;
procedure TForm2.TestGenerics;
var
tmp: TObjectList<TMyItem>;
begin
tmp := TObjectList<TMyItem>.Create;
tmp.Add(TMyItem.Create('1'));
tmp.Add(TMyItem.Create('2'));
tmp.Free;
end;
end.
2 ответа
Я не думаю, что вы сможете улучшить то, что появляется в подсказке при наведении курсора мыши.
Однако вы можете использовать типы типов в окнах отладки так же, как в исходном коде.
Например, вы можете типизировать переменную tmp в TObjectList(tmp) из окна оценки (Ctrl F7) или создать Watch (Ctrl F5) для переменной typecasted.
Существуют визуализаторы отладчика, которые позволяют настраивать возможности визуализации отладчика. Я никогда не использовал их, но, насколько я понимаю, вы можете объединить их с некоторыми RTTI и дать более подробную информацию о TObject
пример.
Тем не менее, здесь вы можете использовать дженерики. Это дает время компиляции, которое имеет явные преимущества. Я бы просто так сделал.