4

アイデアは単純です-使用するTComponentにクラス名を持つTDictionaryを作成します

for enum in vm.ClassNameToComponent do
 TLuaClassTemplate<enum.Value>.RegisterClass(vm.LS, PrintGlobal, container, vm);

代わりに列挙型を使用

TLuaClassTemplate<TButton>.RegisterClass(vm.LS, PrintGlobal, container, vm);
TLuaClassTemplate<TPanel>.RegisterClass(vm.LS, PrintGlobal, container, vm);
TLuaClassTemplate<TEdit>.RegisterClass(vm.LS, PrintGlobal, container, vm);
...

xmlから取得したクラス名を使用して、汎用ベースのクラスを操作します。
しかし、問題があります:

TClassNameToComponentDict = TDictionary<string, TComponent>;
...
ClassNameToComponent: TClassNameToComponentDict;
...
  ClassNameToComponent := TClassNameToComponentDict.Create;
  ClassNameToComponent.Add('TButton', TButton);
  ClassNameToComponent.Add('TPanel', TPanel);
  ClassNameToComponent.Add('TEdit', TEdit);
...

エラー「互換性のないタイプ'TComponent'および'TButtonのクラス'」。
TButtonなどの「クラス」を総称値として使用するにはどうすればよいですか?

4

1 に答える 1

5

使用したタイプ

TDictionary<string, TComponent>

文字列からクラスのインスタンスへのマッピングを表します。ただし、文字列からクラスへのマッピングが必要です。だからあなたは必要です:

TDictionary<string, TComponentClass>

どこ

TComponentClass = class of TComponent

ユニットTComponentClassですでに宣言されているため、宣言する必要はありません。Classes

于 2013-03-24T15:34:09.083 に答える