7

特定の質問にまったく関係のない何億もの結果が得られるため、Google はこの種の検索には役に立ちません。

質問は単にこれです:

  • Delphi でクラス参照プロパティを使用することは可能ですか?
  • もしそうなら、どのように?

これが私が試したことです...

type

  TMyObject = class
    // ...
  end;

  TMyObjectClass = class of TMyObject

  TMyObjectA = class(TMyObject)
    // specifics here
  end;

  TMyObjectB  =class(TMyObject)
    // specifics here
  end;

  TMyComponent = class(TComponent)
  private
    FObjectType: TMyObjectClass;
  published
    property ObjectType: TMyObjectClass read FObjectType write FObjectType;
  end;

上記のコードは正常にコンパイルされますが、オブジェクト インスペクタにはObjectTypeプロパティがまったく表示されません。

ここでの私の目的 (まだ推測していない場合) は、特定の基本クラスからクラスの子孫を選択して、同じコンポーネントを別の方法で動作させることができるようにすることです。

コンポーネントがサブクラスについて直接知る必要がないように、このようにしたいと思います(完全にモジュール化する必要があります)。

このビットを明確にさせてください:コンポーネントはサブクラスの型に直接リンクできないため、Enumを使用してサブクラスの型を選択することはできません(この特定のケースでは単に不可能です)

とにかく... よろしくお願いします!

4

2 に答える 2

5

特定の基底クラスから派生したすべてのクラスを見つけることができます。Delphi: 実行時に特定の基底クラスから派生したクラスを見つけますか を使用して、これを値のリストを持つ特別なプロパティにしますTPropertyEditor

于 2012-01-28T16:32:58.903 に答える
3

これを行う場合は、プロパティエディタを提供する必要があります。IDEには、クラスタイププロパティ用のプロパティエディタは付属していません。また、.dfmの永続性を処理する必要があります。クラスタイプを文字列として.dfmファイルに書き出すことになり、.dfmファイルが読み取られるときに、参照を修正する必要があります。新しいスタイルのRTTIはそれを行うことができます。

ただし、以下の理由により、実際にはいずれも実行可能ではないと思います。デザインタイムコードはIDE内のパッケージで実行され、IDEのアクティブなプロジェクトのクラスタイプにアクセスできません。これらのクラスタイプは、そのプロジェクトの実行時にのみ存在します。したがって、ObjectType質問のコードのプロパティは、デザインタイムパッケージで意味のあるものに割り当てることはできません。VCLで定義されたクラスや、IDEにインストールされている他のパッケージに使用できますが、アクティブなプロジェクトで定義されているクラスで使用したいと思います。

これはすべて、代わりに単純な文字列プロパティを使用し、実行時にのみクラス型参照を修正する必要があることを意味すると思います。

于 2012-01-28T16:34:45.903 に答える