2

要約:
1. LachlanG と Ken が指摘したように、デバッグ時の手動型キャスト。
2. Delphi 2010 以降に導入されたデバッガ ビジュアライザの概念を利用します。
3. 対応するジェネリックに切り替えます。

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

たとえば、次のコードを見てください。

TestRegularの最後と の最後にそれぞれブレークポイントが設定されている場合TestGenerics、デバッグ インスペクターを介して一般的なリストの項目 (および項目の内容も) を確認できますが、マウスを変数の上に置いたときの通常の 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

マウスカーソルのホバーヒントに表示されるものを改善できるとは思いません。

ただし、ソース コード内と同じように、デバッグ ウィンドウ内でも型キャストを使用できます。

たとえば、評価ウィンドウ内から tmp 変数を TObjectList(tmp) に型キャストする (Ctrl F7) か、型キャストされた変数でウォッチを作成する (Ctrl F5) ことができます。

于 2011-03-13T02:12:26.507 に答える
1

デバッガーの視覚化機能をカスタマイズできるデバッガー ビジュアライザーがあります。私はそれらを使用したことはありませんが、それらをいくつかの RTTI と組み合わせて、TObjectインスタンスに関するより豊富な情報を提供できることを理解しています。

ただし、ここで必要なのはジェネリックを使用することです。これにより、コンパイル時のタイピングが可能になり、明らかな利点があります。私は単にそのようにします。

于 2011-03-13T12:59:49.790 に答える