Delphi枚举集

Delphi Set of Enumeration

我正在尝试过滤我的日志记录。如果选项中有日志(或消息)类型,我想将其发送到日志,否则退出。

编译在“if not MessageType in...”行上失败:

"[dcc32 Error] uMain.pas(2424): E2015 Operator not applicable to this operand type"

我认为它一定是可能的(并且相当简单)基于 Include/Exclude 函数,我试着查看但找不到任何地方(即 Include(MySet, llInfo); )。

我的声明如下:

type
  TLogLevel = (llDebug, llError, llWarn, llInfo, llException);
  TLogOptions = set of TLogLevel;

var
  FLogOptions: TLogOptions; 

procedure TfrmMain.Log(const s: String; MessageType: TLogLevel;
  DebugLevel: Integer; Filter: Boolean = True);
begin


  if not MessageType in FLogOptions then
    exit;

  mmoLog.Lines.Add(s);
end;

由于运算符的优先级,您需要在集合运算两边加上括号。编译器将其解析为 if not MessageType,这不是有效操作。如果您在 set 测试两边加上括号,编译器可以正确解析它。

if not (MessageType in FLogOptions) then

这是一个常见问题,并不特定于集合类型。例如,您也可以使用以下 express 得到相同的错误。

if not 1 = 2 and 2 = 3 then

在两个相等性测试周围添加括号将更正错误。

if not (1 = 2) and (2 = 3) then

有关详细信息,您可以查看 Operator Precedence

的文档