在delphi中传递不同枚举类型的混合

Fra*_*den 5 arrays delphi enums

我需要编写一个可以传递不同枚举选择的过程.

type
  TEnumOne = (eOneFlagOne, eOneFlagTwo);
  TEnumTwo = (eTwoFlagOne, eTwoFlagTwo);
Run Code Online (Sandbox Code Playgroud)

该方法应采用不同的枚举:

Process([eOneFlagOne, eTwoFlagTwo]);
Run Code Online (Sandbox Code Playgroud)

我试图像这样实现它:

// does not work!
procedure Process(const Enums: array of Variant);
var aValue; Variant
begin
  for aValue in Enums do
  begin
    // of course, can't work...
    if aValue is TEnumOne then
  end; 
end;
Run Code Online (Sandbox Code Playgroud)

那么,有没有一种类型而不是Variant,我可以选择吗?或者是一种不同的方法,我不明白吗?

Wou*_*ick 10

满足帕斯卡的美丽.

以下是您可能尝试执行的操作示例:

program Project34; {$APPTYPE CONSOLE}

type
  TEnum=(eOneFlagOne,eOneFlagTwo,eTwoFlagOne,eTwoFlagTwo);
  TEnumSet=set of TEnum;

const
  cEnumOne=[eOneFlagOne,eOneFlagTwo];
  cEnumTwo=[eTwoFlagOne,eTwoFlagTwo];

procedure Process(const Enums: TEnumSEt);
var e:TEnum;
begin
  for e in Enums do
    WriteLn(ord(e));
end;

begin
  Process([eOneFlagOne, eTwoFlagTwo]);
  Process(cEnumOne);
  Process(cEnumTwo);
end.
Run Code Online (Sandbox Code Playgroud)

请注意,您也可以声明这样的常量.也许这更清楚:

const
  cEnumOne:TEnumSet=[eOneFlagOne,eOneFlagTwo];
  cEnumTwo:TEnumSet=[eTwoFlagOne,eTwoFlagTwo];
Run Code Online (Sandbox Code Playgroud)


Tim*_*vis 4

坦率地说,当你开始尝试这样改变你的语言时,通常意味着你的方法可能是错误的。(并不总是,但通常)我很想听听您想要解决什么问题,因为也许有更好的设计选择。

由于我们对您的问题知之甚少,我建议您创建两个具有不同签名的函数。
或者,
如果所需的逻辑分支彼此足够相似,那么您可以使用枚举类型作为通用参数来创建通用方法(假设是 Delphi 2009 或更高版本)。

...
procedure Process<T>(const enumParam : T) // Add a generic constraint here as well
begin
...
end;
Run Code Online (Sandbox Code Playgroud)

然而,在我看来,两种不同的方法可能是最好的选择(或者完全是其他的方法)