Как проверить содержимое неуниверсального TObjectList при отладке? - PullRequest
2 голосов
/ 13 марта 2011

Суммирование:
1. Ручная настройка типа при отладке, как указали LachlanG и Кен.
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 ]

6 голосов
/ 13 марта 2011

Не думаю, что вы сможете улучшить то, что отображается в подсказке при наведении курсора мыши.

Однако вы можете использовать типы типов внутри окон отладки так же, как и в исходном коде.

Например, вы можете типизировать переменную tmp в TObjectList (tmp) из окна оценки (Ctrl F7) или создать Watch (Ctrl F5) для переменной typecasted.

1 голос
/ 13 марта 2011

Существует визуализаторы отладчика , которые позволяют настраивать возможности визуализации отладчика. Я никогда не использовал их, но, насколько я понимаю, вы можете объединить их с некоторыми RTTI и предоставить более подробную информацию об экземпляре TObject.

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

...