3

クラスから定数(const)を列挙できますか?

私が試してみました

MyClass = class
const
  c1 = 'c1';
  c2 = 'c2';
  c3 = 'c3';
end;

procedure GetConst();
var
  ctx: TRttiContext;
  objType: TRttiType;
  field: trttifield;
  s: string;
begin
  ctx := TRttiContext.Create;
  objType := ctx.GetType(MyClass.ClassInfo);
  for field in objType.GetDeclaredFields do
    s:= field.Name;
end;

c1、c2、c2 を取得したいと思います。

これは可能ですか?

編集:私がやりたいことは、いくつかの外部シンボルのいくつかのキーを定義することです(CADプログラムの場合)

symbol1=class
    const
    datafield1='datafield1';
    datafield2='datafield2';
end;
symbol2=class
    const
    datafield21='datafield21abc';
    datafield22='datafield22abc';
end

宣言と初期化を分離したくないので、これにフィールドを使用するのは好きではありません。値を文字列として定義できないため、列挙型を使用できません。

4

3 に答える 3

5

RTTI を介してこれらの定数を取得することはできません。あなたの最善の解決策は、代わりに属性を使用することだと思います。それは実際に機能するという利点があるだけでなく、問題に対するよりクリーンでシンプルなソリューションのように思えます.

于 2012-09-21T14:55:18.380 に答える
4

列挙型を使用する場合はTypInfo、コード内で文字列を列挙型の値に変換し、列挙型の値を文字列に変換するために使用できます。

type
  TDataFieldName = (datafield1, datafield2, datafield3);

uses TypInfo;

var df: TDataFieldName;
begin
  df := TDataFieldName(GetEnumValue(TypeInfo(TDataFieldName), 'datafield1'));

  ShowMessage(GetEnumName(TypeInfo(TDataFieldName), Ord(df)));

  case df of
    datafield1:;
    datafield2:;
    datafield3:;
  end;
end;

(私の頭からタイプされた - これをテストしていない...)

このようにして、cad プログラムは文字列を Delphi アプリに渡すことができ、それらを列挙型に変換したり、列挙型を文字列に変換して cad プログラムに渡すことができます。case元の値が文字列で、列挙型に変換されたステートメントを実行するのも簡単です。stringDelphi はcase ステートメントをサポートしていないため、これは非常に便利です。

于 2012-09-21T15:47:56.807 に答える
0

クラスでフィールドを使用することにしました。宣言と初期化のためにフィールドを複製したくないので、rtti を使用してフィールドをフィールドの値に初期化しています。

利点は次のとおりです。実行時の rtti オーバーヘッドがありません。rtti は、アプリの起動時にのみ実行されます。また、プロジェクトに非常に役立つ継承を使用できるようになりました。

于 2012-09-22T20:54:49.363 に答える