如何将属性列表转换为字符串列表?

时间:2013-07-15 11:50:08

标签: delphi type-conversion delphi-xe2 tstringlist

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

例如:

BackgroundStyle = [bsSolid, bsGradient, bsNone]

BorderStyle = [bsNone, bsSingle, bsWide]

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

这可能吗?谢谢!

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分: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>;