Как проверить содержимое неуниверсального 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 пример.

Тем не менее, здесь вы можете использовать дженерики. Это дает время компиляции, которое имеет явные преимущества. Я бы просто так сделал.

Другие вопросы по тегам