EnumToStringList函数可编译但调用报E2029错误,求排查问题
问题原因与解决方法
编译错误直接原因
你的EnumToStringList函数参数要求的是pTypeInfo类型(即类型信息指针),但调用时直接传入了枚举类型TProjectTypes,不符合参数类型要求,编译器无法识别该写法,因此抛出E2029 '(' expected but ')' found错误。
修正步骤
1. 修正调用代码
将测试代码中的调用改为:
MyProjectStrings := EnumToStringList(TypeInfo(TProjectTypes));
TypeInfo()是Delphi内置函数,用于获取指定类型的pTypeInfo指针,完全符合函数的参数要求。
2. 优化函数处理非连续枚举值(可选但推荐)
如果你的枚举存在非连续数值(比如TProjectTypes = (low=0, hot=2, skip=3)),原函数会遍历从Min到Max的所有整数,其中不存在的枚举值会返回空字符串,导致列表中出现无效条目。可以优化函数过滤掉空值:
function EnumToStringList(const TypeInfo: pTypeInfo): TStringList; var i: Integer; EnumName: string; begin Result := TStringList.Create; for i := GetTypeData(TypeInfo)^.MinValue to GetTypeData(TypeInfo)^.MaxValue do begin EnumName := GetEnumName(TypeInfo, i); if EnumName <> '' then // 过滤空名称的无效枚举值 Result.Add(EnumName); end; end;
完整修正后的代码示例
function EnumToStringList(const TypeInfo: pTypeInfo): TStringList; var i: Integer; EnumName: string; begin Result := TStringList.Create; for i := GetTypeData(TypeInfo)^.MinValue to GetTypeData(TypeInfo)^.MaxValue do begin EnumName := GetEnumName(TypeInfo, i); if EnumName <> '' then Result.Add(EnumName); end; end; function EnumToString(const TypeInfo: pTypeInfo; Ix: Integer): string; begin Result := GetEnumName(TypeInfo, Ix); end; type TProjectTypes = (low,hot,skip,pause,others); // 修正后的测试代码 MyProjectStrings := EnumToStringList(TypeInfo(TProjectTypes));
内容的提问来源于stack exchange,提问作者Franz
相关产品推荐
相关产品推荐

