You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 22:05:06