0

我有一个包含很多属性的组件,其中许多是类型。

例如:

BackgroundStyle = [bsSolid, bsGradient, bsNone]

BorderStyle = [bsNone, bsSingle, bsWide]

我正在构建一个表单以允许用户在运行时配置这些属性,并且我想动态填充一些下拉列表,而不必手动输入所有这些属性。

这可能吗?谢谢!

4

2 回答 2

1

为此使用 RTTI。具体来说,查看单元中的GetPropInfo()GetEnumName()函数TypInfo

于 2013-07-16T00:49:04.357 回答
0

雷米很擅长这个。最近我只是碰巧做了一些类似的事情和一些重构(在文本编辑器中,所以你的里程可能会因编译器而异):

class function TEnumerationRoutines.TitleCaseDescriptionFromOptions<T>: TStrings;
var
  LRttiContext : TRttiContext;
  LRttiEnumerationType: TRttiEnumerationType;
  LTypeInfo : Pointer;
  LPTypeInfo : PTypeInfo;
  lp: Integer;
begin
  LTypeInfo := TypeInfo(T);

  LPTypeInfo := PTypeInfo(LTypeInfo);
  if LPTypeInfo^.Kind <> tkEnumeration then
    raise Exception.Create('Type is not an enum');

  Result := TStringList.Create;

  LRttiEnumerationType := LRttiContext.GetType(LTypeInfo) as TRttiEnumerationType;

  for lp := LRttiEnumerationType.MinValue to LRttiEnumerationType.MaxValue do
    Result.Add(GetEnumName(LTypeInfo, Ord(lp)));
end;

并调用它:

MyStrings := TEnumerationRoutines.TitleCaseDescriptionFromOptions<BackgroundStyle>;

或者

MyStrings := TEnumerationRoutines.TitleCaseDescriptionFromOptions<BorderStyle>;
于 2013-07-17T08:11:07.847 回答