delphi - 调试时如何检查非泛型TObjectList的内容?

标签 delphi debugging generics inspector tobjectlist

总结:
1. 调试时手动类型转换,正如 LachlanG 和 Ken 指出的那样。
2. 利用自 Delphi 2010 以来引入的 Debugger Visualizers 概念。
3. 改用泛型。

=========================================

以下面的代码为例:

如果分别在 TestRegularTestGenerics 的末尾设置断点,则可以看到通用列表的项目(甚至是内容项目)通过调试检查器,但对于常规的 tobjectlist 没有任何意义(甚至不是计数),当将鼠标悬停在 tmp 变量上时。我想知道是否有某种方法可以为常规 tobjectlist 实现类似的调试时功能?

    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.

最佳答案

我认为您无法改进鼠标光标悬停提示中出现的内容。

但是,您可以像在源代码中一样在调试窗口中使用类型转换。

例如,您可以在评估窗口 (Ctrl F7) 中将 tmp 变量类型转换为 TObjectList(tmp) 或在类型转换的变量上创建一个监视 (Ctrl F5)。

关于delphi - 调试时如何检查非泛型TObjectList的内容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5286617/

相关文章:

delphi - "I/O error 1785"是什么?

delphi - 调试设计时包时启动 Delphi 时出错

ios - 创建一个通用函数,该函数接受 View Controller 类型作为参数,并根据该类型返回自定义 View Controller

delphi - 如何在Delphi中向另一个exe添加版本信息?

delphi - 如何正确让界面支持迭代?

iphone - 如果在越狱的iPhone OS 2.2.1(libgcc版本?)上调试,iPhone应用程序将崩溃。

swift - 崩溃线是App Delegate时如何断点调试?

debugging - 如何告诉 Mathematica 在出现调试错误时退出

c# - 在使用泛型继承类中实现加法

java - 是否可以使泛型方法签名实现泛型+接口(interface)?