【问题标题】:Delphi Function to convert enum to string list....?Delphi函数将枚举转换为字符串列表......?
【发布时间】:2021-01-02 04:06:46
【问题描述】:

我想要一个接受枚举并返回字符串列表(或名称:值对)的函数。必须有可能,Object Inspector 和 Code Complete 似乎可以做到这一点。伪代码看起来很简单,但细节让我无法理解......

function ParseEnum(e: Enum, S: TStringList): TStringList;
var
  i: Integer;
begin
  for i := 0 to length(enum) - 1 do
    S.Add(GetEnumName(e, i));
  Result := S;
end;

【问题讨论】:

  • stackoverflow.com/q/31601707/62576 应该给你一个开始的地方。您的伪代码中已经存在一些问题。首先,您不能创建tStrings 的实例,因为它是一种抽象类型。您必须使用其后代之一,例如TStringList。其次,没有任何版本的TStrings.Add 可以接受您使用过的两个参数。第三,GetEnumName 需要一个值,将名称作为参数返回。此外,让函数返回它创建的对象也是一个坏主意,因为不清楚谁管理内存。将字符串列表传递给函数。
  • 另外,length(enum) 必须是 length(enum) - 1
  • 是的,我看到我的伪代码没有很好地定义。更新中……

标签: function delphi enums


【解决方案1】:

如果这是一个常见的功能(所有枚举):
如果 Enum 是Continuity,如下代码就OK(by rt​​ti)
如果不是连续性,我现在找不到方法

type
TMyEnum = (s, b, c, d, e, f);


implementation
uses
  System.Rtti, TypInfo;

procedure ParseEnum<T>(sl: TStrings);
var
  rt: TRttiType;
  rot: TRttiOrdinalType;
  i: Integer;
begin
  rt := TRttiContext.Create.GetType(TypeInfo(T));
  rot := rt.AsOrdinal;
  for i := rot.MinValue to rot.MaxValue do
    sl.Add(GetEnumName(TypeInfo(T), i));
end;

procedure TForm1.btn1Click(Sender: TObject);
var
  sl: TStringList;
begin
  sl := TStringList.Create;
  try
    ParseEnum<TMyEnum>(sl);
    ShowMessage(sl.Text);
  finally
    sl.Free;
  end;
end;


为什么将 sl 作为参数但结果:注意人们不要忘记释放

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-07-05
    • 2010-10-03
    • 1970-01-01
    • 2015-06-22
    • 1970-01-01
    • 2014-03-18
    • 2015-06-10
    相关资源
    最近更新 更多