2

总结:
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.
4

2 回答 2

6

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

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

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

于 2011-03-13T02:12:26.507 回答
1

有允许您自定义调试器的可视化功能的调试器可视化工具我从未使用过它们,但据我了解,您可以将它们与一些 RTTI 结合起来并提供有关TObject实例的更丰富的信息。

但是,在这里使用泛型是您想要的。它提供了具有明显优势的编译时类型。我只是那样做。

于 2011-03-13T12:59:49.790 回答