我有一个包含很多属性的组件,其中很多都是类型。
例如:
BackgroundStyle = [bsSolid, bsGradient, bsNone]
BorderStyle = [bsNone, bsSingle, bsWide]
我正在构建一个表单,允许用户在运行时配置这些属性,我想动态填充一些下拉列表,而不是手动输入所有这些。
这可能吗?谢谢!
答案 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>;