我有一个包含很多属性的组件,其中许多是类型。
例如:
BackgroundStyle = [bsSolid, bsGradient, bsNone]
BorderStyle = [bsNone, bsSingle, bsWide]
我正在构建一个表单以允许用户在运行时配置这些属性,并且我想动态填充一些下拉列表,而不必手动输入所有这些属性。
这可能吗?谢谢!
我有一个包含很多属性的组件,其中许多是类型。
例如:
BackgroundStyle = [bsSolid, bsGradient, bsNone]
BorderStyle = [bsNone, bsSingle, bsWide]
我正在构建一个表单以允许用户在运行时配置这些属性,并且我想动态填充一些下拉列表,而不必手动输入所有这些属性。
这可能吗?谢谢!
为此使用 RTTI。具体来说,查看单元中的GetPropInfo()
和GetEnumName()
函数TypInfo
。
雷米很擅长这个。最近我只是碰巧做了一些类似的事情和一些重构(在文本编辑器中,所以你的里程可能会因编译器而异):
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>;